ログインユーザーの氏名・所属・ロールを WEB フォームで使う(初期値への設定と、ロールによる表示の切替)

この記事で分かること

WEB フォームで、ログインしているユーザーの氏名や所属を入力欄の初期値に入れたい、ロール(権限)によって項目の表示・非表示を切り替えたい、という場面は多くあります。consentFlow の WEB フォームでは、これらを cfGlobal(フォームから読める共通情報)、フォームスクリプト(cfAPI.form.onNew など)、条件表示(customConditional) で行います。この記事では、読める情報の一覧と、新規作成時の初期値への設定、ロールや編集モードによる表示の切替の書き方を説明します。

対象: フォームビルダーでフォームを作る方。consentFlow 4.4.0 以降(手順 1 の onNew は 4.4.0 から)。

Notes/Domino から移行する方へ: Notes のフォームでは @UserName や names.nsf の参照、ロールによる表示の切替で同じことをしていました。@UserName は「いまログインしている人の名前を返す式」、names.nsf は Domino のディレクトリ(ユーザーや所属の名簿)、ロールは Domino のアクセス制御リスト(ACL)でユーザーに付ける権限の名前です。この記事では、これらに当たる consentFlow の書き方を説明します。Notes/Domino を使ったことがない方は、この注釈は読み飛ばして構いません。

前提: フォームから読める共通情報

WEB フォームのスクリプト(計算値、条件表示、検証など)からは、cfGlobal という名前で、開いている文書とログインユーザーの情報を読めます。サーバーへの問い合わせは発生しません。

読み方 内容 例
cfGlobal.currentUserName ログインユーザーの正式な名前(階層名) CN=cFlow Admin/O=consentFlow
cfGlobal.currentUserKanjiName ログインユーザーの表示名(漢字名。従業員情報に登録がある場合) 山田 太郎
cfGlobal.sectionCode / cfGlobal.sectionName ログインユーザーの所属コード/所属名 1010 / 総務部
cfGlobal.postName 役職名 課長
cfGlobal.isNewNote 新規作成中の文書か true / false
cfGlobal.editable 編集モードか(参照モードなら false) true / false
cfGlobal.statusNo ワークフローの現在のステータス番号(未申請は空) ''、10
cfGlobal.applicationNo 申請番号(未採番は空) 7-00003
cfGlobal.docid 文書の ID(新規作成中は仮の ID) —
cfGlobal.lang / cfGlobal.webFormRevisionNo 表示言語/フォームのリビジョン ja / kitchensink

cfGlobal の値をフォームに表示した例(デモ環境のキッチンシンクフォーム)

サーバー側の値を読む方法は3つあり、使い分けの目安は次のとおりです。

  1. cfGlobal — 上の表の情報。問い合わせなしで最速。まずこれで足りるかを見る
  2. cfAPI — 現在の文書や他の DB の文書の項目を読む(cfAPI.getDb().getDocByUnid(...) など)。新規作成中は文書がまだ無いので cfGlobal.isNewNote で飛ばす
  3. ビュー・文書の参照(REST) — マスタのビューから複数件を取るとき(別記事「選択肢を他の DB・ビューから取り込む」)

手順 1: 氏名・所属を初期値に入れる

申請者の氏名と所属を、文書を新規作成したときに1回だけ自動で入れる例です。consentFlow 4.4.0 からは、フォームスクリプトの cfAPI.form.onNew に処理を書きます。

  1. 氏名と所属を入れるテキストフィールド(例: applicantName、applicantSection)を置きます。保存する項目にしておきます
  2. HTML 要素(htmlelement)のコンポーネントを 1 つ置き、キーを scriptBlock、表示の設定を非表示(hidden)にします。その本文に、次の JavaScript を書きます(フォームスクリプトの置き方の詳細は「WEB フォームを開いたときに「1回だけ」処理を実行する」を参照)
cfAPI.form.onNew(function (ctx) {
  ctx.set('applicantName', cfGlobal.currentUserKanjiName || cfGlobal.currentUserName || '');
  ctx.set('applicantSection', cfGlobal.sectionName || '');
});

ポイント:

  • onNew は新規作成したときだけ呼ばれます。承認者が開いたときに承認者の名前で上書きされることはなく、「申請時点の所属」が保存されます。異動後に文書を開いても、保存された値がそのまま残ります
  • 文書を開くたびに実行したい処理は cfAPI.form.onOpen(参照モードでも実行。部分更新で再実行しない)、フォームが描き直されるたびに実行したい処理は cfAPI.form.onReady に書きます。呼ばれる順番は onNew → onOpen → onReady です
  • 「初期値(defaultValue)」の設定に動的な式を書かないでください。公開時に評価した値が固定されます
  • 4.4.0 より前の環境では、計算値(Calculated Value)に cfGlobal.isNewNote && !value のガードを付けて書く方法があります(「WEB フォームを開いたときに「1回だけ」処理を実行する」の末尾を参照)

手順 2: ロールで項目の表示・非表示を切り替える

「管理者ロールを持つ人にだけ、備考欄を見せる」のような切り替えです。

  1. 対象のコンポーネント(またはパネル)の「条件」の設定で 高度な条件(customConditional) を開きます
  2. 次のように書きます(ロール名は Domino の ACL に登録した名前)
show = (typeof cfAPI !== 'undefined') && cfAPI.getDb().hasRole('[Manager]');
  • cfAPI.getDb().hasRole('[ロール名]') は、ログインユーザーが現在のアプリの DB でそのロールを持っていれば true を返します
  • cfAPI.getDb().getAccessLevel() でアクセスレベル(読者・作成者・編集者 など)を、hasAccessPrivilege(...) で個別の権限を確認することもできます
  • 条件表示は画面上の表示を切り替えるものです。項目の値そのものを守る必要がある場合は、参照制限(アプリケーション設定)や ACL で制御してください

手順 3: 編集モードと参照モードで出し分ける

入力中だけ表示したい注意書きや、参照時だけ表示したいバッジは、cfGlobal.editable で切り替えます。

// 編集モードのときだけ表示
show = (typeof cfGlobal === 'undefined') || cfGlobal.editable === true;

// 参照モードのときだけ表示
show = (typeof cfGlobal !== 'undefined') && cfGlobal.editable === false;

編集モードのときだけ表示される注意書きの例

typeof cfGlobal === 'undefined' を入れているのは、フォームビルダーのプレビューでは cfGlobal が無いためです。プレビューでも見えるように、未定義のときは表示する側に倒しています。

結果の確認

  • 手順 1: 新規作成すると氏名・所属が入り、保存して別のユーザー(承認者)が開いても申請者の名前のまま
  • 手順 2: ロールを持つユーザーと持たないユーザーで、項目の表示が変わる
  • 手順 3: 編集ボタンを押す前後で、注意書きの表示が切り替わる

デモ環境の「キッチンシンク」フォームの上部パネル(cfGlobal ライブ表示)と「ロジック・UI」タブに、動く例があります。

注意

  • cfGlobal の所属・役職は、従業員情報(外部の従業員 DB や部門マスタ)から来ます。空になる場合は、ログインユーザーが従業員情報に登録されているかを確認してください
  • フォームビルダーのプレビューでは cfGlobal も cfAPI も未定義です。必ず typeof で確認してから使ってください
  • 条件表示で隠した項目の値は、設定によっては送信時にクリアされます(clearOnHide)。値を保持したまま隠したい場合は、その設定を確認してください

関連記事

  • WEB フォームを開いたときに「1回だけ」処理を実行する
  • 選択肢を他の DB・ビューから取り込む(準備中)
  • consentFlow API の利用