jqGrid Группировка состояния при фильтрации - PullRequest
5 голосов
/ 28 ноября 2011

Я использую фильтр для моей сетки jqGrid, и данные находятся в группах, по умолчанию первое состояние свернуто.Если пользователь открывает группу или 2 (расширяет группы), затем выполняет фильтр, сетка перезагружает данные, корректно фильтрует их, но затем я теряю расширенное состояние групп, которые открыл пользователь.Есть ли способ не иметь его, переключиться обратно в состояние по умолчанию, свернутый при выполнении фильтра?

Заранее спасибо.

1 Ответ

2 голосов
/ 30 ноября 2011

Мне интересен ваш вопрос. Так что +1 от меня. Я сделал демо, которое показывает, как реализовать ваши требования.

Основная идея реализации такая же, как в ответ . Я предлагаю просто держать состояние расширенных групп в массиве expandedGroups. Я использую onClickGroup callback, добавленный в jqGrid 4.0.0 (см. здесь ). Внутри loadComplete callback я пытаюсь развернуть все элементы из массива expandedGroups.

Преимущество реализации состоит в том, что расширенное состояние не исчезает во время подкачки, сортировки и фильтрации.

Демоверсию вы можете увидеть здесь . Ниже в коде из демки:

var $grid = $("#list"), expandedGroups = [];

$grid.jqGrid({
    // ... some jqGrid parameters
    grouping: true,
    groupingView: {
        groupField: ['name'],
        groupCollapse: true,
        groupDataSorted: true
    },
    onClickGroup: function (hid, collapsed) {
        var idPrefix = this.id + "ghead_", id, groupItem, i;
        if (hid.length > idPrefix.length && hid.substr(0, idPrefix.length) === idPrefix) {
            id = hid.substr(idPrefix.length);
            groupItem = this.p.groupingView.sortnames[0][id];
            if (typeof (groupItem) !== "undefined") {
                i = $.inArray(expandedGroups[i], groups);
                if (!collapsed && i < 0) {
                    expandedGroups.push(groupItem);
                } else if (collapsed && i >= 0) {
                    expandedGroups.splice(i, 1); // remove groupItem from the list
                }
            }
        }
    },
    loadComplete: function () {
        var $this = $(this), i, l, index, groups = this.p.groupingView.sortnames[0];
        for (i = 0, l = expandedGroups.length; i < l; i++) {
            index = groups.indexOf(expandedGroups[i]);
            if (i >= 0) {
                $this.jqGrid('groupingToggle', this.id + 'ghead_' + index);
            }
        }
    }
});
$grid.jqGrid('navGrid', '#pager', {add: false, edit: false, del: false}, {}, {}, {},
    {multipleSearch: true, multipleGroup: true, closeOnEscape: true, showQuery: true,
        closeAfterSearch: true});

ОБНОВЛЕНО : Модуль группировки jqGrid изменен во многих частях с момента моего первоначального ответа. Модифицированную демонстрацию можно найти здесь . Самую важную часть кода, которую можно использовать, можно увидеть ниже

grouping: true,
groupingView: {
    groupField: ["invdate"],
    groupCollapse: true,
    groupDataSorted: true
},
onClickGroup: function (hid, collapsed) {
    var idPrefix = this.id + "ghead_", i, groupid,
        $this = $(this),
        groups = $(this).jqGrid("getGridParam", "groupingView").groups,
        l = groups.length;

    if (!inOnClickGroup) {
        inOnClickGroup = true; // set to skip recursion
        for (i = 0; i < l; i++) {
            groupid = idPrefix + groups[i].idx + "_" + i;
            if (groupid !== hid) {
                $this.jqGrid("groupingToggle", groupid);
            }
        }
        inOnClickGroup = false;
    }
}

Переменная inOnClickGroup определяется во внешней области видимости.

...