@thunderid/react 1.10.0 → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/admin/GroupMembers/GroupMembers.cjs +39 -17
- package/dist/cjs/components/admin/GroupMembers/GroupMembers.cjs.map +1 -1
- package/dist/components/admin/GroupMembers/GroupMembers.d.ts +4 -0
- package/dist/components/admin/GroupMembers/GroupMembers.d.ts.map +1 -1
- package/dist/components/admin/GroupMembers/GroupMembers.js +40 -18
- package/dist/components/admin/GroupMembers/GroupMembers.js.map +1 -1
- package/package.json +2 -2
|
@@ -29,11 +29,12 @@ const getMembershipInvalidatedKeys = ({ groupId }) => [
|
|
|
29
29
|
* <GroupMembers groupId={groupId} />
|
|
30
30
|
* ```
|
|
31
31
|
*/
|
|
32
|
-
const GroupMembers = ({ administrationMode, editable = false, groupId, preferences,...rest }) => {
|
|
32
|
+
const GroupMembers = ({ administrationMode, editable = false, groupId, ouId, preferences,...rest }) => {
|
|
33
33
|
const { t } = require_useTranslation.default(preferences?.i18n);
|
|
34
34
|
const groupsEndpoint = require_useManagementEndpoint.default("groups");
|
|
35
35
|
const usersEndpoint = require_useManagementEndpoint.default("users");
|
|
36
36
|
const agentsEndpoint = require_useManagementEndpoint.default("agents");
|
|
37
|
+
const filter = (0, __thunderid_browser.toEqualityFilter)("ouId", ouId);
|
|
37
38
|
const members = require_useResourceQuery.default([
|
|
38
39
|
__thunderid_browser.GroupQueryKeys.GROUP_MEMBERS,
|
|
39
40
|
groupId,
|
|
@@ -44,15 +45,29 @@ const GroupMembers = ({ administrationMode, editable = false, groupId, preferenc
|
|
|
44
45
|
groupId,
|
|
45
46
|
limit: 100
|
|
46
47
|
}), { enabled: Boolean(groupId) });
|
|
47
|
-
const users = require_useResourceQuery.default([__thunderid_browser.UserQueryKeys.USERS, {
|
|
48
|
-
|
|
49
|
-
fetcher,
|
|
48
|
+
const users = require_useResourceQuery.default([__thunderid_browser.UserQueryKeys.USERS, {
|
|
49
|
+
filter,
|
|
50
50
|
limit: 100
|
|
51
|
+
}], async (fetcher) => ({
|
|
52
|
+
filter,
|
|
53
|
+
page: await (0, __thunderid_browser.getUsers)({
|
|
54
|
+
...usersEndpoint,
|
|
55
|
+
fetcher,
|
|
56
|
+
filter,
|
|
57
|
+
limit: 100
|
|
58
|
+
})
|
|
51
59
|
}), { enabled: editable });
|
|
52
|
-
const agents = require_useResourceQuery.default([__thunderid_browser.AgentQueryKeys.AGENTS, {
|
|
53
|
-
|
|
54
|
-
fetcher,
|
|
60
|
+
const agents = require_useResourceQuery.default([__thunderid_browser.AgentQueryKeys.AGENTS, {
|
|
61
|
+
filter,
|
|
55
62
|
limit: 100
|
|
63
|
+
}], async (fetcher) => ({
|
|
64
|
+
filter,
|
|
65
|
+
page: await (0, __thunderid_browser.getAgents)({
|
|
66
|
+
...agentsEndpoint,
|
|
67
|
+
fetcher,
|
|
68
|
+
filter,
|
|
69
|
+
limit: 100
|
|
70
|
+
})
|
|
56
71
|
}), { enabled: editable });
|
|
57
72
|
const add = require_useResourceMutation.default(({ groupId: id, members: changes }, fetcher) => (0, __thunderid_browser.addGroupMembers)({
|
|
58
73
|
...groupsEndpoint,
|
|
@@ -67,16 +82,23 @@ const GroupMembers = ({ administrationMode, editable = false, groupId, preferenc
|
|
|
67
82
|
groupId: id,
|
|
68
83
|
members: changes
|
|
69
84
|
}), getMembershipInvalidatedKeys);
|
|
70
|
-
const candidates = (0, react.useMemo)(() =>
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
85
|
+
const candidates = (0, react.useMemo)(() => {
|
|
86
|
+
const current = (data) => data && data.filter === filter ? data.page : void 0;
|
|
87
|
+
return {
|
|
88
|
+
agent: (current(agents.data)?.agents ?? []).map((agent) => ({
|
|
89
|
+
id: agent.id,
|
|
90
|
+
label: (0, __thunderid_browser.getAgentName)(agent)
|
|
91
|
+
})),
|
|
92
|
+
user: (current(users.data)?.users ?? []).map((user) => ({
|
|
93
|
+
id: user.id,
|
|
94
|
+
label: (0, __thunderid_browser.resolveManagedIdentityName)(user)
|
|
95
|
+
}))
|
|
96
|
+
};
|
|
97
|
+
}, [
|
|
98
|
+
agents.data,
|
|
99
|
+
filter,
|
|
100
|
+
users.data
|
|
101
|
+
]);
|
|
80
102
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_BaseGroupMembers.default, {
|
|
81
103
|
members: members.data?.members ?? [],
|
|
82
104
|
isLoading: members.isLoading,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GroupMembers.cjs","names":["GroupQueryKeys","RoleQueryKeys","GroupMembers: FC<GroupMembersProps>","useTranslation","groupsEndpoint: ManagementEndpoint","useManagementEndpoint","usersEndpoint: ManagementEndpoint","agentsEndpoint: ManagementEndpoint","members: ResourceQueryResult<GroupMemberListResponse>","useResourceQuery","users: ResourceQueryResult<ManagedUserListResponse
|
|
1
|
+
{"version":3,"file":"GroupMembers.cjs","names":["GroupQueryKeys","RoleQueryKeys","GroupMembers: FC<GroupMembersProps>","useTranslation","groupsEndpoint: ManagementEndpoint","useManagementEndpoint","usersEndpoint: ManagementEndpoint","agentsEndpoint: ManagementEndpoint","filter: string | undefined","members: ResourceQueryResult<GroupMemberListResponse>","useResourceQuery","users: ResourceQueryResult<FilteredPage<ManagedUserListResponse>>","UserQueryKeys","agents: ResourceQueryResult<FilteredPage<AgentListResponse>>","AgentQueryKeys","add: ResourceMutationResult<Group, GroupMembersVariables>","useResourceMutation","remove: ResourceMutationResult<Group, GroupMembersVariables>","candidates: Partial<Record<'user' | 'agent', IdentityCandidate[]>>","BaseGroupMembers"],"sources":["../../../../../src/components/admin/GroupMembers/GroupMembers.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n AdministrationMode,\n AgentListResponse,\n AgentQueryKeys,\n BasicAgent,\n Group,\n GroupMember,\n GroupMemberListResponse,\n GroupQueryKeys,\n ManagedUser,\n ManagedUserListResponse,\n ResourceQueryKey,\n RoleQueryKeys,\n UserQueryKeys,\n addGroupMembers,\n getAgentName,\n getAgents,\n getGroupMembers,\n getUsers,\n removeGroupMembers,\n resolveManagedIdentityName,\n toEqualityFilter,\n toManagementErrorMessage,\n} from '@thunderid/browser';\nimport {FC, ReactElement, useMemo} from 'react';\nimport BaseGroupMembers, {BaseGroupMembersProps} from './BaseGroupMembers';\nimport useManagementEndpoint, {ManagementEndpoint} from '../../../hooks/management/useManagementEndpoint';\nimport useResourceMutation, {ResourceMutationResult} from '../../../hooks/management/useResourceMutation';\nimport useResourceQuery, {ResourceQueryResult} from '../../../hooks/management/useResourceQuery';\nimport useTranslation from '../../../hooks/useTranslation';\nimport {IdentityCandidate} from '../shared/IdentityPicker';\n\ninterface GroupMembersVariables {\n groupId: string;\n members: Pick<GroupMember, 'id' | 'type'>[];\n}\n\n/**\n * A candidate page with the filter it was listed with.\n */\ninterface FilteredPage<T> {\n filter: string | undefined;\n page: T;\n}\n\n/**\n * Query keys to refetch after a group's membership changes.\n */\nconst getMembershipInvalidatedKeys = ({groupId}: GroupMembersVariables): ResourceQueryKey[] => [\n [GroupQueryKeys.GROUP, groupId],\n [GroupQueryKeys.GROUP_MEMBERS, groupId],\n [GroupQueryKeys.MEMBERSHIPS],\n [RoleQueryKeys.ROLE_ASSIGNMENTS],\n];\n\nexport type GroupMembersProps = Omit<\n BaseGroupMembersProps,\n 'candidates' | 'error' | 'isLoading' | 'isMutating' | 'members' | 'onAdd' | 'onRemove'\n> & {\n /**\n * How a member is removed. `flow` runs the administration flow the server configures for it, which can revoke\n * grants and end sessions first. It needs `baseUrl`.\n * @default 'native'\n */\n administrationMode?: AdministrationMode;\n /**\n * Whether members can be added and removed from this view.\n * @default false\n */\n editable?: boolean;\n groupId: string;\n /**\n * Organization unit the users and agents offered for adding are listed from.\n */\n ouId?: string;\n};\n\n/**\n * Lists the users and agents in a group, and lets the signed-in user add and remove them.\n *\n * @example\n * ```tsx\n * <GroupMembers groupId={groupId} />\n * ```\n */\nconst GroupMembers: FC<GroupMembersProps> = ({\n administrationMode,\n editable = false,\n groupId,\n ouId,\n preferences,\n ...rest\n}: GroupMembersProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const groupsEndpoint: ManagementEndpoint = useManagementEndpoint('groups');\n const usersEndpoint: ManagementEndpoint = useManagementEndpoint('users');\n const agentsEndpoint: ManagementEndpoint = useManagementEndpoint('agents');\n const filter: string | undefined = toEqualityFilter('ouId', ouId);\n const members: ResourceQueryResult<GroupMemberListResponse> = useResourceQuery(\n [GroupQueryKeys.GROUP_MEMBERS, groupId, {limit: 100}],\n (fetcher) => getGroupMembers({...groupsEndpoint, fetcher, groupId, limit: 100}),\n {enabled: Boolean(groupId)},\n );\n const users: ResourceQueryResult<FilteredPage<ManagedUserListResponse>> = useResourceQuery(\n [UserQueryKeys.USERS, {filter, limit: 100}],\n async (fetcher) => ({filter, page: await getUsers({...usersEndpoint, fetcher, filter, limit: 100})}),\n {enabled: editable},\n );\n const agents: ResourceQueryResult<FilteredPage<AgentListResponse>> = useResourceQuery(\n [AgentQueryKeys.AGENTS, {filter, limit: 100}],\n async (fetcher) => ({filter, page: await getAgents({...agentsEndpoint, fetcher, filter, limit: 100})}),\n {enabled: editable},\n );\n const add: ResourceMutationResult<Group, GroupMembersVariables> = useResourceMutation(\n ({groupId: id, members: changes}: GroupMembersVariables, fetcher) =>\n addGroupMembers({...groupsEndpoint, fetcher, groupId: id, members: changes}),\n getMembershipInvalidatedKeys,\n );\n const remove: ResourceMutationResult<Group, GroupMembersVariables> = useResourceMutation(\n ({groupId: id, members: changes}: GroupMembersVariables, fetcher) =>\n removeGroupMembers({...groupsEndpoint, administrationMode, fetcher, groupId: id, members: changes}),\n getMembershipInvalidatedKeys,\n );\n\n const candidates: Partial<Record<'user' | 'agent', IdentityCandidate[]>> = useMemo(() => {\n // A page listed for an earlier ouId stays in a query until the next one succeeds, so it is not offered.\n const current = <T,>(data: FilteredPage<T> | undefined): T | undefined =>\n data && data.filter === filter ? data.page : undefined;\n\n return {\n agent: (current(agents.data)?.agents ?? []).map((agent: BasicAgent) => ({\n id: agent.id,\n label: getAgentName(agent),\n })),\n user: (current(users.data)?.users ?? []).map((user: ManagedUser) => ({\n id: user.id,\n label: resolveManagedIdentityName(user),\n })),\n };\n }, [agents.data, filter, users.data]);\n\n return (\n <BaseGroupMembers\n members={members.data?.members ?? []}\n isLoading={members.isLoading}\n isMutating={add.isLoading || remove.isLoading}\n error={\n toManagementErrorMessage(t, members.error, 'admin.groups.members.error') ??\n toManagementErrorMessage(t, add.error ?? remove.error, 'admin.groups.members.update_error')\n }\n candidates={editable ? candidates : undefined}\n onAdd={\n editable\n ? (member: Pick<GroupMember, 'id' | 'type'>): void => void add.mutate({groupId, members: [member]})\n : undefined\n }\n onRemove={\n editable\n ? (member: GroupMember): void => void remove.mutate({groupId, members: [{id: member.id, type: member.type}]})\n : undefined\n }\n preferences={preferences}\n {...rest}\n />\n );\n};\n\nexport default GroupMembers;\n"],"mappings":";;;;;;;;;;;;;;;;;AAmDA,MAAM,gCAAgC,EAAC,cAAwD;CAC7F,CAACA,mCAAe,OAAO,QAAQ;CAC/B,CAACA,mCAAe,eAAe,QAAQ;CACvC,CAACA,mCAAe,YAAY;CAC5B,CAACC,kCAAc,iBAAiB;CACjC;;;;;;;;;AAgCD,MAAMC,gBAAuC,EAC3C,oBACA,WAAW,OACX,SACA,MACA,YACA,GAAG,WACkC;CACrC,MAAM,EAAC,MAAKC,+BAAe,aAAa,KAAK;CAC7C,MAAMC,iBAAqCC,sCAAsB,SAAS;CAC1E,MAAMC,gBAAoCD,sCAAsB,QAAQ;CACxE,MAAME,iBAAqCF,sCAAsB,SAAS;CAC1E,MAAMG,mDAA8C,QAAQ,KAAK;CACjE,MAAMC,UAAwDC,iCAC5D;EAACV,mCAAe;EAAe;EAAS,EAAC,OAAO,KAAI;EAAC,GACpD,qDAA4B;EAAC,GAAG;EAAgB;EAAS;EAAS,OAAO;EAAI,CAAC,EAC/E,EAAC,SAAS,QAAQ,QAAQ,EAAC,CAC5B;CACD,MAAMW,QAAoED,iCACxE,CAACE,kCAAc,OAAO;EAAC;EAAQ,OAAO;EAAI,CAAC,EAC3C,OAAO,aAAa;EAAC;EAAQ,MAAM,wCAAe;GAAC,GAAG;GAAe;GAAS;GAAQ,OAAO;GAAI,CAAC;EAAC,GACnG,EAAC,SAAS,UAAS,CACpB;CACD,MAAMC,SAA+DH,iCACnE,CAACI,mCAAe,QAAQ;EAAC;EAAQ,OAAO;EAAI,CAAC,EAC7C,OAAO,aAAa;EAAC;EAAQ,MAAM,yCAAgB;GAAC,GAAG;GAAgB;GAAS;GAAQ,OAAO;GAAI,CAAC;EAAC,GACrG,EAAC,SAAS,UAAS,CACpB;CACD,MAAMC,MAA4DC,qCAC/D,EAAC,SAAS,IAAI,SAAS,WAAiC,qDACvC;EAAC,GAAG;EAAgB;EAAS,SAAS;EAAI,SAAS;EAAQ,CAAC,EAC9E,6BACD;CACD,MAAMC,SAA+DD,qCAClE,EAAC,SAAS,IAAI,SAAS,WAAiC,wDACpC;EAAC,GAAG;EAAgB;EAAoB;EAAS,SAAS;EAAI,SAAS;EAAQ,CAAC,EACrG,6BACD;CAED,MAAME,sCAAmF;EAEvF,MAAM,WAAe,SACnB,QAAQ,KAAK,WAAW,SAAS,KAAK,OAAO;AAE/C,SAAO;GACL,QAAQ,QAAQ,OAAO,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,WAAuB;IACtE,IAAI,MAAM;IACV,6CAAoB,MAAM;IAC3B,EAAE;GACH,OAAO,QAAQ,MAAM,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,UAAuB;IACnE,IAAI,KAAK;IACT,2DAAkC,KAAK;IACxC,EAAE;GACJ;IACA;EAAC,OAAO;EAAM;EAAQ,MAAM;EAAK,CAAC;AAErC,QACE,2CAACC;EACC,SAAS,QAAQ,MAAM,WAAW,EAAE;EACpC,WAAW,QAAQ;EACnB,YAAY,IAAI,aAAa,OAAO;EACpC,yDAC2B,GAAG,QAAQ,OAAO,6BAA6B,sDAC/C,GAAG,IAAI,SAAS,OAAO,OAAO,oCAAoC;EAE7F,YAAY,WAAW,aAAa;EACpC,OACE,YACK,WAAmD,KAAK,IAAI,OAAO;GAAC;GAAS,SAAS,CAAC,OAAO;GAAC,CAAC,GACjG;EAEN,UACE,YACK,WAA8B,KAAK,OAAO,OAAO;GAAC;GAAS,SAAS,CAAC;IAAC,IAAI,OAAO;IAAI,MAAM,OAAO;IAAK,CAAC;GAAC,CAAC,GAC3G;EAEO;EACb,GAAI;GACJ;;AAIN,2BAAe"}
|
|
@@ -14,6 +14,10 @@ export type GroupMembersProps = Omit<BaseGroupMembersProps, 'candidates' | 'erro
|
|
|
14
14
|
*/
|
|
15
15
|
editable?: boolean;
|
|
16
16
|
groupId: string;
|
|
17
|
+
/**
|
|
18
|
+
* Organization unit the users and agents offered for adding are listed from.
|
|
19
|
+
*/
|
|
20
|
+
ouId?: string;
|
|
17
21
|
};
|
|
18
22
|
/**
|
|
19
23
|
* Lists the users and agents in a group, and lets the signed-in user add and remove them.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GroupMembers.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/GroupMembers/GroupMembers.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,kBAAkB,
|
|
1
|
+
{"version":3,"file":"GroupMembers.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/GroupMembers/GroupMembers.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,kBAAkB,EAsBnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,EAAE,EAAwB,MAAM,OAAO,CAAC;AAChD,OAAyB,EAAC,qBAAqB,EAAC,MAAM,oBAAoB,CAAC;AA8B3E,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAClC,qBAAqB,EACrB,YAAY,GAAG,OAAO,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CACvF,GAAG;IACF;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAgFvC,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -3,7 +3,7 @@ import useManagementEndpoint_default from "../../../hooks/management/useManageme
|
|
|
3
3
|
import useResourceQuery_default from "../../../hooks/management/useResourceQuery.js";
|
|
4
4
|
import useResourceMutation_default from "../../../hooks/management/useResourceMutation.js";
|
|
5
5
|
import BaseGroupMembers_default from "./BaseGroupMembers.js";
|
|
6
|
-
import { AgentQueryKeys, GroupQueryKeys, RoleQueryKeys, UserQueryKeys, addGroupMembers, getAgentName, getAgents, getGroupMembers, getUsers, removeGroupMembers, resolveManagedIdentityName, toManagementErrorMessage } from "@thunderid/browser";
|
|
6
|
+
import { AgentQueryKeys, GroupQueryKeys, RoleQueryKeys, UserQueryKeys, addGroupMembers, getAgentName, getAgents, getGroupMembers, getUsers, removeGroupMembers, resolveManagedIdentityName, toEqualityFilter, toManagementErrorMessage } from "@thunderid/browser";
|
|
7
7
|
import { useMemo } from "react";
|
|
8
8
|
import { jsx } from "react/jsx-runtime";
|
|
9
9
|
|
|
@@ -25,11 +25,12 @@ const getMembershipInvalidatedKeys = ({ groupId }) => [
|
|
|
25
25
|
* <GroupMembers groupId={groupId} />
|
|
26
26
|
* ```
|
|
27
27
|
*/
|
|
28
|
-
const GroupMembers = ({ administrationMode, editable = false, groupId, preferences,...rest }) => {
|
|
28
|
+
const GroupMembers = ({ administrationMode, editable = false, groupId, ouId, preferences,...rest }) => {
|
|
29
29
|
const { t } = useTranslation_default(preferences?.i18n);
|
|
30
30
|
const groupsEndpoint = useManagementEndpoint_default("groups");
|
|
31
31
|
const usersEndpoint = useManagementEndpoint_default("users");
|
|
32
32
|
const agentsEndpoint = useManagementEndpoint_default("agents");
|
|
33
|
+
const filter = toEqualityFilter("ouId", ouId);
|
|
33
34
|
const members = useResourceQuery_default([
|
|
34
35
|
GroupQueryKeys.GROUP_MEMBERS,
|
|
35
36
|
groupId,
|
|
@@ -40,15 +41,29 @@ const GroupMembers = ({ administrationMode, editable = false, groupId, preferenc
|
|
|
40
41
|
groupId,
|
|
41
42
|
limit: 100
|
|
42
43
|
}), { enabled: Boolean(groupId) });
|
|
43
|
-
const users = useResourceQuery_default([UserQueryKeys.USERS, {
|
|
44
|
-
|
|
45
|
-
fetcher,
|
|
44
|
+
const users = useResourceQuery_default([UserQueryKeys.USERS, {
|
|
45
|
+
filter,
|
|
46
46
|
limit: 100
|
|
47
|
+
}], async (fetcher) => ({
|
|
48
|
+
filter,
|
|
49
|
+
page: await getUsers({
|
|
50
|
+
...usersEndpoint,
|
|
51
|
+
fetcher,
|
|
52
|
+
filter,
|
|
53
|
+
limit: 100
|
|
54
|
+
})
|
|
47
55
|
}), { enabled: editable });
|
|
48
|
-
const agents = useResourceQuery_default([AgentQueryKeys.AGENTS, {
|
|
49
|
-
|
|
50
|
-
fetcher,
|
|
56
|
+
const agents = useResourceQuery_default([AgentQueryKeys.AGENTS, {
|
|
57
|
+
filter,
|
|
51
58
|
limit: 100
|
|
59
|
+
}], async (fetcher) => ({
|
|
60
|
+
filter,
|
|
61
|
+
page: await getAgents({
|
|
62
|
+
...agentsEndpoint,
|
|
63
|
+
fetcher,
|
|
64
|
+
filter,
|
|
65
|
+
limit: 100
|
|
66
|
+
})
|
|
52
67
|
}), { enabled: editable });
|
|
53
68
|
const add = useResourceMutation_default(({ groupId: id, members: changes }, fetcher) => addGroupMembers({
|
|
54
69
|
...groupsEndpoint,
|
|
@@ -63,16 +78,23 @@ const GroupMembers = ({ administrationMode, editable = false, groupId, preferenc
|
|
|
63
78
|
groupId: id,
|
|
64
79
|
members: changes
|
|
65
80
|
}), getMembershipInvalidatedKeys);
|
|
66
|
-
const candidates = useMemo(() =>
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
81
|
+
const candidates = useMemo(() => {
|
|
82
|
+
const current = (data) => data && data.filter === filter ? data.page : void 0;
|
|
83
|
+
return {
|
|
84
|
+
agent: (current(agents.data)?.agents ?? []).map((agent) => ({
|
|
85
|
+
id: agent.id,
|
|
86
|
+
label: getAgentName(agent)
|
|
87
|
+
})),
|
|
88
|
+
user: (current(users.data)?.users ?? []).map((user) => ({
|
|
89
|
+
id: user.id,
|
|
90
|
+
label: resolveManagedIdentityName(user)
|
|
91
|
+
}))
|
|
92
|
+
};
|
|
93
|
+
}, [
|
|
94
|
+
agents.data,
|
|
95
|
+
filter,
|
|
96
|
+
users.data
|
|
97
|
+
]);
|
|
76
98
|
return /* @__PURE__ */ jsx(BaseGroupMembers_default, {
|
|
77
99
|
members: members.data?.members ?? [],
|
|
78
100
|
isLoading: members.isLoading,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GroupMembers.js","names":["GroupMembers: FC<GroupMembersProps>","useTranslation","groupsEndpoint: ManagementEndpoint","useManagementEndpoint","usersEndpoint: ManagementEndpoint","agentsEndpoint: ManagementEndpoint","members: ResourceQueryResult<GroupMemberListResponse>","useResourceQuery","users: ResourceQueryResult<ManagedUserListResponse
|
|
1
|
+
{"version":3,"file":"GroupMembers.js","names":["GroupMembers: FC<GroupMembersProps>","useTranslation","groupsEndpoint: ManagementEndpoint","useManagementEndpoint","usersEndpoint: ManagementEndpoint","agentsEndpoint: ManagementEndpoint","filter: string | undefined","members: ResourceQueryResult<GroupMemberListResponse>","useResourceQuery","users: ResourceQueryResult<FilteredPage<ManagedUserListResponse>>","agents: ResourceQueryResult<FilteredPage<AgentListResponse>>","add: ResourceMutationResult<Group, GroupMembersVariables>","useResourceMutation","remove: ResourceMutationResult<Group, GroupMembersVariables>","candidates: Partial<Record<'user' | 'agent', IdentityCandidate[]>>","BaseGroupMembers"],"sources":["../../../../src/components/admin/GroupMembers/GroupMembers.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n AdministrationMode,\n AgentListResponse,\n AgentQueryKeys,\n BasicAgent,\n Group,\n GroupMember,\n GroupMemberListResponse,\n GroupQueryKeys,\n ManagedUser,\n ManagedUserListResponse,\n ResourceQueryKey,\n RoleQueryKeys,\n UserQueryKeys,\n addGroupMembers,\n getAgentName,\n getAgents,\n getGroupMembers,\n getUsers,\n removeGroupMembers,\n resolveManagedIdentityName,\n toEqualityFilter,\n toManagementErrorMessage,\n} from '@thunderid/browser';\nimport {FC, ReactElement, useMemo} from 'react';\nimport BaseGroupMembers, {BaseGroupMembersProps} from './BaseGroupMembers';\nimport useManagementEndpoint, {ManagementEndpoint} from '../../../hooks/management/useManagementEndpoint';\nimport useResourceMutation, {ResourceMutationResult} from '../../../hooks/management/useResourceMutation';\nimport useResourceQuery, {ResourceQueryResult} from '../../../hooks/management/useResourceQuery';\nimport useTranslation from '../../../hooks/useTranslation';\nimport {IdentityCandidate} from '../shared/IdentityPicker';\n\ninterface GroupMembersVariables {\n groupId: string;\n members: Pick<GroupMember, 'id' | 'type'>[];\n}\n\n/**\n * A candidate page with the filter it was listed with.\n */\ninterface FilteredPage<T> {\n filter: string | undefined;\n page: T;\n}\n\n/**\n * Query keys to refetch after a group's membership changes.\n */\nconst getMembershipInvalidatedKeys = ({groupId}: GroupMembersVariables): ResourceQueryKey[] => [\n [GroupQueryKeys.GROUP, groupId],\n [GroupQueryKeys.GROUP_MEMBERS, groupId],\n [GroupQueryKeys.MEMBERSHIPS],\n [RoleQueryKeys.ROLE_ASSIGNMENTS],\n];\n\nexport type GroupMembersProps = Omit<\n BaseGroupMembersProps,\n 'candidates' | 'error' | 'isLoading' | 'isMutating' | 'members' | 'onAdd' | 'onRemove'\n> & {\n /**\n * How a member is removed. `flow` runs the administration flow the server configures for it, which can revoke\n * grants and end sessions first. It needs `baseUrl`.\n * @default 'native'\n */\n administrationMode?: AdministrationMode;\n /**\n * Whether members can be added and removed from this view.\n * @default false\n */\n editable?: boolean;\n groupId: string;\n /**\n * Organization unit the users and agents offered for adding are listed from.\n */\n ouId?: string;\n};\n\n/**\n * Lists the users and agents in a group, and lets the signed-in user add and remove them.\n *\n * @example\n * ```tsx\n * <GroupMembers groupId={groupId} />\n * ```\n */\nconst GroupMembers: FC<GroupMembersProps> = ({\n administrationMode,\n editable = false,\n groupId,\n ouId,\n preferences,\n ...rest\n}: GroupMembersProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const groupsEndpoint: ManagementEndpoint = useManagementEndpoint('groups');\n const usersEndpoint: ManagementEndpoint = useManagementEndpoint('users');\n const agentsEndpoint: ManagementEndpoint = useManagementEndpoint('agents');\n const filter: string | undefined = toEqualityFilter('ouId', ouId);\n const members: ResourceQueryResult<GroupMemberListResponse> = useResourceQuery(\n [GroupQueryKeys.GROUP_MEMBERS, groupId, {limit: 100}],\n (fetcher) => getGroupMembers({...groupsEndpoint, fetcher, groupId, limit: 100}),\n {enabled: Boolean(groupId)},\n );\n const users: ResourceQueryResult<FilteredPage<ManagedUserListResponse>> = useResourceQuery(\n [UserQueryKeys.USERS, {filter, limit: 100}],\n async (fetcher) => ({filter, page: await getUsers({...usersEndpoint, fetcher, filter, limit: 100})}),\n {enabled: editable},\n );\n const agents: ResourceQueryResult<FilteredPage<AgentListResponse>> = useResourceQuery(\n [AgentQueryKeys.AGENTS, {filter, limit: 100}],\n async (fetcher) => ({filter, page: await getAgents({...agentsEndpoint, fetcher, filter, limit: 100})}),\n {enabled: editable},\n );\n const add: ResourceMutationResult<Group, GroupMembersVariables> = useResourceMutation(\n ({groupId: id, members: changes}: GroupMembersVariables, fetcher) =>\n addGroupMembers({...groupsEndpoint, fetcher, groupId: id, members: changes}),\n getMembershipInvalidatedKeys,\n );\n const remove: ResourceMutationResult<Group, GroupMembersVariables> = useResourceMutation(\n ({groupId: id, members: changes}: GroupMembersVariables, fetcher) =>\n removeGroupMembers({...groupsEndpoint, administrationMode, fetcher, groupId: id, members: changes}),\n getMembershipInvalidatedKeys,\n );\n\n const candidates: Partial<Record<'user' | 'agent', IdentityCandidate[]>> = useMemo(() => {\n // A page listed for an earlier ouId stays in a query until the next one succeeds, so it is not offered.\n const current = <T,>(data: FilteredPage<T> | undefined): T | undefined =>\n data && data.filter === filter ? data.page : undefined;\n\n return {\n agent: (current(agents.data)?.agents ?? []).map((agent: BasicAgent) => ({\n id: agent.id,\n label: getAgentName(agent),\n })),\n user: (current(users.data)?.users ?? []).map((user: ManagedUser) => ({\n id: user.id,\n label: resolveManagedIdentityName(user),\n })),\n };\n }, [agents.data, filter, users.data]);\n\n return (\n <BaseGroupMembers\n members={members.data?.members ?? []}\n isLoading={members.isLoading}\n isMutating={add.isLoading || remove.isLoading}\n error={\n toManagementErrorMessage(t, members.error, 'admin.groups.members.error') ??\n toManagementErrorMessage(t, add.error ?? remove.error, 'admin.groups.members.update_error')\n }\n candidates={editable ? candidates : undefined}\n onAdd={\n editable\n ? (member: Pick<GroupMember, 'id' | 'type'>): void => void add.mutate({groupId, members: [member]})\n : undefined\n }\n onRemove={\n editable\n ? (member: GroupMember): void => void remove.mutate({groupId, members: [{id: member.id, type: member.type}]})\n : undefined\n }\n preferences={preferences}\n {...rest}\n />\n );\n};\n\nexport default GroupMembers;\n"],"mappings":";;;;;;;;;;;;;AAmDA,MAAM,gCAAgC,EAAC,cAAwD;CAC7F,CAAC,eAAe,OAAO,QAAQ;CAC/B,CAAC,eAAe,eAAe,QAAQ;CACvC,CAAC,eAAe,YAAY;CAC5B,CAAC,cAAc,iBAAiB;CACjC;;;;;;;;;AAgCD,MAAMA,gBAAuC,EAC3C,oBACA,WAAW,OACX,SACA,MACA,YACA,GAAG,WACkC;CACrC,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAMC,iBAAqCC,8BAAsB,SAAS;CAC1E,MAAMC,gBAAoCD,8BAAsB,QAAQ;CACxE,MAAME,iBAAqCF,8BAAsB,SAAS;CAC1E,MAAMG,SAA6B,iBAAiB,QAAQ,KAAK;CACjE,MAAMC,UAAwDC,yBAC5D;EAAC,eAAe;EAAe;EAAS,EAAC,OAAO,KAAI;EAAC,GACpD,YAAY,gBAAgB;EAAC,GAAG;EAAgB;EAAS;EAAS,OAAO;EAAI,CAAC,EAC/E,EAAC,SAAS,QAAQ,QAAQ,EAAC,CAC5B;CACD,MAAMC,QAAoED,yBACxE,CAAC,cAAc,OAAO;EAAC;EAAQ,OAAO;EAAI,CAAC,EAC3C,OAAO,aAAa;EAAC;EAAQ,MAAM,MAAM,SAAS;GAAC,GAAG;GAAe;GAAS;GAAQ,OAAO;GAAI,CAAC;EAAC,GACnG,EAAC,SAAS,UAAS,CACpB;CACD,MAAME,SAA+DF,yBACnE,CAAC,eAAe,QAAQ;EAAC;EAAQ,OAAO;EAAI,CAAC,EAC7C,OAAO,aAAa;EAAC;EAAQ,MAAM,MAAM,UAAU;GAAC,GAAG;GAAgB;GAAS;GAAQ,OAAO;GAAI,CAAC;EAAC,GACrG,EAAC,SAAS,UAAS,CACpB;CACD,MAAMG,MAA4DC,6BAC/D,EAAC,SAAS,IAAI,SAAS,WAAiC,YACvD,gBAAgB;EAAC,GAAG;EAAgB;EAAS,SAAS;EAAI,SAAS;EAAQ,CAAC,EAC9E,6BACD;CACD,MAAMC,SAA+DD,6BAClE,EAAC,SAAS,IAAI,SAAS,WAAiC,YACvD,mBAAmB;EAAC,GAAG;EAAgB;EAAoB;EAAS,SAAS;EAAI,SAAS;EAAQ,CAAC,EACrG,6BACD;CAED,MAAME,aAAqE,cAAc;EAEvF,MAAM,WAAe,SACnB,QAAQ,KAAK,WAAW,SAAS,KAAK,OAAO;AAE/C,SAAO;GACL,QAAQ,QAAQ,OAAO,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,WAAuB;IACtE,IAAI,MAAM;IACV,OAAO,aAAa,MAAM;IAC3B,EAAE;GACH,OAAO,QAAQ,MAAM,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,UAAuB;IACnE,IAAI,KAAK;IACT,OAAO,2BAA2B,KAAK;IACxC,EAAE;GACJ;IACA;EAAC,OAAO;EAAM;EAAQ,MAAM;EAAK,CAAC;AAErC,QACE,oBAACC;EACC,SAAS,QAAQ,MAAM,WAAW,EAAE;EACpC,WAAW,QAAQ;EACnB,YAAY,IAAI,aAAa,OAAO;EACpC,OACE,yBAAyB,GAAG,QAAQ,OAAO,6BAA6B,IACxE,yBAAyB,GAAG,IAAI,SAAS,OAAO,OAAO,oCAAoC;EAE7F,YAAY,WAAW,aAAa;EACpC,OACE,YACK,WAAmD,KAAK,IAAI,OAAO;GAAC;GAAS,SAAS,CAAC,OAAO;GAAC,CAAC,GACjG;EAEN,UACE,YACK,WAA8B,KAAK,OAAO,OAAO;GAAC;GAAS,SAAS,CAAC;IAAC,IAAI,OAAO;IAAI,MAAM,OAAO;IAAK,CAAC;GAAC,CAAC,GAC3G;EAEO;EACb,GAAI;GACJ;;AAIN,2BAAe"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thunderid/react",
|
|
3
|
-
"version": "1.10.
|
|
3
|
+
"version": "1.10.1",
|
|
4
4
|
"description": "React SDK for ThunderID",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"thunderid",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"dependencies": {
|
|
61
61
|
"@emotion/css": "11.13.5",
|
|
62
62
|
"@floating-ui/react": "0.27.12",
|
|
63
|
-
"@thunderid/browser": "^1.8.
|
|
63
|
+
"@thunderid/browser": "^1.8.1",
|
|
64
64
|
"dompurify": "3.4.17",
|
|
65
65
|
"tslib": "2.8.1"
|
|
66
66
|
},
|