Salesforceの行動をコピーするLightning Componentを作ってみた


# はじめに
以前からSalesforceの行動（Event）を使用していて、コピー機能が欲しかったが、
条件を満たすレコードでないとコピーボタンが表示されないため、不自由していた。
> メンバー招集機能の行動については、行動に被招集者がある場合の、
> 招集側のレコードに標準機能の [コピー] ボタンが表示されます。しかし、以下の場合は [コピー] ボタンが表示されません。
> 　・被招集者がいない行動
> 　・招集された側の行動

https://help.salesforce.com/s/articleView?id=000331780&type=1


ヘルプページを参考に、コピーボタンを作成してみたが、行動に繰り返しが設定されている場合、コピーするとおかしなことになるため使い物にならなかった。（コピーした行動の日付はあっているが、時間が違うなど）

そのため、どうにか繰り返しが設定されているかチェックして、設定されている場合はなんらかの方法でできない旨のメッセージを表示してコピーできないようにしたかったのだが、標準機能では無理だった。
先日、LightningComponentで出来る方法を思いついたので試してみたところ、うまくいったため同様の問題に悩んでいる方はこれを参考にしてしてみて。

# コード

まずApexのコントローラを作成。
Idで行動を取得して、行動の繰り返し有無を返却するだけ。
``` Apex:cmpEventCloneController.cls
public class cmpEventCopyController {

    @AuraEnabled
    public static Boolean checkRepeat(String recId){
        // 行動ﾃﾞｰﾀを取得
        Event eve = [select Id , IsRecurrence2 from Event where Id = :recId];
        // 行動ﾃﾞｰﾀの繰り返し有無を返却
        return eve.IsRecurrence2;
    }
}
```

次にLightning Componentを作成。
``` cmp:cmpEventClone.cmp
<aura:component implements="force:lightningQuickAction,force:hasRecordId" controller="cmpEventCloneController" access="global">

    <aura:handler name="init" value="{!this}" action="{!c.doInit}"/>
    <aura:attribute name="isRepeat" type="Boolean" default="false"/>    
    
    <aura:if isTrue="{!v.isRepeat}">
        
        <div class="slds-p-around--large slds-align_absolute-center slds-size_1-of-1 slds-is-relative">
            <p>繰り返しの行動はコピーできません。</p>
        </div>
                
    </aura:if>
    
    <aura:html tag="style">
        .slds-modal__content{
            overflow-y:hidden !important;
            height:unset !important;
            max-height:unset !important;
        }
    </aura:html>

</aura:component>
``` 
force:hasRecordId」を指定することにより、クイックアクションから表示する際に、表示していたデータのレコードIdを勝手に取得してくれる。
「＜aura:if isTrue="{!v.isRepeat}"＞」の部分は、繰り返しが設定されている行動の場合のみ表示するようにしているため、デフォルトでは表示されないようにした。
「＜aura:html tag="style"＞」は、コンポーネントが表示された際にでかすぎるので調整。


``` cmpEventCloneController.js
({
    doInit : function(c,e,h){
        let recId = c.get("v.recordId");
        let action = c.get("c.checkRepeat");
        action.setParam
        action.setParams({
            "recId": recId
        });
        
        action.setCallback(this,function(response){
            
            let state = response.getState();
            console.log('state:' + state);
            if(state == 'SUCCESS'){
                let retValue = response.getReturnValue();
                if(retValue){
                    c.set("v.isRepeat", true);
                }else{
                    var eUrl= $A.get("e.force:navigateToURL");
                    eUrl.setParams({
      					"url": '/' + recId + '/e?clone=1'
    				});
    				eUrl.fire();
                }
            }
        });
        
        $A.enqueueAction(action);
    },   
})
```
doInitでは、Apexのメソッド「checkRepeat」で繰り返し有無を取得
取得した値が　Trueの場合はこのコンポーネントのボディ部分を表示する。
　　　　　　　Falseの場合は、force:navigateToURLで「/Event.Id/e?clone=1」
　　　　　　　　　　を指定して実行する。
 **force:navigateToURLで「/Event.Id/e?clone=1」 を実行** 
↑ここを思いついた


ここまでできたら、行動でこのコンポーネントを指定して、クイックアクションを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35123/b307aaaf-dcde-74f3-c050-0648b9a7749b.png)

ボタンを配置して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35123/2ee88eb1-1d67-03ef-e6f5-6d7012d232f6.png)

繰り返しなしの行動で、行動コピーをクリックすると以下のとおり表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35123/cce1af1a-07a6-0515-75f2-0eeada4be5f6.png)

繰り返しありの行動は、コピー画面が表示されない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35123/35875020-a995-53b4-a3bd-94fc20642248.png)