Download時にSELECTも含めておく。
初期化時に
$("#table").DataTable({
select: true
})
これは1つだけ選択する場合。 multi
にすると複数選択できるようになる。
serverSideを使用しているときはrowIdも設定する
データをサーバーから取ってくるようにしている場合は主キーに該当する列をrowIdに設定する必要がある。
$("#table").DataTable({
select: true,
rowId: function(row) {
return row["key"];
}
})
これがないとリロード時にselectがリセットされてしまう。 (https://datatables.net/extensions/select/examples/initialisation/server-side-processing.html)
選択されたすべてのデータを取得する cumulative
selectedIds = $("#table_id").DataTable().select.cumulative();
rowId
のリストを取得できる
event
イベントも使用可能で、
// アイテムが選択された時
table.on('select', function (e, dt, type, indexes) {
console.log('Items to be selected are now: ', type, indexes);
if (type == "row") {
var data = dt.rows(indexes).data().toArray();
console.log(data)
}
});
// アイテムが選択解除された時
table.on('deselect', function (e, dt, type, indexes) {
console.log('Items to be deselected are now: ', indexes);
});
(https://datatables.net/reference/event/select)
読み込み時に特定のデータにチェックを入れる
特にサーバーサイドで実行している場合に有用。
サーバーサイド処理を有効にしている時、セレクトされたデータのリストは
$("#table_id").DataTable().context[0]._select_set
にリストとして保存されている。
チェックしたいデータの配列を代入してTableをDrawし直すとチェックされた状態のテーブルを描画することができる。
selected_ids = [1, 2, 3, 5];
if (selected_ids) {
api.context[0]._select_set = selected_ids;
api.draw();
}
columnにチェックボックスを表示する
columns: [
{
"data": null,
"name": "is_selected",
"render": DataTable.render.select(),
"orderable": false,
"searchable": false
},
// ...
]
select optionは次のように設定する。
select: {
style: 'multi',
selector: 'td:first-child',
headerCheckbox: 'select-page'
},
orderable
を有効にする場合はサーバーに選択されたIDのリストを送って別途処理プログラムを実装する必要がある。
pandasのDataFrameでデータを処理しているなら
def add_is_selected_column_to_dataframe(self, df, selected_ids):
if not selected_ids: # 空リストなら即 False
df["is_selected"] = False
return df
masks = []
for selected_id in selected_ids:
# rowIdはjson文字列 {"id_a": 2, "id_b": 3}になっている
ids = json.loads(selected_id)
if not ids:
continue
mask = pd.DataFrame({
key: df[key] == value for key, value in ids.items()
}).all(axis=1)
masks.append(mask)
# `masks` が空なら、全 False の Series を作る
if masks:
df["is_selected"] = pd.concat(masks, axis=1).any(axis=1)
else:
df["is_selected"] = False
return df
これでセレクトされたレコードがTrue、そうでない場合がFalseの列を追加することができる。