javascript jquery internet-explorer jqgrid

javascript - Habilitar el botón Guardar en JQ Grid con InlineEditing y CellEdit



jquery internet-explorer (1)

No estoy seguro de qué quiere implementar exactamente, pero modifiqué su demostración a la siguiente https://jsfiddle.net/OlegKi/byygepy3/11/ . Incluyo el código JavaScript completo de la demostración a continuación

$(function () { var myData = [ { id: 10, ParameterName: "Test", ParameterValue: "" }, { id: 20, ParameterName: "Test 1", ParameterValue: "" }, { id: 30, ParameterName: "Test 2", ParameterValue: "" } ], $grid = $("#list"); // change the text displayed on editrules: {required: true } $.extend(true, $.jgrid.locales["en-US"].edit.msg, { required: "No value was entered for this parameter!!!" }); $grid.jqGrid({ datatype: "local", data: myData, colNames: ["", "Parameter Name", "Parameter Value"], colModel: [ { name: "act", template: "actions" }, // optional feature { name: "ParameterName" }, { name: "ParameterValue", editable: true, editoptions: { maxlength: 100 }, editrules: {required: true } } ], cmTemplate: { autoResizable: true }, autoResizing: { compact: true }, pager: true, pgbuttons: false, // disable page control like next, back button pgtext: null, // disable pager text like ''Page 0 of 10'' viewrecords: true, // disable current view record text like ''View 1-10 of 100'' sortname: "Name", iconSet: "fontAwesome", caption: ''Parameters'', autowidth: true, hidegrid: false, inlineEditing: { keys: true }, singleSelectClickMode: "selectonly", // prevent unselect once selected rows beforeSelectRow: function (rowid) { var $self = $(this), i, // savedRows array is not empty if some row is in inline editing mode savedRows = $self.jqGrid("getGridParam", "savedRow"); for (i = 0; i < savedRows.length; i++) { if (savedRows[i].id !== rowid) { // save currently editing row // one can replace saveRow to restoreRow in the next line $self.jqGrid("saveRow", savedRows[i].id); } } return savedRows.length === 0; // allow selection if saving successful }, onSelectRow: function (rowid) { $(this).jqGrid("editRow", rowid); }, afterSetRow: function (options) { var item = $(this).jqGrid("getLocalRow", options.rowid); if (item != null) { item.dirty = true; } }, navOptions: { edit: false, add: false, search: false, deltext: "Delete", refreshtext: "Refresh" }, inlineNavOptions: { save: true, savetext: "Save", cancel: false, restoreAfterSelect: false }, formDeleting: { // delete options url: window.g_baseUrl + ''MfgTransactions_MVC/COA/Delete?'', beforeSubmit: function () { // get value var selRowId = $(this).jqGrid(''getGridParam'', ''selrow''); var parametricValue = $(this).jqGrid(''getCell'', selRowId, ''ParameterValue''); // check if empty if (parametricValue === "") { return [false, "Cannot delete: No value exists for this parameter"]; } return [true, "Successfully deleted"]; }, delData: { batchId: function () { return $("#BatchId").val(); } }, closeOnEscape: true, closeAfterDelete: true, width: 400, msg: "Are you sure you want to delete the Parameter?", afterComplete: function (response) { if (response.responseText) { alert("response.responseText"); } //loadBatchListIntoGrid(); } } }).jqGrid(''navGrid'') .jqGrid(''inlineNav'') .jqGrid(''navButtonAdd'', { caption: "Save Changed", buttonicon: "fa-floppy-o", onClickButton: function () { var localData = $(this).jqGrid("getGridParam", "data"), dirtyData = $.grep(localData, function (item) { return item.dirty; }); alert(dirtyData.length > 0 ? JSON.stringify(dirtyData) : "no dirty data"); } }); // make more place for navigator buttons be rwducing the width of the right part var pagerIdSelector = $grid.jqGrid("getGridParam", "pager"); $(pagerIdSelector + "_right").width(100); // make the grid responsive $(window).bind("resize", function () { $grid.jqGrid("setGridWidth", $grid.closest(".container-fluid").width()); }).triggerHandler("resize"); });

donde está el código HTML

<div class="container-fluid"> <div class="row"> <div id="gridarea" class="col-md-6 col-md-offset-3"> <table id="list"></table> </div> </div> </div>

y código CSS

.ui-th-column>div, .ui-jqgrid-btable .jqgrow>td { word-wrap: break-word; /* IE 5.5+ and CSS3 */ white-space: pre-wrap; /* CSS3 */ white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ white-space: -pre-wrap; /* Opera 4-6 */ white-space: -o-pre-wrap; /* Opera 7 */ overflow: hidden; vertical-align: middle; }

Demuestra cómo se puede implementar el inicio de la edición en línea en la fila de selección. Además, agregué una columna opcional con la template: "actions" que puede ser una implementación alternativa. Configuré propiedades dirty en cada elemento de datos dentro de la devolución de llamada afterSetRow y agregué el botón "Guardar modificado", que usa localData = $(this).jqGrid("getGridParam", "data") y dirtyData = $.grep(localData, function (item) { return item.dirty; }); para obtener los datos sucios (modificados).

Hola, tengo una cuadrícula que usa la edición de celdas y la edición en línea. Se guarda en la matriz de clientes

$(''#list'').jqGrid({ datatype: "local", colNames: ["Parameter Id", "Parameter Name", ''Parameter Value''], colModel: [ { name: "Id", index: "Id", align: "left", key: true, editable: false,hidden:true, jmap: 0 }, { name: "ParameterName", index: "ParameterName", align: "left", editable: false, jmap: 1 }, { name: "ParameterValue", index: "ParameterValue", align: "left", editable: true, edittype: "text", editoptions: { maxlength: 100 }, editrules: {required: true }, jmap: 2 } ], pager: "#pager", rowNum: 100, rowList: [], pgbuttons: false, // disable page control like next, back button pgtext: null, // disable pager text like ''Page 0 of 10'' viewrecords: true, // disable current view record text like ''View 1-10 of 100'' height: ''100%'', scrollOffset: 0, sortname: "Name", sortorder: "Asc", gridview: true, caption: ''Parameters'', autowidth: true, hidegrid: false, loadonce: true, //beforeEditCell: function () { // $("#list_ilsave").removeClass(''ui-state-disabled''); // return; //}, //afterEditCell: function (rowid, cellname, value, iRow, iCol) { // $(''#list'').jqGrid(''getCell'', rowid, iCol).focus(); // return; //}, width: totalWidth, cellEdit: true, cellsubmit: "clientArray" }); $(''#list'').jqGrid(''inlineNav'', ''#pager'', { edit: false, add: false, del: false, save: true, savetext: ''Save'', cancel: false });

Cuando edito una celda, el botón Guardar permanece deshabilitado. Si habilito manualmente el botón en beforeCellEdit, la celda editable no tendrá foco hasta que seleccione otra celda. Este comportamiento solo ocurre en IE.

Intenté solucionar ambos problemas individualmente en mi código comentado, y descubrí que la pérdida de enfoque es causada por la línea

$("#list_ilsave").removeClass(''ui-state-disabled'');

Intenté colocar esta línea en beforeEditCell y afterEditCell y hace que el campo de entrada pierda el foco.

Estaba usando JQ Grid 4.4.4 y he intentado actualizar a 4.6.0 después de leer que había actualizaciones para la Edición en línea después de 4.4.4

ACTUALIZACIÓN He cambiado mi grilla para usar onSelectRow

onSelectRow: function (rowid) { var $grid = $(''#list''); var iRow = $("#" + rowid)[0].rowIndex; $grid.jqGrid(''editRow'', rowid, { keys: true, oneditfunc: function(rowid, response) { var $saveButton = $("#list_ilsave"); if ($saveButton.hasClass(''ui-state-disabled'')) { $saveButton.removeClass(''ui-state-disabled''); } markCellAsDirty(rowid, $grid); return true; }, successfunc: function() { alert(''success''); return true; }, aftersavefunc: function() { alert(''after save''); return true; }, errorfunc: function() { alert(''error''); return true; } }); }, cellsubmit: "clientArray"

Pero no puedo hacer que ninguno de los eventos editRow se oneditfunc excepto oneditfunc . También tengo un problema para obtener las celdas modificadas.

Este método marca las celdas como sucias / editadas

function markCellAsDirty(rowid, grid) { $(grid.jqGrid("setCell", rowid, "ParameterValue", "", "dirty-cell")); $(grid[0].rows.namedItem(rowid)).addClass("edited"); }

Intento obtener las celdas editadas de la siguiente manera

var editedRows = $grid.getChangedCells(''dirty'');

Antes de publicar editedRows en un método AJAX en mi servidor.