イベント発火時や独自ボタンをクリックした時など、テーブルに新しい行を追加したい場合が往々にしてあると思います。
アプリの構成が絶対に変化しない時は、テーブル内の全フィールドをオブジェクトとしてインラインで定義すればいいのですが…
テーブルにフィールドを追加したりすると、カスタマイズが壊れてしまうと思います。
また、REST APIが許容するテーブル構造とJavaScript APIが許容するテーブル構造が違うので、同じ勢いで書くこともできない…
そこで、汎用的なメソッドを作って使いまわしたいな~と思っているのですが、皆さんはこういう時どういうメソッドを書いていますか?
私がやったことあるのは、以下のようなやり方です。
① テーブルの既存行をコピーする
新規画面でも編集画面でも、テーブルには自動で1行作られる仕様を利用して、1行目をコピーして中身を初期化するメソッドを用意しておく。
// 即興で書いているので動かないかも
function createNewRow(record: any, fieldCode: string): any {
if (record[fieldCode]) {
// ディープコピー
const copied = JSON.parse(JSON.stringify(record[fieldCode].value[0].value));
// フィールドを回る
for (const key of Object.keys(copied)) {
// フィールド種類によって初期化方法を変える
switch (copied[key].type) {
case: 'CHECK_BOX':
case: 'UESR_SELECT':
/* ... */
case: 'FILE': {
copied[key].value = [];
break;
}
default: {
copied[key].value = '';
break;
}
}
}
return copied;
} else {
return null;
}
}
// こんな感じかな?
② REST API でフィールド構成を取得して構築
REST API から情報を取ってきて、フィールドを全て生成する
※あんまり使わない
③ window.cybozu
オブジェクトから情報を取ってきて、フィールドをすべて生成する
②と同じだけどAPIコール数を使わない
※あんまり使わない
考え得るのはこのくらいで、いつもはコール数を消費しない①を使っているのですが、他にも方法はあったりするのでしょうか。
もし皆さんがやっている方法があれば、教えていただきたいです。