IUserFilterProviderの実装の具体例として、「取引先」のビューに所有者が「自分」または「自分が所属する部署のユーザー」をフィルター条件にしたカスタムフィルターの実装方法を説明します。
最初に表示するVisualfroceページのカスタムコントローラーを作成します。
「新規」ボタンをクリックし、「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();
}
}
「保存」をクリックする。
次にRaySheetが提供するApexインターフェースを使用してカスタムフィルターを実装します。ここでは、ログインユーザーの氏名およびログインユーザーが所属する部署をフィルター条件にしたカスタムフィルターを作成します。
まず、所有者が自分になるフィルター条件のカスタムフィルターを作成します。
「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;
}
}
「保存」をクリックする。
次に所属部署をフィルター条件にしたカスタムフィルターを作成します。ここでは、所属部署名を配列に追加してフィルター条件を設定してみます。
「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;
}
}
「保存」をクリックする。
Visualforceページを作成します。上記で作成した2つのカスタムフィルターを切り替えるラジオボタンと「どこでもView(gcss:Spreadsheetコンポーネント)」を配置します。
<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”に変更してください。
Visualforceページは、既定ではシステム管理者のプロファイルを割り当てられたユーザーだけが表示できます。システム管理者以外のプロファイルにも許可するには、Visualforceページのセキュリティを設定します。
作成したVisualforceページのタブを作成して動作を確認します。