取引先にカスタムフィルターを適用する

IUserFilterProviderの実装の具体例として、「取引先」のビューに所有者が「自分」または「自分が所属する部署のユーザ」をフィルター条件にしたカスタムフィルターの実装方法を説明します。

実装の手順

1. Apexクラスを作成する

最初に表示するVisualfroceページのカスタムコントローラを作成します。

  1. Salesforce Classicの場合、「設定 > 開発 > Apex クラス」をクリックする。Lightning Experienceの場合、歯車アイコンをクリックした後「設定 > カスタムコード > Apex クラス」をクリックする。
  2. 「新規」ボタンをクリックし、「Apex Class」に次のコードを貼り付ける。

    public with sharing class CustomFilterDemoPageController {
      private string accountId;
    
      public string getAccountId(){
        return this.accountId;
      }
        
      public void setAccountId(string v){
        this.accountId = v;
      }
      public void setAccountId(){
    
      }
    
      public String getBaseUrl(){
        return URL.getSalesforceBaseUrl().toExternalForm();
      }
    }
    
  3. 「保存」をクリックする。

次にRaySheetが提供するApexインターフェースを使用してカスタムフィルターを実装します。ここでは、ログインユーザの氏名およびログインユーザが所属する部署をフィルター条件にしたカスタムフィルターを作成します。

まず、所有者が自分になるフィルター条件のカスタムフィルターを作成します。

  1. 「Apex クラス」ページで「新規」ボタンをクリックし、「Apex Class」に次のコードを貼り付ける。

    global class MyAccounts implements gcss.IUserFilterProvider{
      global gcss.UserFilter getUserFilter(string objectName){
        if (objectName != 'Account'){
          return null;
        }
            
        // ログインユーザの情報を取得します。
        String userid = UserInfo.getUserId();
        User myuser = [select Id from User where id = :userid];
     
        gcss.UserFilter result = new gcss.UserFilter();
    
        // SOQL文のWHERE句にフィルター条件を追加します。
        result.whereClause = 'Owner.Id= :userArg1';
    
        // ログインユーザのID情報を設定します。
        result.userArg1 = myuser.Id;
        return result;
      }
    }
    
  2. 「保存」をクリックする。

次に所属部署をフィルター条件にしたカスタムフィルターを作成します。ここでは、所属部署名を配列に追加してフィルター条件を設定してみます。

  1. 「Apex クラス」ページで「新規」ボタンをクリックし、「Apex Class」に次のコードを貼り付ける。

    global class MyDepartmentAccounts implements gcss.IUserFilterProvider{
      global gcss.UserFilter getUserFilter(string objectName){
        if (objectName != 'Account'){
          return null;
        }
    
        // ログインユーザの所属する部署の情報を取得します。
        String userid = UserInfo.getUserId();
        User myuser = [select Department from User where id = :userid];
    
        // フィルター条件の部署名を配列に追加します。
        List<string> depts = new List<string>();
        depts.add(myuser.Department);
        // depts.add('');
        // depts.add('');
    
        gcss.UserFilter result = new gcss.UserFilter();
    
        // SOQL文のWHERE句にフィルター条件を追加します。
        result.whereClause = 'Owner.Department= :userArg1';
    
        // ログインユーザの所属部署の情報を設定します。
        result.userArg1 = depts;
        return result;
      }
    }
    
  2. 「保存」をクリックする。

2. Visualforceページを作成する

Visualforceページを作成します。上記で作成した2つのカスタムフィルターを切り替えるラジオボタンと「どこでもView(gcss:Spreadsheetコンポーネント)」を配置します。

  1. Salesforce Classicの場合、「設定 > 開発 > Visualforceページ」をクリックする。Lightning Experienceの場合、歯車アイコンをクリックした後「設定 > カスタムコード > Visualforceページ」をクリックする。
  2. 「新規」ボタンをクリックする。
  3. 「表示ラベル」と「名前」に「CustomFilterDemo」と記入する。
  4. 「Visualforce Markup」に次の内容を入力し、「保存」ボタンをクリックする。
