2013-04-22 4 views
1

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

Я использую jqGrid 4.4.4

ответ

2

Вопрос хороший, но ... текущая реализация группировки в 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 дисплей следующие результаты:

enter image description here

Я использовал в демо-версии 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 уровень группировку и отображает следующие результаты:

enter image description here

ОБНОВЛЕНО 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] позволяет настраивать информацию, отображаемую в заголовке группировки. В приведенном выше примере я преобразовываю данные в низкий регистр.

+0

Олег, большое спасибо за подробный ответ и запрос функции. Мне не нравится код forking, так как после этого становится очень сложно обновить до более новых версий. Таким образом, я решил проблему, добавив еще один скрытый столбец с данными в верхнем регистре и группировкой по этому столбцу. –

+0

@JonasStawski: Добро пожаловать! Я понимаю ваше обходное решение и вашу точку зрения. Тем не менее я рассматриваю проблему как общую. Я предложил перед многими функциями, которые теперь являются частью jqGrid, и это помогает другим людям. Надеюсь, что Тони (trirand) выполнит эту функцию, которую я предложил (неважно, будет ли она реализована так, как я предлагаю ее или каким-то другим способом). – Oleg

+0

Согласен. Надеюсь, это произойдет, и мне не придется его разветвлять, и я могу удалить свои хаки. –

Смежные вопросы