Table and ReadOnlyTable customization
概要
今回は Table と ReadOnlyTable コンポーネントの使い方の違い、活用とカスタマイズ方法について説明します。
以下のシナリオを想定しています。
- 基本的な使い方 (Table, ReadOnlyTable)
- 一つのセルに複数のコンポーネント表示 (Table)
- 依存列 (Table)
- 入れ子テーブル (Table)
使用するコンポーネント
Table と ReadOnlyTable の使い方の違い
基本的に Table と ReadOnlyTable コンポーネントは同じような構造になっています。
ReadOnlyTable コンポーネントは、読み取り専用のテーブルを表示することができます。ユーザーが操作できないプレーンなテキストや HTMLElement を表示することができます。
一方で、Table コンポーネントは、データを変更したり行の追加/削除をしたりとテーブルのセルに表示されるコンポーネントを操作することができます。
最大の違いは、Table の columns
プロパティが render
プロパティ(columns.render
)を持っていることです。このプロパティは、ユーザーが操作できるセルに表示する要素を設定することができます。さらに、actionButton
プロパティ(table.actionButton
)を使って行の追加/削除ボタンの表示/非表示を切り替えることができます。
change イベント の理解
Table の change
イベントの流れを理解すると、カスタマイズがしやすくなります。
テーブルのセルは、セルの中のコンポーネントの change
イベントをリッスンして、新しい値をそれに対応する field
の値に登録します。
アプリの作成
以下のフィールドを含むアプリを作成します。
- スペースフィールド(要素ID:space)
JavaScript/CSS カスタマイズ
kintone UI Component の UMD ファイルをアプリに読み込んだ上で、以下のような実装をした JavaScript ファイルをアップロードします。
ファイルのアップロード方法などは、 Quick Start をご覧ください。
基本的な Table の準備
Text コンポーネントで username を表示するような次の設定があるとします。
const renderName = cellData => {
const text = new Kuc.Text({ value: cellData });
return text;
};
const columns = [{ title: 'Username', field: 'username', render: renderName }];
const data = [{ username: 'user1' }, { username: 'user2' }];
const table = new Kuc.Table({ columns, data });
const space = kintone.app.record.getSpaceElement('space');
space.appendChild(table);
UI 上に表示
最初のセルの入力値を編集した場合、Text コンポーネントは detail.value = 'user1 edited'
を含む change
イベントをトリガーします。
そしてテーブルは値を受け取り、username
field に登録し直します。
テーブルのデータは以下のようになります。
[{ username: 'user1 edited' }, { username: 'user2' }];
event detail のカスタマイズ
テーブルが受け取る値をカスタマイズしたい場合、テーブルがその値を受け取る前に change
イベント内で編集する必要があります。
上記のサンプルコードを使って、renderName
関数に以下の内容を追加します。
...
const renderName = cellData => {
const text = new Text({ value: cellData });
// Modify the value before it bubble to table cell
text.addEventListener('change', event => {
event.detail.value = 'modified value'; // add any value you want set to username;
});
return text;
};
...