<apex:page controller="CustomFilterDemoPageController" standardStylesheets="false" sidebar="false" lightningStylesheets="true">
  <div >
    <article class="slds-card" style="padding: 16px;">
      <!-- カスタムフィルター用のラジオボタンを追加 -->
      <div id="apex-filter-switch" style="margin: 10px; display: inline-block;">
        <span class="slds-radio">
          <input id="buttonId-myAccounts" type="radio" name="accountFilter" value="myAccounts"  checked="checked" />
          <label for="buttonId-myAccounts" class="slds-radio__label">
            <span class="slds-radio_faux"></span>
            <span class="slds-form-element__label">私のレコード</span>
          </label>
        </span>                    
        <span class="slds-radio">
          <input id="buttonId-myDepartmentAccounts" type="radio" name="accountFilter" value="myDepartmentAccounts" />
          <label for="buttonId-myDepartmentAccounts" class="slds-radio__label">
            <span class="slds-radio_faux"></span>
            <span class="slds-form-element__label">私の部署のレコード</span>
          </label>
        </span>
      </div>

      <!-- RaySheetを追加 -->
      <div class="slds-card__body" style="height:500px">
        <gcss:Spreadsheet id="sheet1"
          object="Account"
          ShowTitleBar="true" />
      </div>
    </article>
  </div>
    
  <script>    
    document.addEventListener("DOMContentLoaded", function(){
      setTimeout(function(){
        init();
      });
    }, false);

    document.addEventListener("load", function(){
      setTimeout(function(){
        init();
      });
    }, false);

    function init(){
      if (window.isDemoInitialized){
        return;
      }

      window.isDemoInitialized = true

      // イベントハンドラの登録
      document.getElementById("buttonId-myAccounts").addEventListener("change", onViewSelectorChanged)
      document.getElementById("buttonId-myDepartmentAccounts").addEventListener("change", onViewSelectorChanged)
    
      // JavaScriptのsetUserFilterProviderの呼び出し
      var sheet1 = gcbg.getRaySheet("sheet1");
      sheet1.setUserFilterProvider("MyAccounts");
    }
    
    function onViewSelectorChanged(e){
      var input = e.target;
      var selectedFilter = input.value;
      var sheet1 = gcbg.getRaySheet("sheet1");
      var customFilterClassName = "";

      switch(selectedFilter){
        case "myAccounts":
          customFilterClassName = "MyAccounts";
          break;
        case "myDepartmentAccounts":
          customFilterClassName = "MyDepartmentAccounts";
          break;
        default:
          customFilterClassName = "";
          break;
      }
      // ラジオボタンの値にあわせてJavaScriptのsetUserFilterProviderの呼び出し
      sheet1.setUserFilterProvider(customFilterClassName);
    }

    function getRadioButtonTemplate(){
      return document.getElementById("radio-button-template").innerHTML;
    }
  </script>
</apex:page>

このVisualforceページはオブジェクトモードが前提です。フォルダモードの場合は、gcss:Spreadsheetコンポーネントの属性”object”の部分を”FolderId”に変更してください。

3. Visualforceページのセキュリティを設定する

Visualforceページは、既定ではシステム管理者のプロファイルを割り当てられたユーザだけが表示できます。システム管理者以外のプロファイルにも許可するには、Visualforceページのセキュリティを設定します。

  1. Salesforce Classicの場合、「設定 > 開発 > Visualforceページ」をクリックする。Lightning Experienceの場合、歯車アイコンをクリックした後「設定 > カスタムコード > Visualforceページ」をクリックする。
  2. 前項で作成した「CustomFilterDemo」を見つける。
  3. 「CustomFilterDemo」の左側に表示される「セキュリティ」をクリックする。
  4. 左のリストから割り当てるプロファイル、たとえば「標準ユーザ」をクリックして選択し、「>」ボタンをクリックして右のリストに追加する。
  5. 「保存」ボタンをクリックする。

4. 動作を確認する

作成したVisualforceページのタブを作成して動作を確認します。

  1. Salesforce Classicの場合、「設定 > ビルド > 作成 > タブ」をクリックする。Lightning Experienceの場合、歯車アイコンをクリックした後「プラットフォームツール > ユーザインタフェース > タブ」をクリックする。
  2. 「Visualforceタブ」の「新規」ボタンをクリックする。
  3. 「Visualforceページ」に「CustomFilterDemo」を選択する。
  4. 「タブの表示ラベル」と「タブ名」に「CustomFilterDemo」を入力する。
  5. 「タブスタイル」に任意のスタイルを選択する。
  6. 「次へ」をクリックし、タブをプロファイルに割り当て、保存する。
  7. 追加したタブ「CustomFilterDemo」からVisualforceページを開く。
  8. RaySheetの黒色のバーから「カスタムフィルター用のビュー」を選択する。
  9. 画面の上部にあるラジオボタンの選択を変更することで、レコード一覧の内容が変更することを確認する。
Copyright © 2019 GrapeCity inc. All rights reserved.