| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517 |
- (function($){
- $.extend($.fn.datagrid.defaults, {
- clickToEdit: true,
- dblclickToEdit: false,
- navHandler: {
- '37': function(e){
- var opts = $(this).datagrid('options');
- return navHandler.call(this, e, opts.isRtl?'right':'left');
- },
- '39': function(e){
- var opts = $(this).datagrid('options');
- return navHandler.call(this, e, opts.isRtl?'left':'right');
- },
- '38': function(e){
- return navHandler.call(this, e, 'up');
- },
- '40': function(e){
- return navHandler.call(this, e, 'down');
- },
- '13': function(e){
- return enterHandler.call(this, e);
- },
- '27': function(e){
- return escHandler.call(this, e);
- },
- '8': function(e){
- return clearHandler.call(this, e);
- },
- '46': function(e){
- return clearHandler.call(this, e);
- },
- 'keypress': function(e){
- if (e.metaKey || e.ctrlKey){
- return;
- }
- var dg = $(this);
- var param = dg.datagrid('cell'); // current cell information
- if (!param){return;}
- var input = dg.datagrid('input', param);
- if (!input){
- var tmp = $('<span></span>');
- tmp.html(String.fromCharCode(e.which));
- var c = tmp.text();
- tmp.remove();
- if (c){
- dg.datagrid('editCell', {
- index: param.index,
- field: param.field,
- value: c
- });
- return false;
- }
- }
- }
- },
- onBeforeCellEdit: function(index, field){},
- onCellEdit: function(index, field, value){
- var input = $(this).datagrid('input', {index:index, field:field});
- if (input){
- if (value != undefined){
- input.val(value);
- }
- }
- },
- onSelectCell: function(index, field){},
- onUnselectCell: function(index, field){}
- });
- function navHandler(e, dir){
- var dg = $(this);
- var param = dg.datagrid('cell');
- var input = dg.datagrid('input', param);
- if (!input){
- dg.datagrid('gotoCell', dir);
- return false;
- }
- }
- function enterHandler(e){
- var dg = $(this);
- var cell = dg.datagrid('cell');
- if (!cell){return;}
- var input = dg.datagrid('input', cell);
- if (input){
- if (input[0].tagName.toLowerCase() == 'textarea'){
- return;
- }
- endCellEdit(this, true);
- } else {
- dg.datagrid('editCell', cell);
- }
- return false;
- }
- function escHandler(e){
- endCellEdit(this, false);
- return false;
- }
- function clearHandler(e){
- var dg = $(this);
- var param = dg.datagrid('cell');
- if (!param){return;}
- var input = dg.datagrid('input', param);
- if (!input){
- dg.datagrid('editCell', {
- index: param.index,
- field: param.field,
- value: ''
- });
- return false;
- }
- }
- function getCurrCell(target){
- var cell = $(target).datagrid('getPanel').find('td.datagrid-row-selected');
- if (cell.length){
- return {
- index: parseInt(cell.closest('tr.datagrid-row').attr('datagrid-row-index')),
- field: cell.attr('field')
- };
- } else {
- return null;
- }
- }
- function unselectCell(target, p){
- var opts = $(target).datagrid('options');
- var cell = opts.finder.getTr(target, p.index).find('td[field="'+p.field+'"]');
- cell.removeClass('datagrid-row-selected');
- opts.onUnselectCell.call(target, p.index, p.field);
- }
- function unselectAllCells(target){
- var panel = $(target).datagrid('getPanel');
- panel.find('td.datagrid-row-selected').removeClass('datagrid-row-selected');
- }
- function selectCell(target, p){
- var opts = $(target).datagrid('options');
- if (opts.singleSelect){
- unselectAllCells(target);
- }
- var cell = opts.finder.getTr(target, p.index).find('td[field="'+p.field+'"]');
- cell.addClass('datagrid-row-selected');
- opts.onSelectCell.call(target, p.index, p.field);
- }
- function getSelectedCells(target){
- var cells = [];
- var panel = $(target).datagrid('getPanel');
- panel.find('td.datagrid-row-selected').each(function(){
- var td = $(this);
- cells.push({
- index: parseInt(td.closest('tr.datagrid-row').attr('datagrid-row-index')),
- field: td.attr('field')
- });
- });
- return cells;
- }
- function gotoCell(target, p){
- var dg = $(target);
- var opts = dg.datagrid('options');
- var panel = dg.datagrid('getPanel').focus();
- var cparam = dg.datagrid('cell');
- if (cparam){
- var input = dg.datagrid('input', cparam);
- if (input){
- input.focus();
- return;
- }
- }
- if (typeof p == 'object'){
- _go(p);
- return;
- }
- var cell = panel.find('td.datagrid-row-selected');
- if (!cell){return;}
- var fields = dg.datagrid('getColumnFields',true).concat(dg.datagrid('getColumnFields'));
- var field = cell.attr('field');
- var tr = cell.closest('tr.datagrid-row');
- var rowIndex = parseInt(tr.attr('datagrid-row-index'));
- var colIndex = $.inArray(field, fields);
- if (p == 'up' && rowIndex > 0){
- rowIndex--;
- } else if (p == 'down'){
- if (opts.finder.getRow(target, rowIndex+1)){
- rowIndex++;
- }
- } else if (p == 'left'){
- var i = colIndex - 1;
- while(i >= 0){
- var col = dg.datagrid('getColumnOption', fields[i]);
- if (!col.hidden){
- colIndex = i;
- break;
- }
- i--;
- }
- } else if (p == 'right'){
- var i = colIndex + 1;
- while(i <= fields.length-1){
- var col = dg.datagrid('getColumnOption', fields[i]);
- if (!col.hidden){
- colIndex = i;
- break;
- }
- i++;
- }
- }
- field = fields[colIndex];
- _go({index:rowIndex, field:field});
- function _go(p){
- dg.datagrid('scrollTo', p.index);
- unselectAllCells(target);
- selectCell(target, p);
- var td = opts.finder.getTr(target, p.index, 'body', 2).find('td[field="'+p.field+'"]');
- if (td.length){
- var body2 = dg.data('datagrid').dc.body2;
- var left = td.position().left;
- if (left < 0){
- body2._scrollLeft(body2._scrollLeft() + left*(opts.isRtl?-1:1));
- } else if (left+td._outerWidth()>body2.width()){
- body2._scrollLeft(body2._scrollLeft() + (left+td._outerWidth()-body2.width())*(opts.isRtl?-1:1));
- }
- }
- }
- }
- // end the current cell editing
- function endCellEdit(target, accepted){
- var dg = $(target);
- var cell = dg.datagrid('cell');
- if (cell){
- var input = dg.datagrid('input', cell);
- if (input){
- if (accepted){
- if (dg.datagrid('validateRow', cell.index)){
- dg.datagrid('endEdit', cell.index);
- dg.datagrid('gotoCell', cell);
- } else {
- dg.datagrid('gotoCell', cell);
- input.focus();
- return false;
- }
- } else {
- dg.datagrid('cancelEdit', cell.index);
- dg.datagrid('gotoCell', cell);
- }
- }
- }
- return true;
- }
- function editCell(target, param){
- var dg = $(target);
- var opts = dg.datagrid('options');
- var input = dg.datagrid('input', param);
- if (input){
- dg.datagrid('gotoCell', param);
- input.focus();
- return;
- }
- if (!endCellEdit(target, true)){return;}
- if (opts.onBeforeCellEdit.call(target, param.index, param.field) == false){
- return;
- }
- var fields = dg.datagrid('getColumnFields',true).concat(dg.datagrid('getColumnFields'));
- $.map(fields, function(field){
- var col = dg.datagrid('getColumnOption', field);
- col.editor1 = col.editor;
- if (field != param.field){
- col.editor = null;
- }
- });
- var col = dg.datagrid('getColumnOption', param.field);
- if (col.editor){
- dg.datagrid('beginEdit', param.index);
- var input = dg.datagrid('input', param);
- if (input){
- dg.datagrid('gotoCell', param);
- setTimeout(function(){
- input.unbind('.cellediting').bind('keydown.cellediting', function(e){
- if (e.keyCode == 13){
- return opts.navHandler['13'].call(target, e);
- // return false;
- }
- });
- input.focus();
- }, 0);
- opts.onCellEdit.call(target, param.index, param.field, param.value);
- } else {
- dg.datagrid('cancelEdit', param.index);
- dg.datagrid('gotoCell', param);
- }
- } else {
- dg.datagrid('gotoCell', param);
- }
- $.map(fields, function(field){
- var col = dg.datagrid('getColumnOption', field);
- col.editor = col.editor1;
- });
- }
- function enableCellSelecting(target){
- var dg = $(target);
- var state = dg.data('datagrid');
- var panel = dg.datagrid('getPanel');
- var opts = state.options;
- var dc = state.dc;
- panel.attr('tabindex',1).css('outline-style','none').unbind('.cellediting').bind('keydown.cellediting', function(e){
- var h = opts.navHandler[e.keyCode];
- if (h){
- return h.call(target, e);
- }
- });
- dc.body1.add(dc.body2).unbind('.cellediting').bind('click.cellediting', function(e){
- var tr = $(e.target).closest('.datagrid-row');
- if (tr.length && tr.parent().length){
- var td = $(e.target).closest('td[field]', tr);
- if (td.length){
- var index = parseInt(tr.attr('datagrid-row-index'));
- var field = td.attr('field');
- var p = {
- index: index,
- field: field
- };
- if (opts.singleSelect){
- selectCell(target, p);
- } else {
- if (opts.ctrlSelect){
- if (e.ctrlKey){
- if (td.hasClass('datagrid-row-selected')){
- unselectCell(target, p);
- } else {
- selectCell(target, p);
- }
- } else {
- unselectAllCells(target);
- selectCell(target, p);
- }
- } else {
- if (td.hasClass('datagrid-row-selected')){
- unselectCell(target, p);
- } else {
- selectCell(target, p);
- }
- }
- }
- }
- }
- }).bind('mouseover.cellediting', function(e){
- var td = $(e.target).closest('td[field]');
- if (td.length){
- td.addClass('datagrid-row-over');
- td.closest('tr.datagrid-row').removeClass('datagrid-row-over');
- }
- }).bind('mouseout.cellediting', function(e){
- var td = $(e.target).closest('td[field]');
- td.removeClass('datagrid-row-over');
- });
- opts.isRtl = dg.datagrid('getPanel').css('direction').toLowerCase()=='rtl';
- opts.OldOnBeforeSelect = opts.onBeforeSelect;
- opts.onBeforeSelect = function(){
- return false;
- };
- dg.datagrid('clearSelections');
- }
- function disableCellSelecting(target){
- var dg = $(target);
- var state = dg.data('datagrid');
- var panel = dg.datagrid('getPanel');
- var opts = state.options;
- opts.onBeforeSelect = opts.OldOnBeforeSelect || opts.onBeforeSelect;
- panel.unbind('.cellediting').find('td.datagrid-row-selected').removeClass('datagrid-row-selected');
- var dc = state.dc;
- dc.body1.add(dc.body2).unbind('.cellediting');
- }
- function enableCellEditing(target){
- var dg = $(target);
- var opts = dg.datagrid('options');
- var panel = dg.datagrid('getPanel');
- panel.attr('tabindex',1).css('outline-style','none').unbind('.cellediting').bind('keydown.cellediting', function(e){
- var h = opts.navHandler[e.keyCode];
- if (h){
- return h.call(target, e);
- }
- }).bind('keypress.cellediting', function(e){
- return opts.navHandler['keypress'].call(target, e);
- });
- panel.panel('panel').unbind('.cellediting').bind('keydown.cellediting', function(e){
- e.stopPropagation();
- }).bind('keypress.cellediting', function(e){
- e.stopPropagation();
- }).bind('mouseover.cellediting', function(e){
- var td = $(e.target).closest('td[field]');
- if (td.length){
- td.addClass('datagrid-row-over');
- td.closest('tr.datagrid-row').removeClass('datagrid-row-over');
- }
- }).bind('mouseout.cellediting', function(e){
- var td = $(e.target).closest('td[field]');
- td.removeClass('datagrid-row-over');
- });
- opts.isRtl = dg.datagrid('getPanel').css('direction').toLowerCase()=='rtl';
- opts.oldOnClickCell = opts.onClickCell;
- opts.oldOnDblClickCell = opts.onDblClickCell;
- opts.onClickCell = function(index, field, value){
- if (opts.clickToEdit){
- $(this).datagrid('editCell', {index:index,field:field});
- } else {
- if (endCellEdit(this, true)){
- $(this).datagrid('gotoCell', {
- index: index,
- field: field
- });
- }
- }
- opts.oldOnClickCell.call(this, index, field, value);
- }
- if (opts.dblclickToEdit){
- opts.onDblClickCell = function(index, field, value){
- $(this).datagrid('editCell', {index:index,field:field});
- opts.oldOnDblClickCell.call(this, index, field, value);
- }
- }
- opts.OldOnBeforeSelect = opts.onBeforeSelect;
- opts.onBeforeSelect = function(){
- return false;
- };
- dg.datagrid('clearSelections')
- }
- function disableCellEditing(target){
- var dg = $(target);
- var panel = dg.datagrid('getPanel');
- var opts = dg.datagrid('options');
- opts.onClickCell = opts.oldOnClickCell || opts.onClickCell;
- opts.onDblClickCell = opts.oldOnDblClickCell || opts.onDblClickCell;
- opts.onBeforeSelect = opts.OldOnBeforeSelect || opts.onBeforeSelect;
- panel.unbind('.cellediting').find('td.datagrid-row-selected').removeClass('datagrid-row-selected');
- panel.panel('panel').unbind('.cellediting');
- }
- $.extend($.fn.datagrid.methods, {
- editCell: function(jq, param){
- return jq.each(function(){
- editCell(this, param);
- });
- },
- isEditing: function(jq, index){
- var opts = $.data(jq[0], 'datagrid').options;
- var tr = opts.finder.getTr(jq[0], index);
- return tr.length && tr.hasClass('datagrid-row-editing');
- },
- gotoCell: function(jq, param){
- return jq.each(function(){
- gotoCell(this, param);
- });
- },
- enableCellEditing: function(jq){
- return jq.each(function(){
- enableCellEditing(this);
- });
- },
- disableCellEditing: function(jq){
- return jq.each(function(){
- disableCellEditing(this);
- });
- },
- enableCellSelecting: function(jq){
- return jq.each(function(){
- enableCellSelecting(this);
- });
- },
- disableCellSelecting: function(jq){
- return jq.each(function(){
- disableCellSelecting(this);
- });
- },
- input: function(jq, param){
- if (!param){return null;}
- var ed = jq.datagrid('getEditor', param);
- if (ed){
- var t = $(ed.target);
- if (t.hasClass('textbox-f')){
- t = t.textbox('textbox');
- }
- return t;
- } else {
- return null;
- }
- },
- cell: function(jq){ // get current cell info {index,field}
- return getCurrCell(jq[0]);
- },
- getSelectedCells: function(jq){
- return getSelectedCells(jq[0]);
- }
- });
- })(jQuery);
|