ExtJSのGridで特定行だけチェックできないようにする。

GridのselTypeをcheckboxmodelとした場合にGridにチェックボックス列が表示される。 これで、特定のレコードに対してはチェックボックスのチェックが出来ないようにしたい。

が、自前で頑張るしかないみたい。

Ext.define 'hoge.MySelectionModel',{
  extend: 'Ext.selection.CheckboxModel'
  alias: 'selection.xcheckboxmodel'
  renderer: ( value, metaData, record, rowIndex, colIndex, store, view ) ->
    # TODO パフォーマンスいまいち。
    view.up('grid').selectedItems.forEach (item)->
      record.disabled = true if item.getId() is record.getId()

    return '' if record.disabled
    @callParent(arguments)

などとしておいて、これを使う側で チェックしたくないレコードにはrecord.disabled = trueをどこかで設定しておく。

records = チェックしたくないモデルたち(disabled=true)
new Ext.grid.Panel
  selType: 'xcheckboxmodel'
  selectedItems: records
  ...

上記のコードを書くと、特定の行だけチェックボックスが表示されず、空白となる。

ただし、これだけだとヘッダの全選択するチェックボックスをクリックした場合に表示上は空白のままだが、内部的にレコードが選択状態になるため、もうちょっと工夫が必要。 とりあえず、選択後に上記のrecordsを使ってフィルタリングする等している。