(function ($) { $.fm.Grid = Control.subClass({ template: [ '
', '', '', '', '', '', '', '', '
', '
', ], template_footer: [ '
', '
', '', '
', '
', '
', '
', '', '
', '
', '', '
', '
', '', '
', '
', '', '
', '
', '
', '', '/', '', '
', '
', '
', '', '
', '
', '
', '
' ], template_header_indicator: [ '', '
', '' ], template_header_cell: [ '', '
', '' ], template_body_indicator: [ '', '
', '' ], init: function(options) { this.headerHeight = 32; this.footerHeight = 31; this.limit = 15; this.colunmUnitWidth = 100; this.indicatorWidth = 30; this.rowHeight = 23.4; this.editable = false; this.editors = {}; this.usedWidth = 0; this.showPage = false; this.hasSubTitle = false; this.showIndicator = true; this.showToolBar = true; this.multiSelect = false; this.singleSelect = true; this.enableAllSelect = false; this.selected = null; this.selectedArray = []; this.dataObject = []; this.rows = []; this.headerFixed = false; //表头是否固定 Control.call(this, options); this.createElements(); this.refresh(); }, createElements: function() { var me = this; //1. this.canvas.addClass("grid"); this.bodyHeight = this.rowHeight * this.limit; this.height = this.headerHeight + this.bodyHeight; //2. this.element = $(this.template.join("")); this.element.tab_self = $("#tab_self", this.element); this.element.table_header = $("#table_header", this.element); this.element.table_body = $("#table_body", this.element); this.setGridType(this.headerFixed); this.canvas.append(this.element); this.createHeader(this.canvas); this.createBody(this.canvas); if (this.showToolBar) { if (this.customFooter) { this.customFooter = this.getEl(this.customFooter); this.createCustomFooter(this.canvas); } else { this.createDefaultFooter(this.canvas); } } else { if (this.customFooter) { this.customFooter = this.getEl(this.customFooter); this.customFooter.hide(); } } this.tableBody.scroll(function() { var left = $(this).scrollLeft(); me.table_header.scrollLeft(left); }); }, setGridType: function(headerFixed) { if (headerFixed) { this.element.attr("class", "grid-body"); this.element.tab_self.attr("class", "tab_self"); this.element.table_header.attr("class", "tab_self_header"); this.element.table_body.attr("class", "tab_self_body"); } }, createHeader: function(area) { var columns = this.columns, me = this, rowspan = 1; if (!columns) return; var header = $('.grid-header', area); header.height(this.headerHeight); header.css("line-height", this.headerHeight + "px"); var row = $('#header-row', area); var row1 = $('#header-row1', area); if (this.titleClass) { row.attr("class", this.titleClass); row1.attr("class", this.titleClass); } this.table_header = $('#table_header', area); if(!this.hasSubTitle) { row1.hide(); } else{ rowspan = 2; } //1. if (this.showIndicator) { var template = $(this.template_header_indicator.join("")); template.attr("rowspan", rowspan); var indicator = this.headerIndicator = $('#header-indicator', template); if (this.enableAllSelect) { indicator.addClass("grid-indicator-unselected"); indicator.click(function() { me.setAllSelect(); }); } indicator.width(this.indicatorWidth); row.append(template); } //2. var flag = false, m = 0, colspan, pcolumn; for (var i = 0; i < columns.length; i++) { var column = columns[i]; this.usedWidth = this.usedWidth + column.width; var cell = null; if(column.parent) { flag = true, m++; if(column.colspan) { colspan = column.colspan; pcolumn = column; } cell = $(this.template_header_cell.join("")); cell.body = $('#header-cell', cell); cell.body.width(column.width); cell.body.html(column.caption), row1.append(cell); } else{ cell = $(this.template_header_cell.join("")); cell.attr("rowspan", rowspan); cell.body = $('#header-cell', cell); cell.body.width(column.width); cell.body.html(column.caption), row.append(cell); } if(flag && m % colspan == 0) { row.append("" + pcolumn.parent + ""); flag = false; m = 0; } } }, createBody: function(element, columns) { this.body = $('#grid-body', element); this.body.height(this.height); this.tableBody = $('#table_body', element); }, createDefaultFooter: function(element) { var me = this; var footer = $(this.template_footer.join("")); var toolbar = element.toolbar = $('#grid-toolbar', element); var placeholder = $('#grid-toolbar-placehoder', footer); placeholder.width(200); var btn_first = toolbar.btn_first = $('#grid-first', footer); var btn_prior = toolbar.btn_prior = $('#grid-prior', footer); var btn_next = toolbar.btn_next = $('#grid-next', footer); var btn_last = toolbar.btn_last = $('#grid-last', footer); var btn_load = toolbar.btn_load = $('#grid-load', footer); btn_load.active = true; var currentPage = toolbar.currentPage = $('#currentPage', footer); var totalPage = toolbar.totalPage = $('#totalPage', footer); var information = toolbar.information = $('#grid-bar_message', footer); me.initButton(btn_first, me.firstPage); me.initButton(btn_prior, me.priorPage); me.initButton(btn_next, me.nextPage); me.initButton(btn_last, me.lastPage); me.initButton(btn_load, me.refresh); information.html("没有数据"); element.append(footer); }, createCustomFooter: function(canvas, array) { this.customFooter.remove(); this.canvas.append(this.customFooter); this.customFooter.show(); }, setURL: function(url) { this.url = url; this.refresh(); }, refresh: function() { this.tableBody.empty(); var me = this; this.selected = null; this.selectedArray = []; if (!this.url) { return; } Server.getData(this.url, function(data, page) { Loading.hide(); if (me.onGetData) { data = me.onGetData(data); } me.loadData(data, page); }); }, fireDataChange: function() { if (this.onDataChagne) { this.onDataChagne(); } }, loadData: function(array, page) { this.tableBody.empty(); this.rows = []; this.dataObject = []; if (!array || !array.length){ return; } $('#grid-bar_message', this.canvas).html("总共 " + array.length + " 条记录"); for (var m = 0; m < array.length; m++) { var data = array[m]; var row = this.loadLine(data, m); this.tableBody.append(row.element); this.rows.push(row); this.dataObject.push(row.data); } if (this.showPage && page) { this.loadPage(page); } if (this.afterLoad){ this.afterLoad(array, this.selected); } if (this.defaultSelectedIdx) { this.select(this.defaultSelectedIdx - 1); } if (this.columnsAverage) { this.columnsAverage(this.rows); } this.bodyIndicator = $("#indicator-body", this.canvas); }, loadLine: function(data, index) { var me = this; var columns = this.columns; var row = {"index": index}; var rowEl = $(''); rowEl.data('row', row); if (!me.doubleClickSelect) { rowEl.click(function() { if(me.singleSelect) me.setRowSelected.call(me, $(this).data('row')); }); } else { rowEl.dblclick(function() { if(me.singleSelect) me.setRowSelected.call(me, $(this).data('row')); }); } rowEl.hover( function() { $(this).addClass("grid-row-over"); }, function() { $(this).removeClass("grid-row-over"); } ); row['element'] = rowEl; var dataObject = new DataObject(data); dataObject.onDataChange = function() { me.refreshLine(row, rowEl); } row['data'] = dataObject; if (this.onLineRender) { this.onLineRender(row, data); } var cells = me.loadLineCells(row, data, columns); row['cells'] = cells; if (row.select) { row.select = false; this.setRowSelected(row); } return row; }, loadLineCells: function(row, data, columns) { var cells = new Array(length); //1. if (this.showIndicator) { var indicator = $(this.template_body_indicator.join("")); row.indicator = $("#indicator-body", indicator); row.indicator.width(this.indicatorWidth); row.element.append(indicator); } //2. for (var i = 0; i < columns.length; i++) { var column = columns[i]; var cell = new $.fm.Grid.Cell({ grid: this, column: column, row: row, value: data[column.field] }); row.element.append(cell.element); cells[i] = cell; } return cells; }, refreshLine: function(row, rowEl) { var cells = row.cells; for (var i = 0; i < cells.length; i++) { var cell = cells[i]; cell.refresh(); } }, loadPage: function(page) { this.page = page; var bar = this.canvas.toolbar; bar.currentPage.val(page.pageno); bar.totalPage.text(page.pagecount); var message = '没有数据'; if (page.pagecount > 0) { message = '[ 显示' + page.beginrecordno + '-' + page.endrecordno + ' / ' + page.recordcount + '条 ]'; } bar.information.html(message); this.setButtonActive(bar.btn_first, page.pageno > 1); this.setButtonActive(bar.btn_prior, page.pageno > 1); this.setButtonActive(bar.btn_next, page.pageno < page.pagecount); this.setButtonActive(bar.btn_last, page.pageno < page.pagecount); }, pageTo: function(pageNo) { var start = this.url.indexOf('pageno'); var end = this.url.indexOf('&', start); var replaceStr = this.url.subString(start, end); this.url = this.url.replace(replaceStr, 'pageno=' + pageNo); this.refresh(); }, firstPage: function() { this.pageTo(1); }, priorPage: function() { this.pageTo(this.page.pageno - 1); }, nextPage: function() { this.pageTo(this.page.pageno + 1); }, lastPage: function() { this.pageTo(this.page.pagecount); }, setRowSelected: function(row) { if (this.enableAllSelect && this.allSelect) { this.clearAllSelected(); } if ($.isNumeric(row)) { row = this.rows[row]; } if (!row.select) { if (this.selected) { this.doSetRowUnselected(this.selected); } this.doSetRowSelected(row); } else { this.doSetRowUnselected(row); this.allSelect = false; } if (this.onSelect) { this.onSelect(this.allSelect, this); } }, toggleAllSelected: function() { if (!this.multiSelect) { return; } //1. clear single selected if (this.selected) { this.doSetRowUnselected(this.selected); } //2. set select var select = this.allSelect = !this.allSelect; var rows = this.rows; for (var i = 0; i < rows.length; i++) { rows[i].select = select; } //3. toggle class if (select) { this.headerIndicator.removeClass("grid-indicator-unselected"); this.headerIndicator.addClass("grid-indicator-selected"); this.bodyIndicator.removeClass("grid-indicator-unselected"); this.bodyIndicator.addClass("grid-indicator-selected"); } else { this.headerIndicator.removeClass("grid-indicator-selected"); this.headerIndicator.addClass("grid-indicator-unselected"); this.bodyIndicator.removeClass("grid-indicator-selected"); this.bodyIndicator.addClass("grid-indicator-unselected"); } //4. fire event if (this.onSelect) { this.onSelect(this.allSelect, this); } }, doSetRowSelected: function(row) { //1. add to selected row.select = true; if (!this.multiSelect) { this.selected = row; } //2. set selected class if (row.indicator) { row.indicator.removeClass("grid-indicator-unselected"); row.indicator.addClass("grid-indicator-selected"); } row.element.addClass("grid-row-selected"); //3. fire event if (this.onRowSelected) { this.onRowSelected(row); } }, doSetRowUnselected: function(row) { //1. set selected null row.select = false; this.selected = null; //2. remove selected class if (row.indicator) { row.indicator.removeClass("grid-indicator-selected"); row.indicator.addClass("grid-indicator-unselected"); } row.element.removeClass("grid-row-selected"); }, getSelectedRow: function() { //1. single select if (!this.multiSelect) { return this.selected ? this.selected : null; } //2. multiple select var result = [], rows = this.rows; for (var i = 0; i < rows.length; i++) { var row = rows[i]; if (row.select) { result.push(row); } } return result; }, getSelected: function() { //1. single select if (!this.multiSelect) { return this.selected ? this.selected.data : null; } //2. multiple select var result = [], rows = this.rows; for (var i = 0; i < rows.length; i++) { var row = rows[i]; if (row.select) { result.push(row.data); } } return result; }, initButton: function(button, handler) { var me = this; button.hover( function(){ if (button.active) { button.addClass('grid-button-over'); } }, function(){ button.removeClass('grid-button-over'); } ); button.click(function() { if (button.active) { handler.call(me); } }); }, setButtonActive: function(button, active) { button.active = active; if (active) { button.removeClass("grid-btn-disable"); } else { button.addClass("grid-btn-disable"); } }, editCell: function (cell, e) { /*if (this.activeCell == cell) { return; }*/ var me = this; // var submitResult = me.submitCell(); // if (!submitResult) return; me.activeCell = cell; var column = cell.column; var editor = me.editors[column.type]; // if (!editor) { // editor = ControlCreator.create(column); editor = $("#input", ControlCreator.create(column).editor); editor.height(this.rowHeight); editor.on("blur", function() { return me.submitCell(); }); this.canvas.append(editor); me.editors[column.type] = editor; // } var offset = cell.element.offset(); var parentOffset = me.canvas.offset(); editor.val(cell.value); editor.css({ position: 'absolute', left: offset.left - parentOffset.left, width: column.width - 2, top: offset.top - parentOffset.top + 1 }); // RootParent.registerActiveEditor(editor); editor.focus(); me.activeEditor = editor; }, submitCell: function () { var success = false; var activeEditor = this.activeEditor; if (!this.activeCell || !activeEditor) return true; var value = activeEditor.val(); var text = activeEditor.getText ? activeEditor.getText() : null; var eventResult = this.fire('setValue', this.activeCell, value, text); if (eventResult == undefined || eventResult == null || eventResult) { this.activeCell.setValue(value, text); this.activeEditor.hide(); this.fireDataChange(); this.activeCell = null; this.activeEditor = null; success = true; } return success; }, callRowFunction: function(eventFunc, internalRowFunc, record, index) { var me = this; if (eventFunc) { eventFunc(record, function() { internalRowFunc.call(me, record, index); }); } else { internalRowFunc.call(me, record, index); } this.fireDataChange(record); }, appendRow: function(record) { this.callRowFunction(this.onAddRow, this.doAppendRow, record, 0); }, doAppendRow: function(record) { var index = this.rows.length; var row = this.loadLine(record, index); this.tableBody.append(row.element); this.rows.push(row); this.dataObject.push(row.data); this.setRowSelected(row); if (this.rows.length > this.limit) { this.deleteRow(0); } }, insertRow: function(record, index) { this.callRowFunction(this.onAddRow, this.doInsertRow, record, index); }, doInsertRow: function(record, index) { var index = this.rows.length; var row = this.loadLine(data, index); var baseRow = this.rows[index]; baseRow.element.prepend(row.element); this.rows.splice(index, 0, row); this.dataObject.splice(index, 0, row.data); this.setRowSelected(row); if (this.rows.length > this.limit) { this.deleteLastRow(); } }, deleteRow: function(index) { this.callRowFunction(this.onDeleteRow, this.doDeleteRow, null, index); }, doDeleteRow: function(me, index) { var row = this.rows[index]; this.rows.splice(index, 1); this.dataObject.splice(index, 1); row.element.remove(); }, deleteLastRow: function() { this.callRowFunction(this.onDeleteRow, this.doDeleteLastRow, null, 0); }, doDeleteLastRow: function() { var row = this.rows.pop(); this.dataObject.pop(); row.element.remove(); }, empty: function() { if (this.customFooter) { this.customFooter.hide(); this.customFooter.remove(); $("body").append(this.customFooter); } this.data = null; this.dataObject = []; this.rows = []; this.canvas.empty(); }, getData: function() { return this.dataObject; } }); $.fm.Grid.Cell = Control.subClass({ template: [ '', '
', '' ], init: function(options) { Control.call(this, options); this.width = this.column.width; this.createElement(); }, createElement: function() { var me = this, column = this.column; var element = $(me.template.join("")); me.element = element; element.body = $('div', element); element.body.width(column.width); element.body.attr("align", column.align || "center"); this.renderValue(); if (me.grid.editable || me.column.editable) { if (me.grid.quickEdit) { element.click(function() { me.grid.editCell(me); }); } else { element.dblclick(function() { me.grid.editCell(me); }); } } }, renderValue: function() { var element = this.element; var column = this.column; if (column.render) { column.render(element.body, this.value, this.row, this.grid); } else { if(column.field.subString(0, 8) == 'constant'){ element.body.html(column.field.subString(8)); } else{ element.body.html(this.value); } } }, refresh: function() { var fieldName = this.column.field; var dataObject = this.row.data; this.value = dataObject.getValue(fieldName); this.renderValue(); }, setValue: function(value, text) { var fieldName = this.column.field; var dataObject = this.row.data; this.value = value; this.text = text; dataObject.setValue(fieldName, value); this.element.body.html(this.text || this.value); }, setControl: function(control) { this.addChild(control); } }); })(jQuery);