sufure
1
お世話になります。
サブテーブル内にあるチェックボックス「非表示行」にチェックが入っている場合、その行をレコード詳細画面と印刷画面では非表示にしたいです。
下記コードを実行しましたが、エラーもなく動作しません。
恐れ入りますが、アドバイス頂けないでしょうか。
(function() {
“use strict”;
var events = [
‘app.record.detail.show’,
‘app.record.print.show’
];
kintone.events.on(events, function(event) {
var rows = event.record[サブテーブル].value;
rows.forEach(function(row) {
var checkboxValue = row.value[非表示行].value;
if (checkboxValue === true) {
row.rowId.hidden = true;
}
});
return event;
});
})();
サブテーブルの特定行を非表示にするというカスタマイズはkintoneに用意されてなく(条件問わず特定列ならkintone.app.record.setFieldShown()で可能です)、実際に実装されるとしたらkintoneのクラス名を取得したDOM操作が必要になり、今後フロントエンド刷新のアップデートがあった場合、都度対応が必要になります。
それでも実装される場合は、サブテーブルの仕様上少しコツがいります。
①レコード詳細閲覧画面、印刷画面共に、ページを表示(detail.show/print.show)後にサブテーブルの各行を描画する動作を行うため、各イベントでそのまま描画されていない(まだ存在しない)行にアクセスしようとするとエラーになります。サブテーブルの描画完了を待つ処理を追加する必要があり、こちらもまたkintoneのクラス名を使用することになります。
/**
* @param {String} table サブテーブルのフィールドコードを指定
* @param {String} tableClass サブテーブルのclass名を指定(field-xxxxxxx)
*/
const trDrawWait = (table, tableClass) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
try {
let recordData = kintone.app.record.get(), rec = recordData.record;
if ((rec[table].value.length + 1) === Array.from(document.getElementsByClassName(tableClass))[0].querySelectorAll('tr').length) {
resolve();
} else {
resolve(trDrawWait(table, tableClass));
}
} catch(error) {
resolve();
}
}, 500);
});
};
こんな感じの処理をthen()で繋いで、その後に目的の処理を実行する必要があります(async/awaitではなくthen()で繋ぐ必要があります)。
②その上で、サブテーブルの値(既にイベントは外れているのでレコードの値を取得するが必要です)でループを回し、該当行のtrをdisplay='none’にする
という手順が必要です。
「いいね!」 1
sufure
3
橋本様、お返事ありがとうございます。
また、レスが遅れてしまいまして失礼しました。
DOM操作は初めてですので、少しずつ紐解きながらチャレンジしてみたいと思います。
また行き詰まり?完成?になったらレスポンスさせて頂きます!
「いいね!」 1
system
(system)
クローズされました:
4
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。