以前、サブテーブルの背景色を変更する方法をメモしましたが、
列を非表示にしたいとの需要が発生したので、メモしておきます。
少なくとも自社内で1件、案件として1件発生しているので、需要が0ではないはず・・・。
サブテーブルのフィールドを操作するAPIが提供されていない為、DOM操作による実現です。
完成形
やりたい事は以下の通りで、あるフィールド(今回はラジオボタン)の値に応じて、
サブテーブルの指定のフィールド(数値)を表示/非表示したい。
コード
先に全体コードから。
思ったよりボリュームでてしまった。
細かいエラーハンドリングは割愛しています。
jQuery.noConflict(); (function($) { "use strict"; const SHOW_EVENTS = [ "app.record.create.show", "app.record.edit.show", "app.record.detail.show", ]; const CHANGE_EVENTS = [ "app.record.create.change.Table", "app.record.edit.change.Table", "app.record.create.change.ラジオボタン", "app.record.edit.change.ラジオボタン", ]; // 表示制御するフィールド const FIELD_ID = "5536090"; // 表示制御実行用関数 const setFieldVisible = function(record) { const state = record["ラジオボタン"]["value"]; const displayState = (state === "表示" ? "" : "none"); $('.label-' + FIELD_ID).css({ display: displayState }); $('.field-' + FIELD_ID).parent().css({ display: displayState }); }; // DOM要素検索用関数 const findElement = function() { return new kintone.Promise(function(resolve, reject) { const MAX_FIND_COUNT = 10; let counter = 0; // 実際に一定間隔でDOM要素を検索する関数 const findElementAtInterval = function() { counter++; // th要素とtd要素が取得できた場合のみ表示制御処理実行 if ($('.label-' + FIELD_ID).length > 0 && $('.field-' + FIELD_ID).length > 0) { clearInterval(intervalId); resolve(); } else { if (counter >= MAX_FIND_COUNT) { clearInterval(intervalId); reject(); } } }; // 一定間隔でDOM要素検索関数を実行 let intervalId = setInterval(findElementAtInterval, 100); }); }; kintone.events.on(SHOW_EVENTS, function(e) { // レコード表示イベント時は、DOM要素が発見できてから表示制御 findElement().then(function() { setFieldVisible(e.record); }); return e; }); kintone.events.on(CHANGE_EVENTS, function(e) { setFieldVisible(e.record); return e; }); })(jQuery);
フィールドIDを確認する
フィールドIDは私が勝手に呼んでいるだけですが・・・。
(フィールド名、フィールドコードは公式で呼ばれている名前なので)
kintoneでは、アプリのフィールドに自動的に採番されるIDらしき数列があるようで、それをフィールドIDとして、今回対象フィールドの判定に使用しています。
フィールドIDはどうやって確認するかというと、デバッグモードでゴソゴソと確認します・・・。
Chromeだと、以下のようにF12を押してからDOM要素を解析できます。
設定されているクラスのlabel-XXXXXXXのXXXXXX部分がフィールドIDです。
(下図の場合、5536090)
取得したフィールドIDは以下のように定数で保持。
const FIELD_ID = "5536090";
サブテーブルの要素はすぐに表示されない
大きなポイントとしてはこの点でしょうか。
表示イベントの直後にはサブテーブルのth要素は表示されますが、td要素は表示されないようでした。
その為、以下の様にsetInterval()で対象DOM要素を発見するまで繰り返し検索しています。
第1引数は実行関数、第2引数は実行間隔(ms)
let intervalId = setInterval(findElementAtInterval, 100);
setIntervalの挙動に関しては、Qiitaの記事を参考にさせていただきました。
対象要素が取得できたら表示制御処理を実行する
上記検索処理で要素が取得できたときにPromiseを返し、表示制御処理を実行しています。
kintone.events.on(SHOW_EVENTS, function(e) { // レコード表示イベント時は、DOM要素が発見できてから表示制御 findElement().then(function() { setFieldVisible(e.record); }); return e; });
おわりに
のんびり待っていればAPIが実装されるかもですが、
そんなに待てない!という方は参考にしていただければと思います。