ag-Gridのバージョンアップ作業でchangelogを眺めていたらいくつか気になったものがあったので試してみます
今までだとカスタムコンポーネントでフィルターをフルカスタムすることもできますがちょっと条件変えたいといった場合にまでコンポーネントを用意してカスタムフィルターを実装する感じでした
20.1で設定と関数だけ実装するだけでカスタムフィルターを実現することができるようになったようです
Column Filter: Core Feature of our Datagrid
早速試してみます
最終イメージは下記
難しいことは何もなく下記のようなcolDefを定義するだけでOKです
filterParams.filterOptionsがフィルターのリストなので複数定義できます
tset
の箇所がコールバックでフィルターのロジックを記述します
cellValue
に渡ってくる値がオブジェクトを想定していたのですが強制的にstringになってしまうようでそのまま渡すと[object Object]
となってしまいます
なのでfilterValueGetter
でJSON文字列に変換してから渡すようにしています
test
のコールバックでは受け取ったcellValue
をparseしてオブジェクトに戻しています
サンプルなので例外処理など入れてませんがこれで一応オブジェクトに対してのフィルター処理が実現できるようになります
- colDef
{ headerName: 'data', field: 'rawData', width: 300, filter: 'agTextColumnFilter', // オブジェクトはfilterにわたすときに強制的にstringにされてしまうためJSONでシリアライズ,デシリアライズする filterValueGetter: (params: ValueGetterParams) => { return JSON.stringify(params.data.rawData); }, filterParams: { filterOptions: [ 'empty', { displayKey: 'filterExistKey', displayName: 'Filter By Key Exist?', test: (filterValue: any, cellValue: any): boolean => { const json = JSON.parse(cellValue); return json.hasOwnProperty(filterValue); } } ] }, sortable: false, cellRenderer: (params: ICellRendererParams) => JSON.stringify(params.value) }
まとめ
簡単に実装できました
ドキュメントでは奇数、偶数、null許可などのケースでサンプルが置いてあります
よく使う複雑な条件のフィルターなどをプリセットで実装してあげたりするなどに使えそうですね
自分はオブジェクトに対してフィルター掛けるみたいなのしか思い浮かばなかったのですがかゆいところに手が届くかも。。。って感じでしょうか
そもそも階層深くないならflattenにしてカラム分けてgridに表示したほうが良さそうですねw
今日は簡単ながらこんな感じで!