jqGrid subgrid и editable

DIG

Новичок
Партнер клуба
Здравствуйте, уважаемые!

Наверное вопрос глупый, но у меня толи глаз замылился, толи я отупел уже вконец, бьюсь второй день.

Вот пример прямо из вики jqgrid. Я добавил в самую простую таблицу subgrid и сделал некоторые поля редактируемыми.
Понимаю что так делать нельзя и никто в коде рытся не будет, но вставлю код целиком чтобы можно было его легко скопипастить и попробовать у себя.
PHP:
<table id="list4"></table>
<script type="text/javascript">
var lastsel;
jQuery("#list4").jqGrid({
	datatype: "local",
	height: 250,
   	colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'],
   	colModel:[
   		{name:'id',index:'id',width:60, sorttype:"int"},
   		{name:'invdate',index:'invdate', width:90, sorttype:"date",editable:true},
   		{name:'name',index:'name', width:100,editable:true},
   		{name:'amount',index:'amount', width:80, align:"right",sorttype:"float",editable:true},
   		{name:'tax',index:'tax', width:80, align:"right",sorttype:"float"},		
   		{name:'total',index:'total', width:80,align:"right",sorttype:"float"},		
   		{name:'note',index:'note', width:150, sortable:false}
   	],
	subGrid : true, //Если здесь поставить false - то всё работает правильно
    subGridModel: [{ name  : ['No','Item','Qty','Unit','Line Total'],
                    width : [55,200,80,80,80] } 
    ],
	onSelectRow: function(id){
		if(id && id!==lastsel){
			jQuery('#list4').jqGrid('restoreRow',lastsel);
			jQuery('#list4').jqGrid('editRow',id,true);
			lastsel=id;
		}
	},
   	caption: "Manipulating Array Data"
});
var mydata = [
		{id:"1",invdate:"2007-10-01",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
		{id:"2",invdate:"2007-10-02",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
		{id:"3",invdate:"2007-09-01",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"},
		];
for(var i=0;i<=mydata.length;i++)
	jQuery("#list4").jqGrid('addRowData',i+1,mydata[i]);
</script>
На всякий случай - все это я кручу в kohane, подключаю скрипты и стили так:
PHP:
<?php echo HTML::style('assets/css/ui-lightness/jquery-ui-1.8.16.custom.css'), PHP_EOL ?>
<?php echo HTML::style('assets/css/ui.jqgrid.css'), PHP_EOL ?>
<?php echo HTML::script('assets/js/jquery-1.6.2.min.js'), PHP_EOL ?>
<?php echo HTML::script('assets/js/grid.locale-ru.js'), PHP_EOL ?>
<?php echo HTML::script('assets/js/jquery.jqGrid.min.js'), PHP_EOL ?>
Суть проблемы вот в чем - если убрать подтаблицу - то редактируемые поля по клику выбираются правильно, если добавить подтаблицу - выбираются для редактирования другие поля, которые не обозначены как editable:true. Происходит смещение, как я понимаю изза добавлдения колонки с "+". Для наглядности картинки.
1. Без subgrid

2. C subgrid.


Может ктото просто по картинкам даже вспомнит как это побороть?
 

Вложения

  • 33,3 KB Просмотры: 1
  • 33,3 KB Просмотры: 1

~WR~

Новичок
Да это явный баг. Скорее всего связан с тем, что код модуля subgrid выполняется позже, чем inline edit.
Соответственно edit не знает, что ему добавили еще одну колонку в colModel.

Если стоит не последняя версия jqGrid, то поставьте последнюю.
Если не полечится, то нужно отрепортить tony - он поправит.

Как временный вариант - попробуйте задавать editable: true при помощи setColProp уже после инициализации грида.

Или, еще лучше, сделать схему Grid as Subgrid. Из subgrid'а при этом убрать заголовок, тулбары и все контролы. Получите почти то же самое, только лучше. Простой (старый) subgrid, по сути, дикий кастрат. Я бы его вообще выбросил за ненадобностью. Только людей смущает.
 

DIG

Новичок
Партнер клуба
~WR~
Спасибо за ответ. Попробовал при помощи setColProp так :
PHP:
gridComplete: function(){
      jQuery("#list4").setColProp('invdate',{editable:true});
}
Из описания всех колонок editable:true убрал.

Не помогло. Результат точно такойже. Может нужно не gridComplete использовать, а чтото дуругое... Еще поэксперементирую.

И, да, у меня в боевом примере именно Grid as Subgrid сделан, но сути это не меняет. Это я тут упростил чтобы можно было воспроизвести проще.
 

~WR~

Новичок
Попробовал у себя повторить проблему - не получилось. Все работает.
Вот пример: http://jqgrid-php.net/examples/?render=jqMiscSubgrid

Также залез в код. Вот то, что у меня в grid.inlineedit.js:

PHP:
if (editable == "0" && !$(ind).hasClass("not-editable-row")) {
	cm = $t.p.colModel;
	$('td[role="gridcell"]',ind).each( function(i) {
		nm = cm[i].name;
		var treeg = $t.p.treeGrid===true && nm == $t.p.ExpandColumn;
		if(treeg) { tmp = $("span:first",this).html();}
		else {
			try {
				tmp =  $.unformat(this,{rowId:rowid, colModel:cm[i]},i);
			} catch (_) {
				tmp =  ( cm[i].edittype && cm[i].edittype == 'textarea' ) ? $(this).text() : $(this).html();
			}
		}
		if ( nm != 'cb' && nm != 'subgrid' && nm != 'rn') {
			if($t.p.autoencode) { tmp = $.jgrid.htmlDecode(tmp); }
			svr[nm]=tmp;
			if(cm[i].editable===true) {
				if(focus===null) { focus = i; }
				if (treeg) { $("span:first",this).html(""); }
				else { $(this).html(""); }
				var opt = $.extend({},cm[i].editoptions || {},{id:rowid+"_"+nm,name:nm});
				if(!cm[i].edittype) { cm[i].edittype = "text"; }
				if(tmp == "&nbsp;" || tmp == "&#160;" || (tmp.length==1 && tmp.charCodeAt(0)==160) ) {tmp='';}
				var elc = $.jgrid.createEl(cm[i].edittype,opt,tmp,true,$.extend({},$.jgrid.ajaxOptions,$t.p.ajaxSelectOptions || {}));
				$(elc).addClass("editable");
				if(treeg) { $("span:first",this).append(elc); }
				else { $(this).append(elc); }
				//Again IE
				if(cm[i].edittype == "select" && typeof(cm[i].editoptions)!=="undefined" && cm[i].editoptions.multiple===true  && typeof(cm[i].editoptions.dataUrl)==="undefined" && $.browser.msie) {
					$(elc).width($(elc).width());
				}
				cnt++;
			}
		}
	});
Все условия на subgrid - в наличии.
В теории, могут быть проблемы, если индексы td[role=gridcell] не будут соответствовать индексам колонок в colModel. Но этого вроде тоже нет. У вас даже hidden колонок нет.

Все же, какая у вас версия? Я смотрю на 4.3.1.
 

DIG

Новичок
Партнер клуба
~WR~ cпасибо еще раз. У меня версия 4.3.0. Вот я лошара... Изза такой мелочи два дня псу под хвост.
Обновился, всё заработало "искаропки", тему можно закрывать.
 
Сверху