Lightning Web コンポーネント(LWC)でいいね！ボタンを作成してみた。

# はじめに
* 他の人が作成したレコードに「👍いいね！」できればいいなーと思い、今回LWCでいいね！ボタンを作成してみました！  
* 入力したデータに「いいね！」がされるとモチベーションが上がりユーザーのデータ入力の促進になるかも！？📝  

# ソースコード(GitHub)
https://github.com/yutashio/sfdc_lwc_likebutton

:::note info
2024/09/01アップデート
いいね！を押したユーザーの一覧画面（モーダル）を追加しました！
:::

# イメージ  
![screen_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772806/bd816dc7-451e-962c-f1c2-f37eb756ab8a.png)
| いいね！なし（0件） | いいね！あり（1件）|  
| --- | --- |  
| ![no_like.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772806/728aa0af-4513-3be4-ad2e-9a850bea0502.png)| ![one_like.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772806/fa925b11-4a4c-2ae1-d9f1-2ccaf278fa8c.png) |  

| 複数ユーザーがいいね！を押した時のアイコン表示 | アイコンの表示件数を制限（画像はプログラムにて3件に制限） |  
| --- | --- |  
| ![multiple_likes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772806/9c93d394-b343-55c3-96db-7ce2f64c8252.png)| ![icon_display_restrictions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772806/6b899fad-c7cc-4f67-e4c9-23881224dffc.png)|  

| いいね！を押したユーザーの一覧画面へのリンク（画像はプログラムにて3件に制限） | いいね！を押したユーザーの一覧画面 |  
| --- | --- |  
| ![openlikeButtonWhoClicked.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772806/92d95e7c-adef-d434-1b00-5666a4373b32.png) | ![openlikeButtonWhoClickedModal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772806/3a59b639-98b4-b457-96e7-12b5c272a0d5.png) |  

# 準備と前提条件  
### カスタムオブジェクト作成
| 表示ラベル | API 参照名 |  
| --- | --- |  
| いいね | Like__c |  

### 項目作成
| 表示ラベル | API 参照名 | データ型 | 詳細 |  
| --- | --- | --- | --- |  
| いいね名 | `Name` | 自動採番 | ■表示形式：`like-{00000000}` |  
| User | `User_Id__c` | 参照関係(ユーザー) | ■子リレーション名：`User_Ids` |  
| Target_Id_String | `Target_Id_String__c` | テキスト(255) | - |  
| Target_Record_Url | `Target_Record_Url__c` | 数式 (テキスト) | ■数式：`HYPERLINK(LEFT($Api.Partner_Server_URL_350 ,FIND("/services/Soap/", $Api.Partner_Server_URL_350))& Target_Id_String__c, "レコードへ遷移")` |  

## いいね！ボタン（likebuttonコンポーネント）の配置  
配置手順は下記2つ  
* Lightning アプリケーションビルダー  
  * 設定 → ユーザーインターフェース → Lightning アプリケーションビルダー  
    * 配置したいレコードページを編集してlikebuttonコンポーネントをお好みの場所に配置。  
* 配置したいオブジェクトの「Lightning レコードページ」  
  * 設定 → オブジェクトマネージャー → 配置したいオブジェクト選択 → Lightning レコードページ  
    * 対象のレコードページを編集してlikebuttonコンポーネントをお好みの場所に配置。  

※下記画像は、**取引先オブジェクト**のLightning レコードページの画面右側にlikebuttonコンポーネントを配置しています。  
![lightning_application_builder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772806/5a07aa75-9b32-1210-3dc8-9684e6e0dc3e.png)

# 機能と特徴  
### いいね！ボタン（likebuttonコンポーネント）
* ユーザーは、レコードごとに「いいね！」をすることができます。  
  * いいね！を押したユーザーの件数とアイコンがボタン下部に表示されます。  
* 「いいね！」ボタン押下後は、「いいね！済み」ボタンに切り替わります。  
  * 「いいね！済み」ボタンを押下すると、いいねを取り消すことができ、ボタンは再度「いいね！」に切り替わります。  
* 画面に表示されるアイコンの件数の制限をしています。  
  * アイコンの表示件数が多いと画面を占領してしまうため。  
  * 初期設定は、**10件**にしています。  
:::note info
下記Apexクラスでアイコンの表示件数を制御しています。  
※件数を変更したい場合は、数字を変更してください。  
```LikeButtonController.cls
private static Integer MAX_DISPLAY_ICON = 10;
:::

### いいねオブジェクト・いいねレコード
![like_record.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772806/eb4c35eb-4944-f4d1-4db7-c1e4dd9c8d5a.png)
* ユーザーが「いいね！」をするとプログラムにより、上記画像のようにいいねレコードが作成されます。  
  * いいね名：`Name`  
    * 自動採番型のため自動で設定されます。  
  * User：`User_Id__c`  
    * いいね！を押したユーザーのID（参照項目）が設定されます。  
  * Target_Id_String：`Target_Id_String__c`  
    * ユーザーがいいね！を押したレコードのID（テキスト項目）が設定されます。  
  * Target_Record_Url：`Target_Record_Url__c`  
    * いいね！を押したレコードのIDをテキストで保持しているため、対象のレコードへ遷移するためのリンクを便利機能として数式で作成しています。  
* いいね！の取り消し及び「いいね！済み」ボタンを押下するとプログラムにより、いいねレコードが削除されます。  

:::note info  
●Target_Id_String：`Target_Id_String__c`  
いいね！ボタン（likebuttonコンポーネント）が、どのオブジェクトのレコードページに配置されても良いように、リレーション項目ではなく、テキスト項目でレコードIDを保持しています。  
:::

:::note warn
注意
**いいね！されるレコードは容易に削除されることはないだろう**という考えのため、今回のアーキテクチャ（テキスト項目でレコードIDを保持）にしています！  
万が一、いいね！を押したレコード自体が削除された場合、いいねレコードが宙ぶらりんの状態になってしまいます😥  
※上記のようなデータをメンテナンスするプログラムは、今回用意できておりません🙇‍♂️  必要な場合は、作成をお願い致します🙇‍♂️  
:::

# ER図
![er_diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772806/fa72a2e4-0b40-99db-09cd-bf219c520eb8.png)

# ディレクトリ構成
```
force-app
└─main
    └─default
        ├─classes
        │      LikeButtonController.cls
        │      LikeButtonController.cls-meta.xml
        │      LikeButtonControllerTest.cls
        │      LikeButtonControllerTest.cls-meta.xml
        │
        └─lwc
            ├─likeButton
            │      likeButton.html
            │      likeButton.js
            │      likeButton.js-meta.xml
            │
            └─likeButtonWhoClickedModal
                    likeButtonWhoClickedModal.html
                    likeButtonWhoClickedModal.js
                    likeButtonWhoClickedModal.js-meta.xml
```

# 参考にさせていただいた記事
ありがとうございました！  

https://qiita.com/geeorgey/items/4f41c84a9d53cfe5431b