インタラクティブフィルターをポータルから使用することはできますか?またリクエスタロールを保持するユーザが使用することはできますか?
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
12-11-2024 08:46 PM
ダッシュボード、レポートについては閲覧可能権限としてリクエスタを追加し、ポータルからクイックリンク等で閲覧できると思います。しかし、インタラクティブフィルターは権限を設定する箇所はなく、ポータルから閲覧することもできない認識です。
以下2点が可能か教えて頂きたいです。よろしくお願い致します。
・インタラクティブフィルターをポータルから使用することはできるか
・リクエスタロールを保持するユーザが使用することはできるか
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
12-31-2024 01:20 AM
ServiceNowのサービスポータルでは標準のインタラクティブフィルターが用意されていないため、レポートを動的にフィルタリングするには自作する必要があります。今回の実装では、標準のReport Widgetをクローンし、Interactive FilterをHTMLとスクリプトで自作して組み込みました。
概要
- HTML: フィルター用のselect要素を追加し、選択時に自動でフィルターが適用されるように設計しました。
- Server-Side Script: GlideRecordを使用して、incidentテーブルからカテゴリの選択肢を取得し、クライアント側に送信しました。
- Client-Side Script: ng-changeイベントを使用して、選択時にフィルターが即時適用されるようにしました
作り方
1、Report Widgetをクローン
既存のReport Widgetを複製し、新しいWidgetを作成。
2、HTMLの追加
以下のHTMLをWidgetのHTMLセクションに追加。
<!-- Category Filter -->
<div class="form-inline">
<label for="categoryFilter" class="control-label">Category:</label>
<select id="categoryFilter"
class="form-control"
ng-model="c.selectedCategory"
ng-options="option.value as option.label for option in c.data.categoryOptions"
ng-change="c.applyFilter()">
<option value="">-- Select Category --</option>
</select>
</div>
3、Server-Side Scriptの追加
以下のコードでカテゴリの選択肢を取得。
// Categoryフィールドの選択肢を取得
var gr = new GlideRecord("incident");
gr.initialize();
var choices = gr.category.getChoices();
var categoryOptions = [];
for (var i = 0; i < choices.size(); i++) {
gr.category = choices.get(i); // 内部値をセット
var displayValue = gr.category.getDisplayValue(); // 表示値を取得
categoryOptions.push({
value: gr.category.toString(),
label: displayValue,
});
}
data.categoryOptions = categoryOptions; // クライアントに送信
4、Client-Side Scriptの追加
ng-changeでフィルターを即時適用。
c.applyFilter = function () {
$timeout(function () {
var report_query = "category=" + c.selectedCategory; // カテゴリでフィルタ
if (!c.selectedCategory) {
report_query = "";
}
var params = {
jvar_report_id: reportId,
sysparm_interactive_report: JSON.stringify({
additional_filters: [ [ {
table: "incident",
filter: report_query
} ] ]
})
};
var targetEl = $("#report-widget-" + c.rectangleId);
embedReportByParams(targetEl, params);
});
};
注意点
ClientScriptでレポートを作成している embedReportByParams はServiceNowの公式ドキュメントで説明されているAPIです。
しかし、sysparm_interactive_reportの使い方については記載がありません。そのため、今回の実装は動作するものの、正確な使い方である保証はなく、今後のバージョンアップで仕様が変更される可能性があります。