如何使用免费的 jqgrid 属性有条件地添加操作按钮

How to use free jqgrid properties to conditionally add actions buttons

免费的 jqgrid 显示命令。已发布的订单应该有黄色背景并且只有打开操作按钮。 未posted 订单有白色背景、标准删除和自定义 post 操作按钮。

操作列的 colmodel:

{"hidden":false,"label":"Activity","name":"_actions","search":false,"width":94
,"sortable":false,"formatter":"actions","viewable":false,"formatoptions":{"editbutton":false,"onSuccess":function (jqXHR) { jqXHRFromOnSuccess=jqXHR;return true;}
,"delbutton":true,"delOptions":{"url":"http://localhost:52216/admin/Grid/Delete?_entity=DoklstlT","afterComplete":function (response, postdata, formid) { 
summarefresh($grid);
$grid[0].focus(); 
}
}}},

posted 状态由布尔 Kinnitatud 列确定:

{"label":null,"name":"Kinnitatud","index":"Kinnitatud","editoptions":{"value":"True:False","readonly":"readonly","disabled":"disabled"},"template":"booleanCheckboxFa","editable":true,"width":0,"classes":null,"hidden":true,"searchoptions":{"sopt":["eq","ne"],"value":":Free;true:Yes;false:No"},"dataEvents":[{"type":"focus","fn":function(e) {if(typeof e.target.ischanged=='undefined') {e.target.ischanged=false}}
},"",{"type":"click","fn":function(e) {dataChanged(e.target)}
},{"type":"blur","fn":function(e) {summarefresh()}
}]}],

在其他网格中 posted 状态由未填充的 Kinkuup 列确定 posted 文档:

{"template":DateTemplate
,"label":null,"name":"Kinkuup","index":"Kinkuup","editoptions":{"dataInit":null,"size":10,"readonly":"readonly","disabled":"disabled"},"searchoptions":{"dataInit":initDateSearch
,"size":10,"attr":{"size":10}},"width":0,"classes":null,"hidden":true,"dataEvents":[]}],

两列都可以在网格中隐藏或可见。取决于用户偏好。

