$p.apiGroupsGet
概要¶
AjaxのPOSTリクエストにより、グループ情報を取得します。
構文¶
グループIDを直接指定して1件取得する場合¶
JavaScript¶
グループIDを複数指定して取得する場合¶
JavaScript¶
$p.apiGroupsGet({
data:{
View: {
ColumnFilterHash: {
GroupId: '[<グループIDを配列で指定>]'
}
}
},
done: <任意の処理>,
fail: <任意の処理>,
always: <任意の処理>
});
使用例¶
グループIDを直接指定して1件取得する場合¶
| パラメータ名 | 説明 | 必須 |
|---|---|---|
| id | 取得対象のグループID | ○ |
| done | API通信成功 | ○ |
| fail | API通信失敗 | - |
| always | 完了時 | - |
JavaScript¶
$p.apiGroupsGet({
id: 123,
done: function (data) {
console.log(data);
console.log('グループ情報の取得に成功しました。');
},
fail: function () {
console.log('グループ情報の取得に失敗しました。');
},
always: function () {
console.log('グループ情報の取得が完了しました。');
}
});
グループIDを複数指定して取得する場合¶
| パラメータ名 | 説明 | 必須 |
|---|---|---|
| data | 取得対象のグループIDを配列で複数指定 | ○ |
| done | API通信成功 | ○ |
| fail | API通信失敗 | - |
| always | 完了時 | - |
JavaScript¶
$p.apiGroupsGet({
data: {
View: {
ColumnFilterHash: {
GroupId: '[100,101]'
}
}
},
done: function (data) {
console.log(data);
console.log('グループ情報の取得に成功しました。');
},
fail: function () {
console.log('グループ情報の取得に失敗しました。');
},
always: function () {
console.log('グループ情報の取得が完了しました。');
}
});
戻り値¶
API通信成功時に「done」に渡される値は、API「グループ取得」のレスポンスと同じ形式です。
サンプルコード¶
Note
コード内の【 ... 】は適宜修正してください。
1. 複合条件判定によるボタン表示制御
機能要件¶
-
以下条件で、ボタンの表示を制御します。
部門(組織) 役職(グループ) 承認 更新 営業部 部長 表示 表示 課長 非表示 表示 一般社員 非表示 非表示 開発部 部長 非表示 表示 課長 非表示 表示 一般社員 非表示 非表示 -
部門、役職を以下のように定義します。
| 種類 | ID | 組織/グループ |
|---|---|---|
| 営業部 | 6 | 組織 |
| 開発部 | 7 | 組織 |
| 部長 | 3 | グループ |
| 課長 | 2 | グループ |
Note
一般社員は、グループ所属無しの想定
-
ボタン制御
-
承認:プロセスで設定
- 更新:標準の更新ボタン
実務での使いどころ
承認や更新など、担当ロールごとに操作可能なアクションを画面上で出し分けたい場合
複数部門・複数役職の組み合わせでアクセス制御を行いたい場合
権限テーブルを別途持たずに、既存の組織・グループ構造だけで制御を完結させたい場合
// ===== 設定 =====
const deptSales = 【組織ID_1】; // 営業部
const deptDev = 【組織ID_2】; // 開発部
const groupManager = 【グループID_1】; // 部長
const groupSecManager = 【グループID_2】; // 課長
const buttonRules = [
{
id: 'Process_1',
depts: [deptSales],
groups: [groupManager],
}, // 承認:営業部 × 部長
{
id: 'UpdateCommand',
depts: [deptSales, deptDev],
groups: [groupManager, groupSecManager],
}, // 更新:営業/開発 × 部長/課長
];
// ===== エンジン:基本は触らない =====
const userId = $p.userId();
function matchesAny(ids, membershipMap) {
return ids.length === 0 || ids.some((id) => membershipMap[id]);
}
// 組織判定: $p.apiUsersGet で自分自身のユーザーレコードを取得し、DeptId を直接比較
const getMyDeptId = () => {
const dfd = $.Deferred();
$p.apiUsersGet({
id: userId,
done: function (res) {
dfd.resolve(res.Response.Data[0].DeptId);
},
fail: function () {
dfd.resolve(null);
},
});
return dfd.promise();
};
// グループ判定: $p.apiGroupsGet のレスポンス内 GroupMembers("User,ID,フラグ"形式の配列)に
// 自分のIDが含まれるかで判定(実機で確認済みの構造)
const getGroupMembership = (groupId) => {
const dfd = $.Deferred();
$p.apiGroupsGet({
id: groupId,
done: function (res) {
const members = res.Response.Data[0].GroupMembers || [];
const isMember = members.some((m) => m.startsWith(`User,${userId},`));
dfd.resolve({ id: groupId, isMember: isMember });
},
fail: function () {
dfd.resolve({ id: groupId, isMember: false });
},
});
return dfd.promise();
};
const groupIds = Array.from(new Set(buttonRules.flatMap((r) => r.groups)));
const groupPromises = groupIds.map(getGroupMembership);
// サーバースクリプト版の elements.DisplayType(描画前制御)と異なり、
// スクリプト版は画面表示後にボタンをjQueryでhide/showする
$p.events.on_editor_load = function () {
$.when(getMyDeptId(), ...groupPromises).done(function (myDeptId, ...groupResults) {
const deptMembership = {
[deptSales]: myDeptId === deptSales,
[deptDev]: myDeptId === deptDev,
};
const groupMembership = {};
groupResults.forEach((r) => { groupMembership[r.id] = r.isMember; });
buttonRules.forEach((rule) => {
const visible = matchesAny(rule.depts, deptMembership) && matchesAny(rule.groups, groupMembership);
visible ? $('#' + rule.id).show() : $('#' + rule.id).hide();
});
});
};
