Lightning フローの選択リストで動的な値をデフォルト値として設定する

##ごあいさつ
はじめまして、Lightningさん家のフローさんとマブダチの僕です。

みなさん、新しくなったフロー使ってますか？
とても便利なフローですが、まだ痒い所に手が届かないかわいいやつでもあります。
今回取り上げる選択リストもまた、かわいいあいつのチャームポイントです。

※本投稿はWinter'20時点の情報です。
　Ideaでも熱い内容のため、そのうち改善されると思います。
>アイデア
>[- Visual Flow picklists are always required and never required - odd UI behavior!](https://success.salesforce.com/ideaView?id=08730000000l5LcAAI)

##本投稿を読んで解決できること
・選択リストのデフォルト値設定方法がいまいちわからない
・レコードからのデフォルト値が設定できない
・選択リスト「--なし--」の設定方法がわからない
　※設定手順ではないため、情報の羅列に近いです。

##選択リストの落とし穴
###やりたいこと
１．Object\_\_cに、選択リスト項目 List\_\_c「A/B/C」がある状態で
　　画面上の選択リストにはデフォルト値「--なし--」「A」「Ｂ」「Ｃ」を表示。
２．初期表示時に、ユーザレコードに保存されているList__cの値を初期表示。
３．「--なし--」を選択されたままの場合は保存させない( or 空欄で保存等)

###つまり・・・
Object\_\_cとList\_\_cをユーザオブジェクトとロールに置き換えると、、、

**ユーザ**
![User.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531605/355e083b-ed82-a2f4-ee91-15f254375afc.jpeg)
ユーザレコードに保存されているロールは「Sales WW」ですが、
レコード情報を編集する画面フローを表示しようとすると

**:no_good_tone1: デフォルト値なしで実装時の初期表示(従来)**
![before.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531605/0aaa4927-3a37-cd3d-a81b-86cec137be9a.jpeg)
選択リストの順序通りに、一番上の「CEO」が選択されている状態で表示されます。

**:ok_woman_tone1: デフォルト値ありで実装時の初期表示(適用後)**
![after.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531605/b996bd81-ecf1-aebf-0ebf-5d346b7a6212.jpeg)
ユーザの情報を表示すべきなので、このように「Sales WW」が初期表示されているべきですね。


残念ながら現在の仕様では素直にリソースを配置するだけでは上記内容を実装できません。
ただ、少し遠回りをすることでそれっぽい実装は可能です。

ユーザオブジェクトの更新機能を持つ画面フローを例に示します。

##サンプル画面フローの概要と要素
#####フロー全体図
![SharedScreenshot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531605/1b5971f9-8a34-586e-f04f-83c185116a33.jpeg)

#####フロー概要
　ロールを変更したいユーザの名前を入力して検索、
　任意のロールを選択して次へをクリックで
　選択ユーザのレコードが更新される。

#####フロー要素
　①ユーザ検索画面
　　- ユーザ名を入力
　②ユーザ
　　- ①で入力したユーザを取得
　③ユーザのロール名
　　- ユーザのロール名とロールIdを取得
　④ユーザロール設定判定
　　- ③でロールが登録されていない場合は④aへ
　④a デフォルトロール初期化
　　- 現在ロールの選択肢に「--なし--」をセット
　⑤ユーザ情報入力画面
　　- 更新対象のユーザ氏名とロール選択リストを表示
　⑥ロール選択状態
　　- ユーザのロールが初期表示のままの場合は⑥aへ
　⑥a 現行ロール
　　- ③で取得したロールの値を選択ロールにセット
　⑦ユーザレコード更新
　　- ⑤で選択されたロールでユーザを更新
　⑧結果画面
　　- リザルトメッセージを表示

##選択リストの設定とリソースの役割
　選択リストのために用意するリソースは以下の内容です。

　★`CurrentUserRoleName` - テキスト変数
　　　・画面に表示される選択リストの表示ラベルです。
　　　・③でロール名を格納することで「CEO」等のラベルを、
　　　　④aでベタ書きの「--なし--」を割り当てることで普段の選択リストライクな見た目を保てます。
　　　・次のリソース `CurrentUserRoleId`とニコイチです。
![CurrentUserRoleName.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531605/189cf17e-83cd-730d-bde4-64558102e0ea.jpeg)

　★`CurrentUserRoleId` - 選択肢
　　　・画面に表示する選択リストの内部で保持されるIdです。
　　　・③でロール名を取得するための検索キーにもなります。
　　　・表示ラベルに`CurrentUserRoleName`を設定することで、
　　　　現在のユーザのロールId/表示ラベルの選択肢になります。
　　　・ひとつ前のリソース`CurrentUserRoleName`とはズッ友です。
![CurrentUserRoleId.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531605/938e548f-ee9e-40d0-e706-332184d586cf.jpeg)


　★`RoleNameChoice` - レコード選択肢セット
　　　・ロールの一覧を保持します。
　　　・`CurrentUserRoleId`と一致するレコードを除くことで、
　　　　現在選択されているロールが重複表示されることを防げます。
　　　・選択された選択肢のIdは`ChoosedRoleId`に格納します。
![SharedScreenshot5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531605/2019c439-5cf5-84a3-de76-a438eed27640.jpeg)
![SharedScreenshot52.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531605/cecbca70-f501-5be0-0cc0-d5c250ae7774.jpeg)

　★画面の選択リスト
　　・`CurrentUserRoleId` + `RoleNameChoice` で組み合わせて選択リストにします。
　　・`CurrentUserRoleId`が「--なし--」や実データに変化するため、デフォルト値に設定します。
![SharedScreenshot2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531605/ca082945-270d-82ac-ecdc-31052ef51201.jpeg)



##おしまい
命名が綺麗じゃないのと複数項目でひとつの処理を行う仕組みなのに図解もせず、
ややこしい記事になってしまいましたが、部分的にでもどなたかのヒントになれば幸いです。
張り切った初投稿ですが、~~眠気に押し潰されそうなので無理やり完結させてリタイアです。~~そのうち綺麗に書き直すかもしれません。

もっとスマートなやり方や疑問点等ございましたらぜひコメントお願いします！
閲覧ありがとうございました！