アンチパターンから学ぶ アプリUIパーツの表示制御
はじめに
kintoneのカスタマイズでは、レコード追加ボタンを非表示にしたり、サイドバーの開閉を制御することがあります。
こうしたUIパーツの表示制御には、一見動作しているように見えても、リスクを抱える実装パターンが存在します。
この記事では、kintoneのアプリUIパーツの表示制御について、以下の2つを解説します。
- アンチパターンとそのリスク:
たとえば、DOM操作でボタンやサイドバーを制御するカスタマイズは、kintoneのDOM構造への依存や、表示状態の管理が困難になるといったリスクを抱えています。 - 推奨される実装方法とその利点:
UIパーツの表示を制御するAPIを使用することで、DOM構造に依存せず安全にUIパーツを制御できます。
表示状態の取得も容易になり、複数のカスタマイズ間で整合性を保った制御が可能です。
アンチパターンと推奨される実装方法を、サンプルコードを交えて比較しながら紹介します。
既存のカスタマイズのリスク確認や、新たに実装する際の参考にしてください。
今回紹介するAPI
| API | 概要 |
|---|---|
| kintone.app.showAddRecordButton() | レコードの追加ボタンの表示/非表示を切り替え 一覧画面・詳細画面・グラフ画面で利用可能 |
| kintone.app.record.showSideBar() | サイドバーの開閉を切り替え コメントや変更履歴の表示も制御可能 |
1. レコード一覧画面のボタンやUIパーツの表示を制御する
kintoneのカスタマイズで、一覧画面のボタンやUIパーツを非表示にしたいことがあります。
たとえば、独自の入力フローを用意して標準の追加ボタンを隠したり、特定の条件に応じて追加ボタンを非表示にするケースです。
ここでは、以下のように一覧画面でレコード追加ボタンを非表示にする方法を比較します。
アンチパターン:querySelector()のDOM操作によるレコード追加ボタンの非表示
document.querySelector()でレコード追加ボタンのDOM要素を直接取得し、style.displayを操作して非表示にするパターンがあります。
注意
以下のコードはAPIを使った実装に置き換えることが推奨される書き方です。
新規のカスタマイズでは、後述するshowAddRecordButton()を使用してください。
|
|
このアプローチには以下のリスクがあります。
| リスク | 説明 |
|---|---|
| DOM構造への完全な依存 | .gaia-argoui-app-menu-addのようなクラス名はkintoneが実装上の都合でつけた名前であり、外部からの利用を想定していません。kintoneのアップデートで変更される可能性があり、カスタマイズの動作が停止するリスクを伴います。 |
| 表示状態管理の困難性 | style.displayを直接操作しているため、他のカスタマイズや標準機能と表示状態が競合するリスクがあります。ボタンの現在の表示状態を直接確認する手段がなく、複数のカスタマイズ間で整合性を保つことが困難です。 |
| 環境依存の表示差異 | PC版とモバイル版ではDOM構造が異なるため、PC版用のセレクターはモバイル版では動作しません。 モバイル版用に別のセレクターを用意する必要があり、保守コストの増大やバグが混入するリスクが高まります。 |
推奨される実装方法:showAddRecordButton()による表示制御
kintone.app.showAddRecordButton()を使用することで、レコード追加ボタンの表示・非表示を安全に制御できます。
|
|
DOM操作によるボタンの非表示と比較して、以下の点が改善されます。
| 改善点 | 説明 |
|---|---|
| DOM構造に依存しない | APIがボタンの表示・非表示を管理するため、kintoneのアップデートに影響を受けない保守性の高いカスタマイズを実現できます。 |
| 表示状態を安全に管理 | APIやアクセス権で表示制御されたレコード追加ボタンはkintone.app.getAddRecordButtonDisplayState()で現在の表示状態を取得できます。他のカスタマイズとの競合を避け、整合性を保った表示制御が可能です。 |
| 環境に依存しない表示 | kintoneがボタンの表示を管理するため、PC版とモバイル版でDOM構造の違いを意識する必要がありません。 モバイル版では kintone.mobile.app.showAddRecordButton()で同じ方法でボタンの表示を制御できます。 |
レコード一覧画面で使える表示・非表示APIは以下のとおりです。
| API | 概要 |
|---|---|
| kintone.app.showAddRecordButton() | レコードの追加ボタンの表示/非表示を切り替え |
| kintone.app.showFilterButton() | 絞り込みボタンの表示/非表示を切り替え |
| kintone.app.showReportButton() | 集計ボタンの表示/非表示を切り替え |
| kintone.app.showAppSettingsButton() | アプリ設定ボタンの表示/非表示を切り替え |
| kintone.app.showOptionsButton() | オプションボタンの表示/非表示を切り替え |
| kintone.app.showDescription() | アプリの説明の表示/非表示を切り替え |
| kintone.app.showViewAndReportSelector() | 一覧とグラフを選択するパーツの表示/非表示を切り替え |
| kintone.app.showViewSelectorItems() | 一覧セレクターの選択肢の表示/非表示を切り替え |
| kintone.app.showReportSelectorItems() | グラフセレクターの選択肢の表示/非表示を切り替え |
2. レコード詳細画面のボタンやUIパーツの表示を制御する
kintoneのカスタマイズで、レコード詳細画面のボタンやUIパーツを非表示にしたいことがあります。
たとえば、詳細画面のサイドバーを閉じて、多くのフィールドを含むレコードの表示領域を確保するケースです。
ここでは、以下のようにレコード詳細画面でサイドバーを閉じる方法を比較します。
アンチパターン:querySelector()のDOM操作によるサイドバーの制御
document.querySelector()でサイドバーのDOM要素を直接取得し、CSSで非表示にするパターンがあります。
注意
以下のコードはAPIを使った実装に置き換えることが推奨される書き方です。
新規のカスタマイズでは、後述するshowSideBar()を使用してください。
|
|
実行すると、以下のようにサイドバー全体が消え、コメントや変更履歴のタブも表示されなくなります。
このアプローチには以下のリスクがあります。
| リスク | 説明 |
|---|---|
| DOM構造への完全な依存 | サイドバーやメインコンテンツのクラス名はkintoneが実装上の都合でつけた名前であり、外部からの利用を想定していません。 kintoneのアップデートで変更される可能性があり、カスタマイズの動作が停止するリスクを伴います。 |
| 開閉手段の欠如 | サイドバー全体を非表示にすると、コメントや変更履歴のタブも消えます。ユーザーがサイドバーを再度開く手段がなくなり、必要な情報にアクセスできなくなるリスクがあります。 |
| 開閉状態取得の困難性 | style.displayを直接操作しているため、他のカスタマイズや標準機能と開閉状態が競合するリスクがあります。 サイドバーの現在の開閉状態を直接確認する手段がなく、複数のカスタマイズ間で整合性を保つことが困難です。 |
推奨される実装方法:showSideBar()による開閉制御
kintone.app.record.showSideBar()を使用することで、サイドバーの開閉をAPI経由で安全に制御できます。
レイアウトの調整はkintoneが自動的に行うため、メインコンテンツ領域の幅を手動で変更する必要はありません。
|
|
DOM操作によるサイドバーの制御と比較して、以下の点が改善されます。
| 改善点 | 説明 |
|---|---|
| DOM構造に依存しない | APIがサイドバーの開閉を管理するため、kintoneのアップデートに影響を受けない保守性の高いカスタマイズを実現できます。 |
| 開閉手段の維持 | APIを通じてサイドバーを閉じているため、コメントや変更履歴のタブが残り、ユーザーがサイドバーを開閉できます。 |
| 開閉状態の正確な取得 | kintone.app.record.getSideBarDisplayState()で現在の開閉状態を取得できます。他のカスタマイズと連携した表示制御が可能です。 |
showSideBar()を使ってサイドバーを開く場合は、コメントと変更履歴のどちらを表示するかを指定できます。
|
|
レコード詳細画面で使える表示・非表示APIは以下のとおりです。
| API | 概要 |
|---|---|
| kintone.app.record.showSideBar() | サイドバーの開閉を切り替え |
| kintone.app.record.showEditRecordButton() | レコードの編集ボタンの表示/非表示を切り替え |
| kintone.app.record.showDuplicateRecordButton() | レコード再利用ボタンの表示/非表示を切り替え |
| kintone.app.record.showActionButton() | アプリのアクションボタンの表示/非表示を切り替え |
| kintone.app.record.showStatusActionButton() | プロセス管理のアクションボタンの表示/非表示を切り替え |
| kintone.app.record.showChangeAssigneeButton() | 「現在の作業者を変更」ボタンの表示/非表示を切り替え |
実装時に押さえておきたいこと
各APIの非同期処理の扱い、表示状態の取得、モバイル対応について案内します。
事前に把握しておくことで、実装後のトラブルを未然に防げます。
非同期処理の活用について
この記事で紹介したAPIはすべて非同期なAPIです。
async/awaitを使用して順序どおりに処理してください。
詳しくは次のページを参照してください。
表示状態の取得について
各show系APIには、現在の表示状態を取得する対応APIが用意されています。
他のカスタマイズとの連携や、条件に応じた表示制御で活用できます。
今回紹介したshowAddRecordButton()とshowSideBar()は次のAPIと一緒に活用できます。
| 表示制御API | 状態取得API | 戻り値 |
|---|---|---|
kintone.app.showAddRecordButton() |
kintone.app.getAddRecordButtonDisplayState() | 'VISIBLE'/'HIDDEN' |
kintone.app.record.showSideBar() |
kintone.app.record.getSideBarDisplayState() | 'CLOSED'・'COMMENTS'・'HISTORY'・'HIDDEN' |
モバイル版での利用について
ボタンやUIパーツがモバイルに存在する場合、この記事で紹介したAPIは、モバイル版でも利用できます。
モバイル版ではkintone.mobile名前空間のAPIを使用してください。
| PC版 | モバイル版 |
|---|---|
kintone.app.showAddRecordButton() |
kintone.mobile.app.showAddRecordButton() |
kintone.app.record.showSideBar() |
なし |
まとめ
- レコード一覧画面では、
showAddRecordButton()のようなAPIで、DOM操作に頼らずボタンやUIパーツの表示を制御できます。 - レコード詳細画面では、
showSideBar()のようなAPIで、DOM操作に頼らずボタンやUIパーツの表示を制御できます。 getAddRecordButtonDisplayState()やgetSideBarDisplayState()のようなget系APIを使用することで、ボタンやUIパーツの現在の表示状態を取得できます。
show系APIを使用することで、kintoneのアプリUIパーツの表示制御における信頼性が向上します。
新規のカスタマイズでは積極的にこれらのAPIを活用してください。
このTipsは、2026年5月版kintoneで動作を確認しています。
