mirror of
https://github.com/grafana/grafana.git
synced 2025-07-30 13:12:14 +08:00

* feat: supporting code for groupsync extension UI * Add result of running i18n extraction * Place the UI behind a feature toggle as well as the license feature * Also add access checks to route loading of groupsync route with feature toggle * Add access check on permissions to show External group sync in nav * fix: New version of multiOrgRoleOptions hook * Remove OSS route definition * Apply feedback on nav title
51 lines
1.6 KiB
TypeScript
51 lines
1.6 KiB
TypeScript
import { difference } from 'lodash';
|
|
import { useState } from 'react';
|
|
import { useDeepCompareEffect } from 'react-use';
|
|
import useAsync from 'react-use/lib/useAsync';
|
|
|
|
import { contextSrv } from 'app/core/core';
|
|
import { Role, AccessControlAction } from 'app/types';
|
|
|
|
import { fetchRoleOptions } from './api';
|
|
|
|
type MultiOrgRoleOptions = Record<number, Role[]>;
|
|
|
|
export const useRoleOptions = (organizationId: number) => {
|
|
const [orgId, setOrgId] = useState(organizationId);
|
|
|
|
const { value = [] } = useAsync(async () => {
|
|
if (contextSrv.licensedAccessControlEnabled() && contextSrv.hasPermission(AccessControlAction.ActionRolesList)) {
|
|
return fetchRoleOptions(orgId);
|
|
}
|
|
return Promise.resolve([]);
|
|
}, [orgId]);
|
|
|
|
return [{ roleOptions: value }, setOrgId] as const;
|
|
};
|
|
|
|
export const useMultiOrgRoleOptions = (orgIDs: number[]): MultiOrgRoleOptions => {
|
|
const [orgRoleOptions, setOrgRoleOptions] = useState<MultiOrgRoleOptions>({});
|
|
|
|
useDeepCompareEffect(() => {
|
|
if (!contextSrv.licensedAccessControlEnabled() || !contextSrv.hasPermission(AccessControlAction.ActionRolesList)) {
|
|
return;
|
|
}
|
|
|
|
const currentOrgIDs = Object.keys(orgRoleOptions).map((o) => (typeof o === 'number' ? o : parseInt(o, 10)));
|
|
const newOrgIDs = difference(orgIDs, currentOrgIDs);
|
|
|
|
Promise.all(
|
|
newOrgIDs.map((orgID) => {
|
|
return fetchRoleOptions(orgID).then((roleOptions) => [orgID, roleOptions]);
|
|
})
|
|
).then((value) => {
|
|
setOrgRoleOptions({
|
|
...orgRoleOptions,
|
|
...Object.fromEntries(value),
|
|
});
|
|
});
|
|
}, [orgIDs]);
|
|
|
|
return orgRoleOptions;
|
|
};
|