コンテンツにスキップ

$p.apiGroupsGet

概要

AjaxのPOSTリクエストにより、グループ情報を取得します。

構文

グループIDを直接指定して1件取得する場合

JavaScript
$p.apiGroupsGet({
    id: <グループID>,
    done: <任意の処理>,
    fail: <任意の処理>,
    always: <任意の処理>
});

グループ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. 複合条件判定によるボタン表示制御

機能要件

  1. 以下条件で、ボタンの表示を制御します。












































    部門(組織) 役職(グループ) 承認 更新
    営業部 部長 表示 表示
    課長 非表示 表示
    一般社員 非表示 非表示
    開発部 部長 非表示 表示
    課長 非表示 表示
    一般社員 非表示 非表示

  2. 部門、役職を以下のように定義します。

種類 ID 組織/グループ
営業部 6 組織
開発部 7 組織
部長 3 グループ
課長 2 グループ

Note

一般社員は、グループ所属無しの想定

  1. ボタン制御

  2. 承認:プロセスで設定

  3. 更新:標準の更新ボタン

実務での使いどころ

承認や更新など、担当ロールごとに操作可能なアクションを画面上で出し分けたい場合
複数部門・複数役職の組み合わせでアクセス制御を行いたい場合
権限テーブルを別途持たずに、既存の組織・グループ構造だけで制御を完結させたい場合

// ===== 設定 =====
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();
        });
    });
};

関連情報