ケース用の カスタム Lightning Web コンポーネントを作成する
学習の目的
この単元を完了すると、次のことができるようになります。
- 事前入力を使用して、親 Omniscript から子 Omniscript に情報を渡す。
- HTML のスロットを使用して、標準コンポーネントの機能を拡張する方法を説明する。
- Flexcard と Omniscript をカスタム Lightning Web コンポーネントに組み込む。
- 共通アクションユーティリティとコールバック関数の目的を説明する。
- pubsub に登録/登録解除する方法を説明する。
ケースの作成と表示
Vijay は続いて、新しいカスタム Lightning Web コンポーネントを作成し、Create Case (ケース作成) Omniscript と Selectable Item (選択可能アイテム) Flexcard をこのコンポーネントに組み込みます。まず、HTML ファイルで作業します。その手順を見ていきましょう。
Selectable Item (選択可能アイテム) HTML
Selectable Item (選択可能アイテム) カスタム Lightning Web コンポーネントの HTML には、次のものが設定されています。
- Selectable Item (選択可能アイテム) Flexcard
- 取引先を選択したユーザーが新規ケースを作成するためのボタン
- 新規ケースを作成するためのモーダル
- Create Case (ケース作成) Omniscript を含むスロット
プレフィル
プレフィルは、親から子 Omniscript に渡す情報を指定するために使用するコンポーネントの属性です。
コンポーネントタグを使用して、子 Lightning Web コンポーネントを任意の親 Lightning Web コンポーネントに組み込みます。Omniscript と Flexcard を有効にし、組み込む Lightning Web コンポーネントのコンポーネントタグを収集したら、プレフィルを使用できるようになります。
以下は、Selectable Item (選択可能アイテム) HTML ファイルです。下表にコードの主要な部分に関する簡単な説明が示されています。
<template> <!-- Button to create new case once account Id is selected --> <div class="slds-m-top_large"> <Omnistudio-button lwc:if={accountId} variant="brand" label="Create New Case" onclick={openNewCaseModal}> </Omnistudio-button> </div> <c-cf-sample-selectable-item lwc:if={accountId} record-id={accountId}></c-cf-sample-selectable-item> <!-- Modal to create new case --> <Omnistudio-modal lwc:if={prefill} title="Create New Case" size="large"> <div slot="content"> <c-sample-create-case-english lwc:if={showOS} layout="lightning" prefill={prefill}></c-sample-create-case-english> </div> </Omnistudio-modal> </template>
この表に、コードの主要な部分の説明が示されています。
行 |
説明 |
---|---|
3 ~ 10 |
|
11 |
[Create New Case (ケースを新規作成)] モーダルを開く [Create New Case (ケースを新規作成)] ボタンの下に Selectable Item (選択可能アイテム) Flexcard を組み込む |
13 ~ 17 |
モーダルコンポーネントでケースを新規作成する |
14 |
属性を持つ div スロットを使用して、Create Case (ケース作成) Omniscript を組み込む |
15 |
プレフィルを使用して、情報を Case Management (ケース管理) Omniscript (親) から Create Case (ケース作成) Omniscript (子) に渡す |
スロット
スロットとは、標準 Lightning Web コンポーネントのマークアップを組み込んだり、拡張したりする目的で、独自のマークアップを入力するプレースホルダーです。スロットを使用すれば、コンポーネントを上書きしなくてもそのルックアンドフィールを強化することができます。
スロットの呼び出しには 2 種類あり、そのいずれかを選択します。
- 名前なしスロットは、親コンポーネントの拡張マークアップを保持します。たとえば、OmniscriptStep を拡張してステップをオーバーライドして、
<slot></slot>
プレースホルダーを使用して子コンポーネントの要素を組み込みます。
- 名前付きスロットは、親コンポーネントの特定のセクション内にマークアップを追加します (例:
<div slot=”header”>My Custom Header</div>
)。
些細な変更であっても可能な限りスロットを使用してください。スロットによって、コンポーネントの構造や機能からカスタムコンテンツが隔離されます。このため、今後コンポーネントが変更されるときにコンテンツが保護され、メンテナンスが容易になります。さらに、HTML ファイルにスロットを追加するときは、JS ファイルの render 関数をオーバーライドして、HTML ファイルを参照します。参照が設定されていない場合はスロットが機能しません。
共通アクションユーティリティ
Omniscript は、JavaScript クラスを使用して構築された Omniscript アクションフレームワークを使用してリモートコールを実行します。この機能を有効にするために、共通アクションユーティリティクラスを Lightning Web コンポーネントにインポートします。OmniscriptActionCommonUtil メソッドを使用して、サーバーへのリモートコールを実行します。
最も一般的なアプローチは、リモートコールフローを開始する executeAction メソッドを使用することです。このメソッドを使用して、ユーザーが取引先を選択したときに関連するケースを取得します。OmniScriptActionCommonUtil JavaScript クラスのインスタンスを作成するには、this._actionUtilClass = new OmniscriptActionCommonUtil();
を使用します。JS コードベースでこの動作を確認できます。
Selectable Item (選択可能アイテム) JavaScript
Selectable Item (選択可能アイテム) カスタム Lightning Web コンポーネントの JavaScript の動作を理解するために、caseSelectableItemLWC コンポーネントのコードを 3 つに分割してみましょう。
最初の部分:
- OmniscriptBaseMixin をインポートして拡張する
- 共通アクションユーティリティクラスをインポートして、カスタム Lightning Web コンポーネントからリモートコールを実行する
2 番目の部分:
- Lookup コンポーネントからのイベントをリスンして、ユーザーが新しい取引先を選択したときにケースを取得する pubsub を登録する
- Flex Card コンポーネントからのイベントをリスンして、ケースを選択し、ユーザーが新規ケースを選択したときに次のステップにナビゲートする pubsub を登録する
- Create Case (ケース作成) Omniscript からのイベントをリスンして、モーダルを閉じ、ケースリストを更新する pubsub を登録する
3 番目の部分:
- Case Management (ケース管理) Omniscript のデータ JSON で AccountId をデフォルト値として使用する
- 新規ケースレコードを持つ取引先からケースを取得する
- 切断時に pubsub イベントへの登録を解除する
コードの最初の部分では、pubsub や OmniscriptBaseMixin など、コンポーネントが Omnistudio と連動するために必要なインポートを実行します。さらに、共通アクションユーティリティを実装します。
import { LightningElement, track } from 'lwc'; import pubsub from 'Omnistudio/pubsub'; import { OmniscriptBaseMixin } from 'Omnistudio/omniscriptBaseMixin'; import { OmniscriptActionCommonUtil } from 'Omnistudio/omniscriptActionUtils'; export default class CaseSelectableItemLWC extends OmniscriptBaseMixin(LightningElement) { accountId; caseList; model; omniJsonData; showOS; connectedCallback() { // Create instance of OmniscriptActionCommonUtil utility class for use in this class this._actionUtilClass = new OmniscriptActionCommonUtil(); }
この表に、コードの主要な部分の説明が示されています。
行 |
説明 |
---|---|
1 |
すべてのコンポーネントが読み取る標準の Salesforce Lightning 要素である Omniscript で使用する新しいコンポーネントを作成するたびに、このインポートを追加してください。 |
2 |
|
3 |
|
4 |
このクラスで使用する 管理パッケージ内の Apex クラスにリモートコールを実行する場合、sClassName パラメーターに名前空間 (この場合は |
5 |
この処理によって |
11 |
Lightning Web コンポーネントが DOM に接続したときに、 |
コードの 2 番目の部分には、特定のイベントをリスンする pubsub register ステートメントが含まれます。さらに、プレフィルを使用して AccountId を Create Case (ケース作成) Omniscript に渡します。
connectedCallback() { // Register pubsub to listen to event from lookup component to fetch cases when a new account is selected this._fetchCasesFromAccount = { data: this.fetchCasesFromAccount.bind(this) }; pubsub.register("newAccountSelected", this._fetchCasesFromAccount); // Register pubsub to listen to event from the Flexcard component to select a case and navigate to the next step when a new case is selected this._selectCase = { data: this.selectCase.bind(this) }; pubsub.register("newCaseSelected", this._selectCase); // Register pubsub to listen to event from create case child OS to close the modal and refresh case list this._createCaseCallback = { data: this.createCaseCallback.bind(this) }; pubsub.register("omniscript_action", this._createCaseCallback); }
この表に、コードの主要な部分の説明が示されています。
行 |
説明 |
---|---|
3 ~ 4 |
イベントがトリガーされたときに、取引先からすべてのケースを取得する |
6 |
pubsub register ステートメントを |
7 ~ 9 |
Flexcard コンポーネントからのイベントをリスンして、ケースを選択し、ユーザーが新規ケースを選択したときに次のステップにナビゲートする pubsub を登録する |
12 ~ 16 |
Create Case (ケース作成) 子 Omniscript からのイベントをリスンして、モーダルを閉じ、ケースリストを更新する pubsub に登録する |
pubsub を設定する際のベストプラクティスは、ローカル変数インスタンスを確立して関数に設定し、リスンする pubsub イベントにバインドすることです。
コードの 3 番目の部分は、カスタム Lightning Web コンポーネントに次のとおり指示します。
- Case Management (ケース管理) Omniscript のデータ JSON で、AccountId を pubsub result のデフォルト値として使用します。
- 次のステップに自動的に進みます。
- ウィンドウを開きます/閉じます。
- 切断時に pubsub イベントへの登録を解除します。
サンプルコードを次に示します。
fetchCasesFromAccount(pubsubResult) { // If pubsub result is not defined, default to the accountId in the data JSON this.accountId = pubsubResult? pubsubResult.AccountId : this.omniJsonData["SelectAccountAndCase"]["SelectAccount"]; this.prefill = { "AccountId": this.accountId }; } selectCase(evt) { if (evt && evt.CaseId) { this.omniApplyCallResp({"SelectedCaseId": evt.CaseId}); this.omniNextStep(); } } // Open Create Case Modal openNewCaseModal() { // this.prefill = { "AccountId": this.accountId }; this.showOS = true; let modal = this.template.querySelector("Omnistudio-modal"); modal.openModal(); } // Close Create Case Modal closeNewCaseModal() { let modal = this.template.querySelector("Omnistudio-modal"); modal.closeModal(); this.showOS = false; } createCaseCallback() { // Fetch cases from account with the newly created case record // Close Modal this.closeNewCaseModal(); } disconnectedCallback() { // Unregister pubsub event on disconnect pubsub.unregister("newAccountSelected", this._fetchCasesFromAccount); pubsub.unregister("omniscript_action", this._createCaseCallback); pubsub.unregister("newCaseSelected", this._createCaseCallback); } }
この表に、コードの主要な部分の説明が示されています。
行 |
説明 |
---|---|
1 ~ 3 |
Case Management (ケース管理) Omniscript のデータ JSON で、AccountId をデフォルト値として使用する |
5 ~ 8 |
カスタムコンポーネントが該当するケースにフックし、ユーザーがケースを選択したら、Omniscript の次のステップに自動的にナビゲートする |
12 ~ 17 |
[Create New Case (ケースを新規作成)] ウィンドウを開く |
19 ~ 23 |
[Create New Case (ケースを新規作成)] ウィンドウを閉じる |
25 ~ 26 |
取引先から新規ケースレコードを含むケースを取得する |
31 ~ 35 |
切断時に pubsub イベントへの登録をすべて解除する disconnectedCallback を追加して、pubsub イベントへの登録を解除します。 |
カスタム Lightning Web コンポーネントのプロパティ
Omniscript デザイナーで、独自のカスタム Lightning Web コンポーネントを記述して Omniscript に組み込むときは、Custom Lightning Web Component 要素を使用します。この入力要素を設計ウィンドウにドラッグすると、プロパティを構成できます。
- [Name (名前)] (1) と [Field Label (項目表示ラベル)] (2) に、Custom Lightning Web Component 要素の名前と表示名を入力します。
- [Lightning Web Component Name (Lightning Web コンポーネント名)] (3) 項目に、カスタム Lightning Web コンポーネントの名前を入力します。この例では、名前は caseSelectableItemLWC です。
- カスタムコンポーネントで OmniscriptBaseMixin を拡張しない場合のみ、[Standalone LWC (スタンドアロン LWC)] チェックボックス (4) をオンにします。スタンドアロンの Lightning Web コンポーネントは Omniscript とは独立して動作します。このモジュールの例は該当しないため、チェックボックスをオフのままにします。
Vijay は Case Management (ケース管理) Omniscript のステップ 1 の構成を完成させました。次は、ステップ 2 Manage Case Comments (ケースコメントを管理) に取り組みます。
リソース
- Salesforce ヘルプ: Common Action Utility for Remote Calls (リモートコールの共通アクションユーティリティ) (管理パッケージ用 Omnistudio)
- Salesforce ヘルプ: Pubsub Component (Pubsub コンポーネント) (管理パッケージ用 Omnistudio)
- Salesforce ヘルプ: Extend the OmniscriptBaseMixin Component (OmniscriptBaseMixin コンポーネントの拡張) (管理パッケージ用 Omnistudio)
- Salesforce ヘルプ: Custom Lightning Web Component Properties (カスタム Lightning Web コンポーネントのプロパティ) (管理パッケージ用 Omnistudio)