define(function(require) { var $ = require("jquery"); var justep = require('$UI/system/lib/justep'); var Data = require("$UI/system/components/justep/data/data"); var url = require.normalizeName("./commonExtendTypes"); var ComponentConfig = require("./commonExtendTypes.config"); var RegConfig = require("./commonExtendTypes.reg"); var CommonExtendTypes = justep.ViewComponent.extend({ getConfig : function() { return ComponentConfig; }, getRegConfig : function() { return RegConfig; }, constructor : function(options) { this.callParent(options); }, init : function(value, bindingContext) { this.callParent(value, bindingContext); var model = this.getModel(); var regConfig = this.getRegConfig(); if(regConfig && $.isArray(regConfig)) $.each(regConfig,function(i,v){ Data.registerExtendType(model, v); }); }, dispose : function() { var model = this.getModel(); var regConfig = this.getRegConfig(); if(regConfig && $.isArray(regConfig)) $.each(regConfig,function(i,v){ Data.unregisterExtendType(model,v.name); }); this.callParent(); }, }); justep.Component.register(url, CommonExtendTypes); return CommonExtendTypes; });
define(function(require) { var $ = require("jquery"); var justep = require('$UI/system/lib/justep'); var RTDataTables = require("../dataTables"); var xuiService = require("$UI/system/components/designerCommon/js/xuiService"); var xuiDoc = xuiService.getXuiDoc(); var DataTables = RTDataTables.extend({ constructor : function(config) { this.callParent(config); }, init : function(value, bindingContext) { var $domNode = $(this.domNode); this.data = $domNode.attr('data'); $domNode.html('请设置DataTables的data属性然后增加DataTables列').attr('d_resizable',false); var self = this; window.setTimeout(function(){ self.repaintDataTableds(); },100); $domNode.on("childUndoRedo",function(){//撤销重做时重画 if(self.repaintTimer){ clearTimeout(self.repaintTimer); } self.repaintTimer = setTimeout(function(){ self.repaintTimer = null; self.repaintDataTableds(); },150); }); }, set: function(value){ this.callParent(value); this.repaintDataTableds(); }, appendColumn: function(config) { var self = this; //获取data的did var dataID = this.get('data'); var data = this.getModel().comp(dataID); if(!data){ alert('请先设置DataTables的data属性'); return; } var data_did = data.$domNode.attr('d_id'); // 获取data列信息 var cols = xuiDoc.getEditorDataSource("RuleRelationDatasource.getDatasource",null,data_did); //打开编辑器 xuiService.openPage("$UI/system/components/justep/dataTables/designer/appendColumn.w", { xml : config.nodeXml, cols : cols }, function(result) { var cols = result.cols; if($.isArray(cols)){ var configs = []; for(var i=0;i<cols.length;i++){ configs.push({ componentName : "$UI/system/components/justep/dataTables/dataTables#column", parentElementId : self.columns_dId, templateContent : '<column name="'+cols[i]+'"/>' }); } //批量创建列 xuiDoc.batchCreateComponent(configs, function() { self.repaintDataTableds(); }); } }); }, repaintDataTableds : function(){ if(this.isRepainting){ return; } var dataID = this.get('data'); var data = this.getModel().comp(dataID); if(!data){ this.$domNode.html('请设置dataTables的data属性然后增加dataTables列'); return; } this.isRepainting = true; var xuiNode = xuiDoc.getNodeByDId(this.$domNode.attr('d_id')); var self = this; //var url = "http://127.0.0.1:8080/x5/UI2/system/components/justep/grid/server/transCfg.j"; var url = require.toUrl("$UI/system/components/justep/dataTables/server/transDataTablesCfg.j"); $.ajax({ async : false, dataType:'json', data: {"define": xuiNode}, type : 'POST', url : url, success : function(cfg) { self.createDataTables(cfg,xuiNode); self.isRepainting = false; self.ownerDesigner.setSelection(self.$domNode[0]); }, error : function(xhr,status,err) { alert("转换DataTables的定义失败:"+[status,xhr.readyState,err]); self.isRepainting = false; } }); }, createDataTables: function(cfg,xuiNode){ this.cfg = cfg; if(!this.cfg.columns||this.cfg.columns.length<1) this.cfg.columns = [{ "title": '请添加列' }]; //记录原选中组件did var dIds = this.ownerDesigner.getSelectionIds(); if(this.__dataTables) this.__dataTables.dispose(); this.$domNode.empty(); cfg.parentNode = this.domNode; //创建展现的dataTables cfg.data = null; cfg['class'] = this.$domNode.attr('class'); cfg['style'] = this.$domNode.attr('style'); this.__dataTables = new RTDataTables(cfg); //分许定义的结构绑定did var cols = cfg.columns; for(var i=0; i<cols.length; i++){ //设置设计时的相关属性 this.__dataTables.$domNode.find('thead tr th:eq('+i+')').attr({"d_id":cols[i]["d_id"],"d_selectable":cols[i]["d_selectable"],"componentName":cols[i]["componentName"]}) .prop("colDef",cols[i]); } //bing列头的did var $tr = $(xuiNode).find('columns'); this.columns_dId = $tr.attr("d_id"); this.$domNode.find('thead tr').attr({"d_id":$tr.attr("d_id"),"d_selectable":false,"componentName":$tr.attr("componentName")}); //绑定列组件 this.ownerDesigner.paintChildComponent(this.domNode); //选中原选中组件 dIds = eval(dIds); if(dIds && dIds.length>0) this.ownerDesigner.setSelectionByIds({ids:dIds}); } }); var Column = justep.ViewComponent.extend({ constructor : function(config) { this.callParent(config); }, init : function(value, bindingContext) { }, getOwner: function(){ var gel = this.$domNode.closest("div[componentName='$UI/system/components/justep/dataTables/dataTables']")[0]; return this.getModel().comp(gel); }, set: function(value){ var owner = this.getOwner(); if(owner){ if(value && value.hasOwnProperty("width")){ var w = value['width']; var colDef = this.$domNode.prop("colDef"); owner.__grid.setColWidth(colDef['name'],w); }else owner.repaintDataTables(); } } }); return { '$UI/system/components/justep/dataTables/dataTables' : DataTables, '$UI/system/components/justep/dataTables/dataTables#column' : Column }; });
define(function(require) { var $ = require("jquery"); var justep = require('$UI/system/lib/justep'); var Data = require("$UI/system/components/justep/data/data"); // 引入jqx grid require('css!./css/base').load(); require("./js/grid-base"); var url = require.normalizeName("./grid"); var Grid = justep.ViewComponent.extend({ // 构造函数 constructor : function(options) { this.callParent(options); }, // 动态创建组件 /* * config:{ dataXID:dataXID, autoheight: true, sortable: true, editable: * true, selectionmode: 'singlecell', width: 1050, height: 600, columns: [ { * text: 'Name', dataField: 'name', width: 200 }, { text: 'Sales', * dataField: 'sales', width: 200, cellsalign: 'right' }, { text: * 'Price', dataField: 'price', width: 200, cellsformat: 'c2', * cellsalign: 'right' }, { text: 'string1', dataField: 'string1', * width: 100, cellsformat: 'c2', cellsalign: 'right' }, { text: * 'string2', dataField: 'string2', width: 100, cellsformat: 'c2', * cellsalign: 'right' }, { text: 'string3', dataField: 'string3', * width: 100, cellsformat: 'c2', cellsalign: 'right' }, { text: * 'string4', dataField: 'string4', width: 100, cellsformat: 'c2', * cellsalign: 'right' } ] } */ buildTemplate : function(config) { if (config) { var parentNode = config['parentNode']; delete config['parentNode']; var sCfg = justep.Bind.utils.stringifyJson(config); config['parentNode'] = parentNode; return "<div component='" + url + "' config='" + sCfg + "'/>"; } }, // 初始化 init : function(value, bindingContext) { this.callParent(value, bindingContext); var $e = $(this.domNode); var sCfg = $e.attr('config'); if (sCfg) { var cfg = $.parseJSON(sCfg); if (cfg) { // 提供事件cell var bindEvent = function(colDef, field, self) { colDef['createeditor'] = function(row, value, editor) { self.fireEvent('onCreateEditor_' + field, { source : self, config : colDef, row : row, value : value, editor : editor }); }; colDef['cellvaluechanging'] = function(row, column, columntype, oldvalue, newvalue) { var evt = { source : self, config : colDef, row : row, column : column, type : columntype, oldValue : oldvalue, newValue : newvalue }; self.fireEvent('onCellValueChanging_' + field, evt); return evt.newvalue; }; }; for ( var i = 0; i < cfg.columns.length; i++) { var colDef = cfg.columns[i], field = colDef.dataField; bindEvent(colDef, field, this);// 特殊实现,为了在循环中传递数据 } this.fireEvent('onCreate', { source : this, config : cfg }); // 创建数据源 var dataXID = cfg.dataXID; var data = Data.$(this.getModel(), dataXID); if (!data) {// grid bind的data不存在 var msg = new justep.Message(justep.Message.JUSTEP230062, dataXID); throw justep.Error.create(msg); } delete cfg['dataXID']; cfg.source = new $.jqx.dataAdapter({ localdata : data.datas, datatype : 'observablearray' }); // 创建grid组件 $e.jqxGrid(cfg); var widget = $.data(this.domNode)["jqxGrid"].instance, crow = data.getCurrentRow(true); // 设置初始的选中行 widget.host.jqxGrid('selectrow', data.datas.indexOf(crow)); // 感知data的当前行变化 data.currentRow.subscribe(function(row) { if (!widget['data-updating']) widget.host.jqxGrid('selectrow', data.datas.indexOf(row)); }); // bind grid的行变化事件改变data当前行 $(this.domNode).on('rowselect', function(event) { if (!widget['data-updating']) { widget['data-updating'] = true; try { var evt = event.args; var crow = data.getCurrentRow(true), irow = data.datas.get()[evt.rowindex]; if (crow !== irow) { data.to(irow); crow = data.getCurrentRow(true); if (crow !== irow)// 如果data阻止变化重新回到原index widget.host.jqxGrid('selectrow', data.datas.indexOf(crow)); } } finally { widget['data-updating'] = false; } } }); // 感知data的只读 data.readonly.subscribe(function(readonly) { widget.host.jqxGrid({ disabled : readonly }); }); var cellbeginedit = function(rowindex, datafield, columntype, value) { if (data.getReadonly(datafield, data.datas.get()[rowindex])) return false; }; for (i = 0; i < cfg.columns.length; i++) { widget.host.jqxGrid('setcolumnproperty', cfg.columns[i].dataField, 'cellbeginedit', cellbeginedit); } // 事件bind... } } }, // 更新 update : function(value, bindingContext) { }, getGrid : function() { return $.data(this.domNode)["jqxGrid"].instance; } }); justep.Component.register(url, Grid); return Grid; });
define(function(require) { require("$UI/system/components/justep/common/res"); //require("css!./css/jquery.dataTables").load(); require("css!./css/dataTables.bootstrap").load(); require("css!./css/dataTables.responsive").load(); var $ = require("jquery"); var justep = require('$UI/system/lib/justep'); var Data = require("$UI/system/components/justep/data/data"); // 引入jqQrid require("./js/jquery.dataTables"); require("./js/dataTables.bootstrap"); require("./js/dataTables.responsive"); var url = require.normalizeName("./dataTables"); var ComponentConfig = require("./dataTables.config"); var language = { "oPaginate": { /* * 默认值为First * 当使用全数字类型的分页组件的时候,到第一页按钮上的文字 */ "sFirst": '<<',//justep.Message.getMessage(justep.Message.JUSTEP231550),//"第一页", /* * 默认值为Last * 当使用全数字类型的分页组件的时候,到最后一页按钮上的文字 */ "sLast": '>>',//justep.Message.getMessage(justep.Message.JUSTEP231551),//"最后页", /* * 默认值为Next * 当使用全数字类型的分页组件的时候,到下一页按钮上的文字 */ "sNext": '>',//justep.Message.getMessage(justep.Message.JUSTEP231552),//"下一页", /* * 默认值为Previous * 当使用全数字类型的分页组件的时候,到前一页按钮上的文字 */ "sPrevious": '<',//justep.Message.getMessage(justep.Message.JUSTEP231553),//"前一页" }, /* * 默认值activate to sort column ascending为 * 当表格中没有数据(无视因为过滤导致的没有数据)时,该字符串年优先与sZeroRecords显示 * 注意这是个可选参数,如果没有指定,sZeroRecrods会被使用(既不是默认值也不是给定的值) */ "sEmptyTable": justep.Message.getMessage(justep.Message.JUSTEP231554),//"没有数据", /* * 默认值为Showing _START_ to _END_ of _TOTAL_ entries * 该属性给终端用户提供当前页面的展示信息,字符串中的变量会随着表格的更新被动态替换,而且可以被任意移动和删除 */ "sInfo": justep.Message.getMessage(justep.Message.JUSTEP231555),//"当前显示_START_-_END_条,共_TOTAL_条", /* * 默认值为Showing 0 to 0 of 0 entries * 当表格中没有数据时展示的表格信息,通常情况下格式会符合sInfo的格式 */ "sInfoEmpty": '',//justep.Message.getMessage(justep.Message.JUSTEP231556),//"没有数据", /* * 默认值为(filtered from _MAX_ total entries) * 当用户过滤表格中的信息的时候,该字符串会被附加到信息字符串的后面,从而给出过滤器强度的直观概念 */ "sInfoFiltered": "", /* * 默认值为空字符串 * 使用该属性可以很方便的向表格信息字符串中添加额外的信息,被添加的信息在任何时候都会被附加到表格信息组件的后面 * sInfoEmpty和sInfoFiltered可以以任何被使用的方式进行结合 */ "sInfoPostFix": "", /* * 默认值为',' * DataTable有内建的格式化数字的工具,可以用来格式化表格信息中较大的数字 * 默认情况下会自动调用,可以使用该选项来自定义分割的字符 */ "sInfoThousands": "'", /* * 默认值为Show _MENU_ entries * 描述当分页组件的下拉菜单的选项被改变的时候发生的动作,'_MENU_'变量会被替换为默认的10,25,50,100 * 如果需要的话可以被自定义的下拉组件替换 */ "sLengthMenu": justep.Message.getMessage(justep.Message.JUSTEP231557),//"显示_MENU_条", /* * 默认值为Loading... * 当使用Ajax数据源和表格在第一次被加载搜集数据的时候显示的字符串,该信息在一个空行显示 * 向终端用户指明数据正在被加载,注意该参数在从服务器加载的时候无效,只有Ajax和客户端处理的时候有效 */ "sLoadingRecords": justep.Message.getMessage(justep.Message.JUSTEP231558),//"请等待数据加载中...", /* * 默认值为Processing... * 当表格处理用户动作(例如排序或者类似行为)的时候显示的字符串 */ "sProcessing": justep.Message.getMessage(justep.Message.JUSTEP231559),//"处理中...", /* * 默认为Search: * 描述用户在输入框输入过滤条件时的动作,变量'_INPUT_',如果用在字符串中 * DataTable会使用用户输入的过滤条件替换_INPUT_为HTML文本组件,从而可以支配它(即用户输入的过滤条件)出现在信息字符串中的位置 * 如果变量没有指定,用户输入会自动添加到字符串后面 */ "sSearch": justep.Message.getMessage(justep.Message.JUSTEP231560),//"查询: _INPUT_", /* * 默认值为No matching records found * 当对数据进行过滤操作后,如果没有要显示的数据,会在表格记录中显示该字符串 * sEmptyTable只在表格中没有数据的时候显示,忽略过滤操作 */ "sZeroRecords": justep.Message.getMessage(justep.Message.JUSTEP231561)//"没有数据" }; var processDom = function(cfg,comp){ var data = comp.getData(); var type = cfg.layout; if('t'===type){//只有表格 cfg.dom = "tr"; if(data)cfg.pageLength = data.limit; cfg.paging = false; }else if('tlip'===type){//表格+分页长度+信息+分页 cfg.dom = "tr" +"<'container-fluid'<'row'<'col-sm-3'l><'col-sm-3'i><'col-sm-6'p>>>"; }else if('ptp'===type){//分页+表格+分页 cfg.dom = "ptrp"; if(data)cfg.pageLength = data.limit; } }; var processOrder = function(data, settings){ //aaSorting var orders = [], tempOrders = settings.tempOrders||[], isChanged = false, order; if($.isArray(settings.aaSorting) && settings.aaSorting.length>0){ data.clearOrderBy(); var aaSorting = settings.aaSorting, colSorting, colDef, o; for(var i=0;i<aaSorting.length;i++){ colSorting = aaSorting[i]; if(colSorting.length<2) continue; colDef = settings.aoColumns[colSorting[0]]; order = 'asc'===colSorting[1]?1:0; data.setOrderBy(colDef.sName,order); o = {}; o[colDef.sName] = order; orders.push(o); if(tempOrders.length<=i) isChanged = true; if(!isChanged){ isChanged = tempOrders[i][colDef.sName] !== o[colDef.sName]; } } } settings.tempOrders = orders; return isChanged; }; var valToString = function(v, colDef){ if(v instanceof Data.ErrorValue) v = v.value; if(v===null || v===undefined) return ''; if(colDef.format && ('DateTime' === colDef.dataType ||'Date' === colDef.dataType ||'Time' === colDef.dataType)) return justep.Date.toString(v, colDef.format); else return v; }; var colVal = function(source, type, val, meta){ var colDef = meta.settings.aoColumns[meta.col]; if (type === 'set') { source.val(colDef.sName,val); return; } else if (type === 'display') { return valToString(source.val(colDef.sName), colDef); } else if (type === 'filter') { return source.val(colDef.sName)||""; } return source.val(colDef.sName)||""; }; var DataTables = justep.ViewComponent.extend({ getConfig : function() { return ComponentConfig; }, // 构造函数 constructor : function(options) { this._eventHandles = {}; this.multiSelect = false; this.showRowNumber = false; this.data = null; this._lastsel = null; this._disON = false; this.rowActiveClass = ''; this.rowAttr = null; this.useFooter = false; this.callParent(options); }, dispose : function() { this._bindEvent(false); this.callParent(); }, buildTemplate : function(config) { this._cfg = config || {}; this.data = this._cfg.data; if(!this._cfg.xid) this._cfg.xid=justep.UUID.createUUID(); var str = '<table xid="'+this._cfg.xid+'" component="'+url+'"' +(this._cfg['style']?(' style="'+this._cfg['style']+'"'):'') +(this._cfg['class']?(' class="'+this._cfg['class']+'"'):'') +'>'; if(this._cfg.useFooter===true){ var tf = '<tfoot><tr>'; var size = $.isArray(this._cfg.columns)?this._cfg.columns.length:0; if(this._cfg.multiSelect) size++; if(this._cfg.showRowNumber) size++; for(var i=0;i<size;i++){ tf += '<th/>'; } tf += '</tr></tfoot>'; str += tf; } str += '</table>'; return $(str); }, // 初始化 init : function(value, bindingContext) { this.callParent(value, bindingContext); var cfg = this._processCfg(); this.fireEvent('onBeforeInit',{source:this,settings:cfg}); this.$domNode.dataTable(cfg); this._bindEvent(); this.fireEvent('onInit', {source:this}); this._processFooter(); }, _processCfg : function(){ var self = this; var data = this.getData(); var cfg = $.extend({ "oLanguage": language, "order": [], "layout": 't', "lengthMenu": [10,20,50,100], "bProcessing" : true, "bServerSide" : true, "responsive" : false, "sAjaxSource" : "data.json", "sAjaxDataProp": "data", "footerCallback": function(tfoot, aoData, start, end, display){ self.fireEvent('onFooterRender', { source:self, tfoot:tfoot, data:data, start:start, end:end, display:display }); }, "headerCallback": function(thead, aoData, start, end, display){ self.fireEvent('onHeaderRender', { source:self, thead:thead, data:data, start:start, end:end, display:display }); }, "createdRow": function(tr, row){ if(self.rowAttr){ if(!self._rowAttrExpr) self._rowAttrExpr = new justep.Express(self.rowAttr); var ctx = justep.Bind.contextFor(self.domNode); ctx.$row = row; var attrObj = justep.Express.eval(self._rowAttrExpr, ctx.$object, ctx); delete ctx.$row; if(!$.isEmptyObject(attrObj)) { if (attrObj.hasOwnProperty("style")) { var style = $(tr).attr('style'); $(tr).attr('style',style?(style+attrObj.style):attrObj.style); delete attrObj.style; } if (attrObj.hasOwnProperty("class")) { $(tr).addClass(attrObj['class']); delete attrObj['class']; } // dot't allow to change role attribute try { delete attrObj.role; } catch(ra){} for (var attrName in attrObj) { if (attrObj.hasOwnProperty(attrName)) { $(tr).attr(attrName,attrObj[attrName]); } } } } }, "fnServerData" : function(sSource, aoData, fnCallback, settings){ if(data){ var recodeCount = data.getTotal(),dataOffset = data.getOffset(); { //没有内部分页使用外部分页,同步data的limit if(!settings.bPaginate) settings._iDisplayLength = data.limit; //aaSorting排序 var _orderChanged = processOrder(data, settings); //oPreviousSearch.sSearch,bCaseInsensitive,bSmart过滤查询 if(_orderChanged || (data.isLoaded() && dataOffset)){//判断数据没有刷新过,只是新增 if(_orderChanged || data.limit!==settings._iDisplayLength){//分页显示不同重新刷新 self._disON = true; try{ data.refreshData({limit:settings._iDisplayLength}); }finally{ self._disON = false; } settings._iDisplayStart = 0; } if(data.limit>0 && settings.bPaginate){ var dataPageIndex = Math.floor(dataOffset/data.limit); var tablePageIndex = Math.floor(settings._iDisplayStart/settings._iDisplayLength)+1; if(dataPageIndex!==tablePageIndex){ self._disON = true; try{ data.loadPageData(tablePageIndex); }finally{ self._disON = false; } } } }else if(!settings.bPaginate) data.limit = settings._iDisplayLength; } fnCallback({data:data.datas.get().slice(0),recordsTotal:recodeCount,recordsFiltered:recodeCount}); }else fnCallback({data:[],recordsTotal:0,recordsFiltered:0}); if(data){ self.setSelection(data.getCurrentRow(true)); } self.fireEvent('onLoaded', {source:self}); } },this._cfg||this.$domNode.data('config')); //处理展示模板 processDom(cfg,this); //处理自适应宽度 if(cfg.flexibleWidth){ this.$domNode.attr('width','100%').css('width','100%'); } //处理自定义长度菜单 if('string'===typeof(cfg.lengthMenu)){ var lengthMenu = cfg.lengthMenu, s, sl, len1, len2, lengthMenuDefs1 = [], lengthMenuDefs2 = []; lengthMenu = lengthMenu.split(','); for(var i=0;i<lengthMenu.length;i++){ s = lengthMenu[i]; sl = s.split(':'); if(sl.length=1){ len1 = parseInt(s,10); lengthMenuDefs1.push(len1); lengthMenuDefs2.push(len1); }else if(sl.length>1){ len1 = parseInt(sl[0],10); len2 = parseInt(sl[1],10); lengthMenuDefs1.push(len1); lengthMenuDefs2.push(len2); } } if(lengthMenuDefs1.length>0) cfg.lengthMenu = [lengthMenuDefs1,lengthMenuDefs2]; } this._processColCfg(cfg); if(cfg.data) delete cfg.data; return cfg; }, _processFooter: function(){ if(this.useFooter){ var $table = this.dataTableApi(); var colDefs = $table.settings()[0].aoColumns; var self = this, footerData = {}; $.each(colDefs,function(i,v){ if(v.footerData){ if(!v._footerDataExpr) v._footerDataExpr = new justep.Express(v.footerData); var ctx = justep.Bind.contextFor(self.domNode); ctx.$data = self.getData(); footerData[v.sName] = justep.Express.eval(v._footerDataExpr, ctx.$object, ctx); delete ctx.$data; } }); if(!$.isEmptyObject(footerData)) this.setFooterData(footerData); } }, _processColCfg : function(cfg){ var indexs = [], self = this, multiSelect = this.multiSelect, showRowNumber = this.showRowNumber, data = this.getData(), defCols = data?data.defCols:null; if(multiSelect){ cfg.columns.splice(0,0,{ "title": '<input type="checkbox">', "class": 'dataTables-cb', "orderable": false, "data": null, "width": 38, "defaultContent": '<input type="checkbox">' }); } if(showRowNumber){ cfg.columns.splice(0,0,{ "title": '', "class": 'dataTables-num', "orderable": false, "data": null, "width": 38, "defaultContent": '1' }); } $.each(cfg.columns,function(i,v){ if((0===i && (multiSelect || showRowNumber)) || (1===i && multiSelect && showRowNumber)) return; indexs.push(i); var dcol = defCols?defCols[v.sName]:null; if(undefined===v.title){ if(dcol && dcol.label) v.title = dcol.label; else v.title = v.sName; } if(dcol && dcol.type) v.dataType = dcol.type; }); if(!$.isArray(cfg["columnDefs"])) cfg["columnDefs"] = []; cfg["columnDefs"].push({ aTargets:indexs, mDataProp:colVal, render: function(val, type, row, meta) { var colDef = meta.settings.aoColumns[meta.col]; //row, colVal, html, colName var evtData = { source:self, colVal: val, html:val, row: row, rowID: row?row.getID():null, colName: colDef.sName }; self.fireEvent('onCellRender', evtData); return evtData.html; }}); if(showRowNumber){ cfg["columnDefs"].push({ aTargets:0, render: function(val, type, row, meta) { //row, colVal, html, colName var data = row?row.data:null,v = ''; if(data){ var offset = data.limit!==-1?data.getOffset()-data.limit:0; v = data.getRowIndex(row)+1+offset; } var evtData = { source:self, colVal: v, html:v, row: row, rowID: row?row.getID():null, colName: '$rowNumber' }; self.fireEvent('onCellRender', evtData); return evtData.html; }}); } }, _bindEvent : function(on){ on = on!==false; var data = this.getData(); var api = this.dataTableApi(); var settings = api.settings()[0]; var self = this; var fn = on?'on':'off'; this.$domNode[fn]('click', 'tbody>tr', function(evt){ var row = api.row(this).data(); self.setSelection(row); var evtData = { source : self, domEvent: evt, row: row, rowID: row?row.getID():null }; self.fireEvent('onRowClick', evtData); }); this.$domNode[fn]('dblclick', 'tbody>tr', function(evt){ var evtData = { source : self, domEvent: evt, row: api.row(this).data() }; evtData.rowID = evtData.row?evtData.row.getID():null; self.fireEvent('onRowDblClick', evtData); }); //多选支持 if(this.multiSelect){ this.$domNode.closest('.dataTables_wrapper').find('thead:first')[fn]('click', 'th.dataTables-cb input', function(evt){ self.setAllRowChecked(this.checked); if(self.hasListener('onRowCheckedAll')){ self.fireEvent('onRowCheckedAll', {source:self,checked:this.checked}); } }); this.$domNode.find('tbody')[fn]('click', 'td.dataTables-cb input', function(evt){ var input = evt.target; var tr = $(input).closest("tr"); var evtData; if(self.hasListener('onRowCheck')){ //多选勾选前事件,可以使用cancel取消 evtData = { source:self, row: api.row(tr).data(), checked:input.checked, cancel:false }; evtData.rowID = evtData.row.getID(); self.fireEvent('onRowCheck', evtData); if(evtData.cancel){ input.checked = !input.checked; return; } } if(self.hasListener('onRowChecked')){ //多选勾选事件 evtData = {source:self,row:api.row(tr).data(),checked:input.checked}; evtData.rowID = evtData.row.getID(); self.fireEvent('onRowChecked', evtData); } }); } if(data){ this._eventHandles['__data_index_changed__'] = function(event){ if(self._lastsel!==event.row) self.setSelection(event.row); }; data[fn](Data.EVENT_INDEX_CHANGED,this._eventHandles['__data_index_changed__']); this._eventHandles['__data_value_changed__'] = function(event){ var cell = self.getCell(event.row, event.col); if(cell) cell.invalidate(); self._processFooter(); }; data[fn](Data.EVENT_VALUE_CHANGED, this._eventHandles['__data_value_changed__']); this._eventHandles['__data_change__'] = function(event){ var i,rows; if(!self._disON && event.selfChanged && (event.type === 'clear' || event.type === 'refresh' || event.type === 'exchangeRow' || event.type === 'delete' || event.type === 'new' || event.type === 'slaveDataChanged')){ if(event.type === 'refresh' || event.type === 'exchangeRow'){ if(data.limit>-1){ var dataOffset = data.getOffset(),iStart = dataOffset-data.limit; settings.iInitDisplayStart = iStart>=0?iStart:0; } self.reload(); }else if(event.type === 'slaveDataChanged'){ if(self._eventHandles['__roload__']) window.clearTimeout(self._eventHandles['__roload__']); self._eventHandles['__roload__'] = window.setTimeout(function(){self.reload();self._eventHandles['__roload__']=null;},10); }else if(event.type === 'clear') self.clear(); else if(event.type === 'delete'){ rows = event.deleteRows; for(i=0;i<rows.length;i++){ self.removeRow(rows[i]); } }else if(event.type === 'new'){ rows = event.rows; for(i=0;i<rows.length;i++){ self.addRow(rows[i]); } } self._processFooter(); } }; data[fn](Data.EVENT_DATA_CHANGE,this._eventHandles['__data_change__']); } }, getSelection: function(){ return this._lastsel; }, setSelection : function(row){ var tr = this.getRow(row); var api = this.dataTableApi(); var data = this.getData(); if(tr){ var $tr = $(tr.node()); this._lastsel = tr.data(); if(data) data.to(this._lastsel); if(this.rowActiveClass){ if(!$tr.hasClass(this.rowActiveClass)){ api.$('tr.'+this.rowActiveClass).removeClass(this.rowActiveClass); $tr.addClass(this.rowActiveClass); var evtData = { source : this, row: this._lastsel, rowID: this._lastsel?this._lastsel.getID():null }; this.fireEvent('onRowSelect', evtData); } } } }, getCheckeds: function(){ var ret = null; if(this.multiSelect){ ret = []; var $table = this.dataTableApi(); this.$domNode.find('tbody tr').each(function(){ var row = $table.row(this).data(); if($(this).find('td.dataTables-cb input').prop('checked')) ret.push(row); }); } return ret; }, isChecked: function(row){ var tr = this.getRow(row); return tr?$(tr.node()).find('td.dataTables-cb input').prop('checked'):false; }, setRowChecked: function(row,checked){ var tr = this.getRow(row); if(tr) $(tr.node()).find('td.dataTables-cb input').prop('checked',checked); }, setAllRowChecked: function(checked){ this.$domNode.find('tbody td.dataTables-cb input').prop('checked',checked); }, getData : function(){ if(this.data) return this.getModel().comp(this.data); }, addRow: function(row){ var $table = this.dataTableApi(); $table.row.add(row).draw(); }, removeRow: function(row){ var r = this.getRow(row); if(r) r.remove().draw(); }, reload: function(){ var chs = this.getCheckeds(); var $table = this.dataTableApi(); $table.ajax.reload(); $table.columns.adjust(); if($.isArray(chs)){ var me = this; $.each(chs,function(i,v){ me.setRowChecked(v, true); }); } }, refresh: function(){ this.reload(); }, clear: function(){ var $table = this.dataTableApi(); $table.clear().draw(); }, getRow : function(row){ var $table = this.dataTableApi(); var ri = $table.data().indexOf(row); return (ri>-1)?$table.row(ri):null; }, getCell : function(row,col){ var $table = this.dataTableApi(); var ri = $table.data().indexOf(row),ci=-1; var colDefs = $table.settings()[0].aoColumns; $.each(colDefs, function(i,colDef){ if(colDef.sName===col){ ci = i; return false; } }); return (ri>-1 && ci>-1)?$table.cell(ri, ci):null; }, dataTableApi: function(){ return this.$domNode.DataTable(); }, getColumn: function(col){ var $api = this.dataTableApi(),ci=-1; var colDefs = $api.settings()[0].aoColumns; $.each(colDefs, function(i,colDef){ if(colDef.sName===col){ ci = i; return false; } }); return (ci>-1)?$api.column(ci):null; }, hideCol: function(col){ var column = this.getColumn(col); if(column) column.visible(true); }, showCol: function(col){ var column = this.getColumn(col); if(column) column.visible(false); }, setRowCss: function(row,css){ var tr = this.getRow(row); if(tr) $(tr).css(css); }, setFooterData: function(fData){ var self = this; $.each(fData,function(n,v){ var col = self.getColumn(n); if(col) $(col.footer()).html(v); }); }, // 更新 update : function(value, bindingContext) { //目前没有 } }); justep.Component.register(url, DataTables); return DataTables; });
define(function(require) { require("$UI/system/components/justep/common/res"); var justep = require("$UI/system/lib/justep"); var url = require.normalizeName("./tabs"); var $ = require("jquery"); require('css!./css/tabs').load(); require("$UI/system/components/bootstrap/lib/js/bootstrap"); var Tabs = justep.ViewComponent.extend({ dispose : function() { $(window).off('resize', this.resizeHandle); this.callParent(); }, init: function(value, bindingContext){ var self = this; self.callParent(value, bindingContext); this.resizeHandle = this._doResize.bind(this); $(window).on('resize', this.resizeHandle); var $domNode = $(this.domNode); this.$node = $domNode; this.$panel = $(">.x-panel", $domNode); this.$contents = $(">.x-panel-content>.x-contents", this.$panel); $domNode.on("click", ">.x-panel>.x-panel-top>.nav>li", function() { var $this = $(this); var selectEvent = {source: self, tab:$this, cancel: false}; self.fireEvent(Tabs.BEFRESELECT_EVENT, selectEvent); if(selectEvent.cancel === true){ return; } self.setActiveTab($this); }); var me = this, panel = this.getModel().componentPromise(this.$panel[0]), contents = this.getModel().componentPromise(this.$contents[0]); $.when(panel, contents).then( function(panel, contents){ me.panel = panel; me.contents = contents; me.contents.on("onActiveChanged", function(event){ var index = event.to; if(me.index != index){ var li = $(">.x-panel>.x-panel-top>.nav>li", me.domNode).eq(index); me.setActiveTab(li); } }); me.inited(); me._doResize(); }, function(err){ alert(err); } ); return {dependence: true}; }, _doResize: function(evt){ var h = $(">.x-panel>.x-panel-top>.nav",this.domNode).outerHeight(); if(h>1){ $(">.x-panel>.x-panel-top",this.domNode).css('height',h); $(">.x-panel>.x-panel-content",this.domNode).css('top',h); } }, setActiveTab : function(tab){ if(typeof tab == 'string'){ tab = $(">.x-panel>.x-panel-top>.nav>li[xid='"+tab+"']",this.domNode); } $(">li", tab.parent()).removeClass("active"); tab.addClass("active"); this.index = tab.index(); this.contents.to(this.index); //通知变化,主要刺激grid重画 this.getModel().fireEvent("onResize",{source:this}); var selectEvent = {source: this, tab:tab}; this.fireEvent(Tabs.SELECT_EVENT, selectEvent); } }); Tabs.BEFRESELECT_EVENT = "onBeforeSelect"; Tabs.SELECT_EVENT = "onSelect"; justep.Component.addOperations(Tabs, { setActiveTab: { label : justep.Message.getMessage(justep.Message.JUSTEP233010), //icon : '', argsDef: [{name:'xid',displayName:'切换的tab(li) xid'}], method : function(args) { return this.owner.setActiveTab(args.xid); } }, }); justep.Component.register(url, Tabs); return Tabs; });
define(function(require) { var $ = require("jquery"); var justep = require("$UI/system/lib/justep"); var composition = require("$UI/system/lib/base/composition"); var url = require.normalizeName("./windowContainer"); var ComponentConfig = require("./windowContainer.config"); var RouteUtil = require('$UI/system/lib/route/routeUtil'); var INNER_MODEL = "__inner-model__"; var WindowContainer = justep.ViewComponent.extend({ // 构造函数 constructor : function(config) { this.__windowContainerInited = false; this.callParent(config); this.autoLoad = true; this.curSrc = ""; this.src = ""; this.process = ""; this.activity = ""; this._composeOK = $.Deferred(); this.routable = false; this._isFirst = true; this.useCurrentProcessActivity = true; }, controlsDescendantBindings : function() { return true; }, dispose : function() { this.callParent(); }, getConfig : function() { return ComponentConfig; }, // 动态创建组件 buildTemplate : function(config) { var e = $("<div component='" + url + "' __component-context__='block' />"); if (config) { this.src = config.src; this.process = config.process; this.activity = config.activity; if (config.hasOwnProperty("useCurrentProcessActivity")){ this.useCurrentProcessActivity = config.useCurrentProcessActivity; } this.owner = config.owner; if (config.params && !justep.Util.isString(config.params)){ this.params = config.params || null; delete config.params; } if (config.xid) { e.attr("xid", config.xid); } } return e; }, // 组件初始化 init : function(value, bindingContext) { this.__windowContainerInited = true; this.callParent(value, bindingContext); var params = this.params; if (!this.params && value && value.params){ params = value.params; } if (this.autoLoad) this.refresh(null, params); else if (params) this.params = params; }, setSrc : function(v) { this.set({ src : v }); }, setProcess : function(v) { this.set({ process : v }); }, setActivity : function(v) { this.set({ activity : v }); }, doRoute : function(name,param,routeState){ if(!this.routable){ return; } if(name === ""){ var jsonParam,innerStateValue; var self = this; if(routeState == "enter"){ if(RouteUtil.containeInnerState(param)){ var paramValue = RouteUtil.getParamValue(param); innerStateValue = RouteUtil.getInnerStateValue(param); try{ jsonParam = JSON.parse(paramValue); }catch(e){ } this.refresh(jsonParam.src,jsonParam.params); if(this._composeOK){ this._composeOK.done(function(){ var innerModel = self.getInnerModel(); innerModel.postMessage({ type:"routeState", newUrl:innerStateValue }); }); } }else{ try{ jsonParam = JSON.parse(param); }catch(e){ } this.refresh(jsonParam.src,jsonParam.params); } }else if(routeState == "leave"){ }else if(routeState == "update"){ innerStateValue = RouteUtil.getInnerStateValue(param); if(this._composeOK){ this._composeOK.done(function(){ var innerModel = self.getInnerModel(); innerModel.postMessage({ type:"routeState", newUrl:innerStateValue }); }); } } } }, addRouteItem : function(type,params){ if(!this.routable){ return; } var $routeState = this.getModel().$routeState; var xid = this.$domNode.attr('xid'); if(type == 'load'){ try{ if(params){ params = $.extend({},params); delete params.data; } $routeState.addState(xid,'',JSON.stringify(params)); $routeState.publishState(); }catch(e){ //JSON.stringify(param) error } }else if(type == 'destory'){ $routeState.removeState(xid,'',''); $routeState.publishState(); } }, addRouteInnerItem : function(type,hashbang,isReplace){ if(!this.routable){ return; } var $routeState = this.getModel().$routeState; var xid = this.$domNode.attr('xid'); if(this.getInnerModel()){ $routeState.addInnerState(xid,'',hashbang); $routeState.publishState(isReplace); } }, refresh : function(url, params){ this._load(url, params, true); }, load : function(url, params){ this._load(url, params, false); }, _load : function(url, params, forceRefresh) { if (this.__windowContainerInited) { this._composeOK = $.Deferred(); var src = url; if (src) this.set({"src": src}); src = this.get("src"); if (src) { params = params || this.params; var beforeEventData = { source: this, src: src, params: params, cancel: false }; this.fireEvent(WindowContainer.BEFORE_LOAD_EVENT, beforeEventData); if (beforeEventData.cancel) return; this.params = params; src = this._prepareSrc(src); this.addRouteItem("load",{src:src,params:this.params}); if (forceRefresh || this._mustRefresh(src)){ this._refresh(src, beforeEventData.params); }else{ this._doSetParams(beforeEventData.params); this._composeOK.resolve(); } } } }, _doSetParams: function(params){ var innerModel = null; try{ innerModel = this.getInnerModel(); }catch(e){}; if (innerModel) innerModel.setParams(params); }, _mustRefresh : function(src){ if (!this.getInnerModel() || !this.curSrc || !src) return true; var url1 = new justep.URL(require.toUrl(src)); var url2 = new justep.URL(require.toUrl(this.curSrc)); if (url1.getPathname() == url2.getPathname()){ for (var p in url1.params){ if (url1.params.hasOwnProperty(p) ){ if (!url2.params.hasOwnProperty(p) || (url1.params[p]!==url2.params[p])){ return true; } } } for (var p in url2.params){ if (url2.params.hasOwnProperty(p)){ if (!url1.params.hasOwnProperty(p)){ return true; } } } return false; }else{ return true; } }, _refresh : function(src, params){ if (this._isFirst && this.$domNode.children().length > 0){ }else{ for ( var i = this.domNode.childNodes.length - 1; i >= 0; i--) { justep.Bind.removeNode(this.domNode.childNodes[i]); } } this._isFirst = false; if (!src) return; var newSrc = this._addDefaultParams(src); var settings = { activate : true, params: params, owner: this.owner || this }; settings.model = newSrc; settings.preserveContext = true; var self = this; settings.loadError = function(err) { var evt = { source : self, err : err, cancel : false }; self.fireEvent(WindowContainer.LOAD_ERROR_EVENT, evt); return evt.cancel; }; settings.src = newSrc; settings.viewLoad = function(){ self.curSrc = src; //缓存src, 为下次刷新做依据 var dtd = $.Deferred(); var evt = { source : self, cancel : false, dtd:dtd, async:false }; self.fireEvent(WindowContainer.VIEW_LOAD_EVENT, evt); if(!evt.async){ dtd.resolve(); } return dtd.promise(); }; if (this.$domNode.children().length > 0){ settings.view = this.$domNode.children()[0]; } composition.compose(this.domNode, settings); }, _prepareSrc : function(src) { if (src && this.useCurrentProcessActivity) { if ((src.indexOf("process=") == -1) && (src.indexOf("activity=") == -1)) { var process = this.get("process"); var activity = this.get("activity"); if (process && activity) { src += (src.indexOf("?") == -1) ? "?" : "&"; src += "process=" + process + "&activity=" + activity; } } } return src; }, _addDefaultParams : function(src){ var ctx = this.getModel().getContext(); if (src && ctx){ if (ctx.getProcess && ctx.getActivity && this.useCurrentProcessActivity) { process = ctx.getProcess(); activity = ctx.getActivity(); if ((src.indexOf("process=") == -1) && (src.indexOf("activity=") == -1) && process && activity) { src += (src.indexOf("?") == -1) ? "?" : "&"; src += "process=" + process + "&activity=" + activity; } } if (ctx.getExecutor && (src.indexOf("executor=")==-1)) { var executor = ctx.getExecutor(); if (executor) { src += (src.indexOf("?") == -1) ? "?" : "&"; src += "executor=" + executor; } } if (ctx.getExecuteContext && (src.indexOf("executeContext=")==-1)){ var executeContext = ctx.getExecuteContext(); if (executeContext){ src += (src.indexOf("?") == -1) ? "?" : "&"; src += "executeContext=" + executeContext; } } } return src; }, getInnerModel : function() { try{ return justep.Bind.utils.domData.get(this.domNode, INNER_MODEL); }catch(err){ var msg = new justep.Message(justep.Message.JUSTEP230112); throw justep.Error.create(msg); } }, loaded : function() { this.fireEvent(WindowContainer.LOAD_EVENT, { source : this }); this._prepareRouteStateChannel(); this._composeOK.resolve(); }, _prepareRouteStateChannel : function() { var self = this; this.getInnerModel().off('onRouteStatePublish'); /** * 第一次根据url进来时候 onRouteStatePublish的时机比起loaded先后顺序不确定 */ var fireRouteStateChange = function(event) { if(self.routable){ self.addRouteInnerItem('', event.hashbang,event.isReplace); } self.fireEvent("onRouteStatePublish", event); self._prepareRouteStateChannel._lastHashbang = event.hashbang; }; this.getInnerModel().on("onRouteStatePublish", function(event) { fireRouteStateChange(event); }, this); fireRouteStateChange({ isReplace : true, hashbang : this.getInnerModel().$routeState.toHashbang() }); }, send : function(data){ //如果还有domNode, 表示没有销毁 if (!this.isDestroy) this.fireEvent(WindowContainer.RECEIVE_EVENT, {source: this, data: data}); }, setParams : function(params){ this.params = params; } }); WindowContainer.RECEIVE_EVENT = "onReceive"; WindowContainer.BEFORE_LOAD_EVENT = "onBeforeLoad"; WindowContainer.LOAD_EVENT = "onLoad"; WindowContainer.LOAD_ERROR_EVENT = "onLoadError"; WindowContainer.VIEW_LOAD_EVENT = "onViewLoad"; justep.Component.register(url, WindowContainer); return WindowContainer; });