/** * yvan.yvgrid.selection.js * @author luoyifan * 2019-07-16 */ 'use strict'; (function ($) { /** * 获取指定的行编号的对应数据 * 如果不设置参数就获取当前或被选中的行数据 */ function getSelected($dom, rowIndex) { if ($.type(rowIndex) === 'undefined') { rowIndex = getSelectedRowIndex($dom); } return $dom.jqxGrid('getrowdata', rowIndex); } /** * 获取当前选中的行编号 */ function getSelectedRowIndex($dom) { return $dom.jqxGrid('selectedrowindex'); //var state = $.data($dom[0], 'yvgrid'); //var option = state.options; //return option.selectedRowId; } function onSelect(event, targetBoundIndex) { var $dom = $(this); //点击的列是__CB__ 就忽略 if (event && event.args && event.args.column && event.args.column.datafield === '__CB__') { $.fn.yvgrid.selection.toggleCheckbox($dom, targetBoundIndex); return; } //检查跳转目标是否有效 var data = getSelected.call(this, $dom, targetBoundIndex); if ($.type(data) === 'undefined' || $.type(data.boundindex) === 'undefined') { return; } var state = $.data($dom[0], 'yvgrid'); var option = state.options; var oldIndex = getSelectedRowIndex($dom); if ($dom.yvgrid('isEditing') && oldIndex === targetBoundIndex) { //编辑中的表格,如果跳转目标与当前行一致,就取消跳转 return; } //console.log('onSelect type:' + event.type + ', oldIndex:' + oldIndex + ', newIndex:' + targetBoundIndex); //如果是 bindingcomplete 事件(切换数据源)造成的切换行动作, 就不用检测是否允许跳转了 if (event.type !== 'bindingcomplete') { //询问 edit 是否取消 select 动作 var ret = $.fn.yvgrid.edit.beforeSelect.call(this, event, targetBoundIndex); if (ret === false) { return; } if ($.type(option.onBeforeSelect) === 'function') { //询问外部程序,是否取消 select 动作 ret = option.onBeforeSelect.call(this, targetBoundIndex, oldIndex, event); if (ret === false) { return; } } } //跳转行 $dom.jqxGrid('unselectrow', oldIndex); $dom.jqxGrid('selectrow', targetBoundIndex); $dom.jqxGrid('ensurerowvisible', targetBoundIndex); //通知跳转完毕 if ($.type(option.onSelect) === 'function') { option.onSelect.call(this, targetBoundIndex, data, event); } if ($.type(option.onSelectRow) === 'function') { option.onSelectRow.call(this, targetBoundIndex, data, event); } } function hideCheckboxColumn(event) { if (!$(this).jqxGrid('editable')) { $(this).jqxGrid('hidecolumn', '_checkboxcolumn'); } } $.extend($.fn.yvgrid.methods, { /** * 获取指定的行编号的对应数据 * 如果不设置参数就获取当前或被选中的行数据 */ rowData: function($dom){ return $dom.jqxGrid('getrows'); }, currentRowData: getSelected, getSelected: getSelected, /** * 获取当前选中的行编号 */ getSelectedRowIndex: getSelectedRowIndex, /** * 选择一行数据 */ selectRow: function (jq, rowIndex) { jq.each(function () { onSelect.call(this, { type: 'api' }, rowIndex); }); }, }); $.fn.yvgrid.selection = { setCheckboxById: function ($dom, id, value) { var state = $.data($dom[0], 'yvgrid'); if (!state) return; $dom.jqxGrid('setcellvaluebyid', id, "__CB__", value); var option = state.options; if ($.type(option.onCheckedChange) === 'function') { var row = $dom.jqxGrid('getrowdatabyid', id); if (row) { option.onCheckedChange.call($dom[0], id, value, row); } } }, setCheckbox: function ($dom, targetBoundIndex, value) { var state = $.data($dom[0], 'yvgrid'); if (!state) return; $dom.jqxGrid('setcellvalue', targetBoundIndex, "__CB__", value); var option = state.options; if ($.type(option.onCheckedChange) === 'function') { var id = $dom.jqxGrid('getrowid', targetBoundIndex); var row = $dom.jqxGrid('getrowdata', targetBoundIndex); if (row) { option.onCheckedChange.call($dom[0], id, value, row); } } }, getCheckbox: function ($dom, targetBoundIndex) { return $dom.jqxGrid('getcellvalue', targetBoundIndex, "__CB__"); }, toggleCheckbox: function ($dom, targetBoundIndex) { var value = $.fn.yvgrid.selection.getCheckbox($dom, targetBoundIndex); if (value) { $.fn.yvgrid.selection.setCheckbox($dom, targetBoundIndex, false); } else { $.fn.yvgrid.selection.setCheckbox($dom, targetBoundIndex, true); } }, handlekeyboardnavigation: function (event) { switch (event.keyCode) { case 33: case 34: if (event.keyCode === 33) { //page up } else if (event.keyCode === 40) { //page down } break; case 35: case 36: if (event.target.tagName === 'INPUT') { //输入框里面按下的 home/end 键忽略 return; } case 38: case 40: var $dom = $(this.element); var rowindex = getSelectedRowIndex($dom); var vi = $dom.jqxGrid('getrowvisibleindex', rowindex); if (event.keyCode === 38) { //index--; //上 vi--; } else if (event.keyCode === 40) { //index++; //下 vi++; } else if (event.keyCode === 36) { //home vi = 0; } else if (event.keyCode === 35) { //end vi = $dom.jqxGrid('getdisplayrows').length - 1; } var boundIndex = $dom.jqxGrid('getrowboundindex', vi); onSelect.call(this.element, event, boundIndex); return true; } }, gridOption: function ($dom, easyuiOpt, jqxOpt) { $.extend(jqxOpt, { selectionmode: 'checkbox' }); delete jqxOpt.onBeforeSelect; delete jqxOpt.onSelect; delete jqxOpt.rownumbers; delete jqxOpt.loadComplete; $dom.on('initialized', function (event) { hideCheckboxColumn.call(this, event); }); $dom.on('bindingcomplete', function (event) { hideCheckboxColumn.call(this, event); var $grid = $(this); if ($.type(easyuiOpt.loadComplete) === 'function') { easyuiOpt.loadComplete.call(this, arguments); } if (easyuiOpt.autoSizeColumns) { $grid.jqxGrid('autoresizecolumns', 'all'); } if (easyuiOpt.rownumbers) { if (!easyuiOpt.editable) { $grid.jqxGrid('autoresizecolumn', '__NO__', 'all'); } } if (easyuiOpt.checkbox) { $grid.jqxGrid('setcolumnproperty', '__CB__', 'width', 40); } var source = $grid.jqxGrid('source')._source; //默认选中第一行 var newIndex = undefined; if (source.records) { source.records.every(function (item) { newIndex = item.boundindex; return false; }); } if ($.type(newIndex) !== 'undefined') { onSelect.call(this, event, newIndex); } }); $dom.on('cellclick', function (event) { onSelect.call(this, event, event.args.rowindex); }); } }; })(jQuery);