Вопрос хороший, но ... текущая реализация группировки в jqGrid позволяет группировать только точных значения. Я помню тесные требования, когда хотелось бы группировать по месяцам вместо точной даты.
После некоторого анализа исходного кода jqGrid я надеюсь, что нашел очень простой и очень гибкий способ сделать более гибкую группировку. Я предлагаю изменить the line
if(typeof v !== "object" && grp.lastvalues[i] !== v) {
в
if (typeof v !== "object" &&
($.isFunction(grp.isInTheSameGroup) ?
!grp.isInTheSameGroup(grp.lastvalues[i], v) :
grp.lastvalues[i] !== v)) {
После этого можно определить isInTheSameGroup
функцию внутри groupingView
:
grouping: true,
groupingView: {
...
groupField: ["name"], // the column by which we group
isInTheSameGroup: function (x, y) {
return String(x).toLowerCase() === String(y).toLowerCase();
}
}
The demo дисплей следующие результаты:
Я использовал в демо-версии jquery.jqGrid.src.js
jqGrid 4.4.5. Версия jquery.jqGrid.src.js
из jqGrid 4.4.4 изменена так же, как вы можете найти here.
Я отправлю позже мое предложение в trirand. Надеюсь, что следующая версия jqGrid будет содержать эту функцию.
ОБНОВЛЕНО: Как и было обещано, я отправил the corresponding feature request в trirand.
ОБНОВЛЕНО 2: Я отправил the pull request с небольшими изменениями в модуле группировки jqGrid. The demo демонстрирует, как можно использовать новые функции. Он использует 2 уровень группировку и отображает следующие результаты:
ОБНОВЛЕНО 3: The pull request, которую я послал к trirand слито теперь к основной коде jqGrid. Таким образом, следующая версия jqGrid (после 4.4.5) будет поддерживать isInTheSameGroup
и formatDisplayField
массивы обратных вызовов внутри groupingView
. Если ваш случай это будет выглядеть
groupingView: {
groupField: ['name'],
formatDisplayField: [
function (displayValue) { //, value, cm, index, grp) {
return String(displayValue).toLowerCase();
}
],
groupColumnShow: [true],
groupDataSorted: true,
isInTheSameGroup: [
function (x, y) {
return String(x).toLowerCase() === String(y).toLowerCase();
}
]
}
обратных вызовов isInTheSameGroup[0]
и formatDisplayField[0]
будет использоваться группировка по groupField[0]
. Поскольку jqGrid поддерживает многоуровневую группировку, свойства isInTheSameGrou
и formatDisplayField
являются массивами функций обратного вызова, а не только функцией обратного вызова.
В начале группировки jqGrid sort данные группировкой столбцов. Для настройки первого шага можно использовать sorttype
(см. the answer). Я не знаю об этом во время написания вашего ответа. Вероятно, использование sorttype: function (cellvalue) {return String(cellvalue).toLowerCase();}
может решить вашу проблему.
Тогда функция isInTheSameGroup[level]
будет использоваться для сравнения значения столбца группировки из предыдущей строки с соответствующим значением текущей строки. Функция isInTheSameGroup[level]
будет вызываться со значениями. Если ваш обратный вызов возвращает true
, тогда строка будет сгруппирована с предыдущей.
Обратный вызов formatDisplayField[level]
позволяет настраивать информацию, отображаемую в заголовке группировки. В приведенном выше примере я преобразовываю данные в низкий регистр.
Олег, большое спасибо за подробный ответ и запрос функции. Мне не нравится код forking, так как после этого становится очень сложно обновить до более новых версий. Таким образом, я решил проблему, добавив еще один скрытый столбец с данными в верхнем регистре и группировкой по этому столбцу. –
@JonasStawski: Добро пожаловать! Я понимаю ваше обходное решение и вашу точку зрения. Тем не менее я рассматриваю проблему как общую. Я предложил перед многими функциями, которые теперь являются частью jqGrid, и это помогает другим людям. Надеюсь, что Тони (trirand) выполнит эту функцию, которую я предложил (неважно, будет ли она реализована так, как я предлагаю ее или каким-то другим способом). – Oleg
Согласен. Надеюсь, это произойдет, и мне не придется его разветвлять, и я могу удалить свои хаки. –