在 loadComplete 中为所有行创建了自定义操作按钮:

       loadComplete: function() {
            var iCol = getColumnIndexByName($(this),'_actions');
            $(this).children("tbody").children("tr.jqgrow")
               .children("td:nth-child("+(iCol+1)+")")
               .each(function() {

                   $("<div>",
                     {
                         title: "Confirm (F2)",
                         mouseover: function() {
                             $(this).addClass('ui-state-hover');
                         },
                         mouseout: function() {
                             $(this).removeClass('ui-state-hover');
                         },
                         click: function(e) {
                             resetSelection();
                             idsOfSelectedRows = [$(e.target).closest("tr.jqgrow").attr("id")];
                             $("#grid").jqGrid('setSelection', $(e.target).closest("tr.jqgrow").attr("id"), false);
                             $('#grid_postbutton').click();
                         }
                     }
                ) 
                 .addClass("ui-pg-div ui-inline-post")
                 .append('<span class="fa ui-state-default fa-fw fa-lock"></span>')
                 .prependTo($(this).children("div"));


                   $("<div>",
                       {
                           title: "Open (Enter)",
                           mouseover: function() {
                               $(this).addClass('ui-state-hover');
                           },
                           mouseout: function() {
                               $(this).removeClass('ui-state-hover');
                           },
                           click: function(e) {
                               openDetail($(e.target).closest("tr.jqgrow").attr("id"));
                           }
                       }
                    )
                     .addClass("ui-pg-div ui-inline-open")
                     .append('<span class="fa ui-state-default fa-folder-open-o"></span>')
                     .prependTo($(this).children("div"));

               }); 

使用 中的代码有条件地删除按钮后,有条件地禁用行编辑并更改背景。

   disableRows('Kinkuup', false);
   disableRows('Kinnitatud', true);


 var disableRows = function (rowName, isBoolean) {
    var iCol = getColumnIndexByName($grid, rowName),
              cRows = $grid[0].rows.length,
              iRow,
              row,
              className,
              isPosted,
              mycell,
              mycelldata,
              cm = $grid.jqGrid('getGridParam', 'colModel'),
              iActionsCol = getColumnIndexByName($grid, '_actions'), l,
              isPostedStr;
    l = cm.length;
    for (iRow = 0; iRow < cRows; iRow = iRow + 1) {
        row = $grid[0].rows[iRow];
        className = row.className;
        if ($(row).hasClass('jqgrow')) {
            isPostedStr = $.unformat.call($grid[0], row.cells[iCol],
          { rowId: row.id, colModel: cm[iCol] }, iCol);
            //if (cm[iCol].convertOnSave) {
            //    isPosted = cm[iCol].convertOnSave.call(this, {
            //        newValue: isPostedStr,
            //        cm: cm[iCol],
            //        oldValue: isPostedStr,
            //        id: row.id,
            //        //item: $grid.jqGrid("getLocalRow", row.id),
            //        iCol: iCol
            //    });
            //}
            isPosted = isPostedStr !== "False" && isPostedStr.trim() !== "";

            if (isPosted) {
                if ($.inArray('jqgrid-postedrow', className.split(' ')) === -1) {
                    // todo: how to disable actions buttons and form editing:
                    row.className = className + ' jqgrid-postedrow not-editable-row';
                    $(row.cells[iActionsCol]).attr('editable', '0');
                    $(row.cells[iActionsCol]).find(">div>div.ui-inline-del").hide();
                    $(row.cells[iActionsCol]).find(">div>div.ui-inline-post").hide();
                    $(row.cells[iActionsCol]).find(">div>div.ui-inline-edit").hide();
                }
            }
        }
    }
};

如何使用免费的 jqgrid 操作选项来简化此代码?

如何创建统一的方式来隐藏标准编辑和删除以及用户定义的操作按钮?隐藏标准按钮仍然需要 DOM 修改,即使自定义按钮创建可以使用回调有条件地禁用。也许以相同的方式定义所有操作按钮。 也许可以使用现有的 rowattr 或 cellattr 回调或引入新回调来完成。

当前行只能在下面的代码中使用

读取
row.className = className + ' jqgrid-postedrow not-editable-row';
$(row.cells[iActionsCol]).attr('editable', '0');

为了完全删除 diableRows 是否合理? 也许 rowattr() 可以用来代替这个。

我在 formatter: "actions" 中做了一些更改以简化您的方案的实施。 The demo 展示了如何使用新功能。它显示如下图所示的网格

该演示将 colModel 中的操作列定义为

{ name: "act", template: "actions", align: "left", width: 58 }, // 58 = 2 + 18*3 + 2

并且它使用actionsNavOptions(也可以使用formatoptions)来配置formatter: "actions"的选项:

actionsNavOptions: {
    editbutton: false,
    custom: [
        { action: "open", position: "first",
            onClick: function (options) {
                alert("Open, rowid=" + options.rowid);
            } },
        { action: "post", position: "first",
            onClick: function (options) {
                alert("Post, rowid=" + options.rowid);
            } }
    ],
    posticon: "fa-lock",
    posttitle: "Confirm (F2)",
    openicon: "fa-folder-open-o",
    opentitle: "Open (Enter)",
    isDisplayButtons: function (options, rowData) {
        if (options.rowData.closed) { // or rowData.closed
            return { post: { hidden: true }, del: { display: false } };
        }
    }
}

数组 custom 定义的动作名称,positiononClick 回调。要定义自定义按钮的图标和标题(工具提示),应该指定靠近导航栏选项的选项。指定图标 class 的属性将从操作名称(上例中的 openpost 构造)和后缀 "icon" 以相同的方式定义按钮的 title 属性值。

回调 isDisplayButtons 允许通知 jqGrid 关于基于行数据和 rowid 显示按钮。 options 参数与您从自定义格式化程序中了解到的选项相同。 options.rowId 例如是rowid。最新版本的免费 jqGrid (post 4.8) 通过包含 rowData 扩展了选项。可以看到isDisplayButtons的第二个参数已经是rowData了。 options.rowDatarowData 之间的主要区别是数据格式。在使用 XML 的情况下,输入 rowData 参数是输入数据的 XML 项。另一方面,选项 options.rowDataobject,其属性类似于 colModel 中的 name 属性。特别是在使用 loadonce: true 和 XML 数据的情况下,使用 options.rowData 具有优势。在上面的演示中 options.rowDatarowData 是相同的。

回调 isDisplayButtons 应 return object 具有与操作名称 { post: {...}, open: {...}, del: {...}, edit: {...}, save: {...}, cancel: {} } 相同的属性。每个这样的 object 的属性可以是

  • hidden: true - 表示在列中包含按钮但将其隐藏。稍后可以显示该按钮。 savecancel 按钮默认隐藏。
  • display: false - 表示根本不包含该按钮。例如,返回 del: {display: false} 与选项 delbutton: false 具有相同的效果,但 del: {display: false} 仅适用于一行。
  • noHovering: true 可用于从指定的操作按钮中删除悬停效果(onmouseover="jQuery(this).addClass('ui-state-hover');" onmouseout="jQuery(this).removeClass('ui-state-hover');")。