theme.keycloak.v2.admin.resources.assets.AddRoleMappingModal-DW8o4W0z.js.map Maven / Gradle / Ivy
{"version":3,"file":"AddRoleMappingModal-DW8o4W0z.js","sources":["../../src/components/role-mapping/queries.ts","../../src/components/role-mapping/resource.ts","../../src/components/role-mapping/RoleMapping.tsx","../../src/components/role-mapping/AddRoleMappingModal.tsx"],"sourcesContent":["import type KeycloakAdminClient from \"@keycloak/keycloak-admin-client\";\nimport type MappingsRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/mappingsRepresentation\";\nimport type RoleRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/roleRepresentation\";\nimport type { ClientScopes } from \"@keycloak/keycloak-admin-client/lib/resources/clientScopes\";\nimport type { Clients } from \"@keycloak/keycloak-admin-client/lib/resources/clients\";\nimport type { Groups } from \"@keycloak/keycloak-admin-client/lib/resources/groups\";\nimport type { Roles } from \"@keycloak/keycloak-admin-client/lib/resources/roles\";\nimport type { Users } from \"@keycloak/keycloak-admin-client/lib/resources/users\";\nimport { Row } from \"./RoleMapping\";\n\nexport type ResourcesKey = keyof KeycloakAdminClient;\n\ntype DeleteFunctions =\n | keyof Pick\n | keyof Pick\n | keyof Pick;\n\ntype ListEffectiveFunction =\n | keyof Pick\n | keyof Pick\n | keyof Pick<\n ClientScopes,\n | \"listScopeMappings\"\n | \"listAvailableRealmScopeMappings\"\n | \"listCompositeClientScopeMappings\"\n >\n | keyof Pick\n | keyof Pick<\n Users,\n \"listCompositeClientRoleMappings\" | \"listCompositeRealmRoleMappings\"\n >;\n\ntype ListAvailableFunction =\n | keyof Pick<\n Groups,\n \"listAvailableClientRoleMappings\" | \"listAvailableRealmRoleMappings\"\n >\n | keyof Pick<\n ClientScopes,\n \"listAvailableClientScopeMappings\" | \"listAvailableRealmScopeMappings\"\n >\n | keyof Pick\n | keyof Pick;\n\ntype FunctionMapping = {\n delete: DeleteFunctions[];\n listAvailable: ListAvailableFunction[];\n listEffective: ListEffectiveFunction[];\n};\n\ntype ResourceMapping = Partial>;\nconst groupFunctions: FunctionMapping = {\n delete: [\"delClientRoleMappings\", \"delRealmRoleMappings\"],\n listEffective: [\n \"listRoleMappings\",\n \"listCompositeRealmRoleMappings\",\n \"listCompositeClientRoleMappings\",\n ],\n listAvailable: [\n \"listAvailableClientRoleMappings\",\n \"listAvailableRealmRoleMappings\",\n ],\n};\n\nconst clientFunctions: FunctionMapping = {\n delete: [\"delClientScopeMappings\", \"delRealmScopeMappings\"],\n listEffective: [\n \"listScopeMappings\",\n \"listCompositeRealmScopeMappings\",\n \"listCompositeClientScopeMappings\",\n ],\n listAvailable: [\n \"listAvailableClientScopeMappings\",\n \"listAvailableRealmScopeMappings\",\n ],\n};\n\nconst mapping: ResourceMapping = {\n groups: groupFunctions,\n users: groupFunctions,\n clientScopes: clientFunctions,\n clients: clientFunctions,\n roles: {\n delete: [\"delCompositeRoles\", \"delCompositeRoles\"],\n listEffective: [\n \"getCompositeRoles\",\n \"getCompositeRoles\",\n \"getCompositeRolesForClient\",\n ],\n listAvailable: [\"listRoles\", \"find\"],\n },\n};\n\ntype queryType =\n | DeleteFunctions\n | ListAvailableFunction\n | ListEffectiveFunction;\n\nconst castAdminClient = (\n adminClient: KeycloakAdminClient,\n resource: ResourcesKey,\n) =>\n adminClient[resource] as unknown as {\n [index in queryType]: (...params: any) => Promise;\n };\n\nconst applyQuery = (\n adminClient: KeycloakAdminClient,\n type: ResourcesKey,\n query: queryType,\n ...params: object[]\n): Promise =>\n castAdminClient(adminClient, type)[query](...params);\n\nexport const deleteMapping = (\n adminClient: KeycloakAdminClient,\n type: ResourcesKey,\n id: string,\n rows: Row[],\n) =>\n rows.map((row) => {\n const role = { id: row.role.id!, name: row.role.name! };\n const query = mapping[type]?.delete[row.client ? 0 : 1]!;\n\n return applyQuery(\n adminClient,\n type,\n query,\n {\n id,\n clientUniqueId: row.client?.id,\n client: row.client?.id,\n roles: [role],\n },\n [role],\n );\n });\n\nexport const getMapping = async (\n adminClient: KeycloakAdminClient,\n type: ResourcesKey,\n id: string,\n): Promise => {\n const query = mapping[type]!.listEffective[0];\n const result = applyQuery(adminClient, type, query, { id });\n if (type !== \"roles\") {\n return result as MappingsRepresentation;\n }\n const roles = await result;\n const clientRoles = await Promise.all(\n roles\n .filter((r) => r.clientRole)\n .map(async (role) => {\n const client = await adminClient.clients.findOne({\n id: role.containerId!,\n });\n\n role.containerId = client?.clientId;\n return { ...client, mappings: [role] };\n }),\n );\n\n return {\n clientMappings: clientRoles,\n realmMappings: roles.filter((r) => !r.clientRole),\n };\n};\n\nexport const getEffectiveRoles = async (\n adminClient: KeycloakAdminClient,\n type: ResourcesKey,\n id: string,\n): Promise => {\n const query = mapping[type]!.listEffective[1];\n if (type !== \"roles\") {\n return (await applyQuery(adminClient, type, query, { id })).map((role) => ({\n role,\n }));\n }\n const roles = await applyQuery(adminClient, type, query, { id });\n const parentRoles = await Promise.all(\n roles\n .filter((r) => r.composite)\n .map((r) => applyQuery(adminClient, type, query, { id: r.id })),\n );\n return [...roles, ...parentRoles.flat()].map((role) => ({ role }));\n};\n\nexport const getAvailableRoles = async (\n adminClient: KeycloakAdminClient,\n type: ResourcesKey,\n params: Record,\n): Promise => {\n const query = mapping[type]!.listAvailable[1];\n return (await applyQuery(adminClient, type, query, params)).map((role) => ({\n role,\n }));\n};\n","import type UserRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/userRepresentation\";\n\nimport { fetchAdminUI } from \"../../context/auth/admin-ui-endpoint\";\nimport KeycloakAdminClient from \"@keycloak/keycloak-admin-client\";\n\ntype IDQuery = {\n id: string;\n type: string;\n};\n\ntype PaginatingQuery = IDQuery & {\n first: number;\n max: number;\n search?: string;\n};\n\ntype EffectiveClientRolesQuery = IDQuery;\n\ntype Query = Partial> & {\n endpoint: string;\n};\n\ntype ClientRole = {\n id: string;\n role: string;\n description?: string;\n client: string;\n clientId: string;\n};\n\nconst fetchEndpoint = async (\n adminClient: KeycloakAdminClient,\n { id, type, first, max, search, endpoint }: Query,\n): Promise =>\n fetchAdminUI(adminClient, `/ui-ext/${endpoint}/${type}/${id}`, {\n first: (first || 0).toString(),\n max: (max || 10).toString(),\n search: search || \"\",\n });\n\nexport const getAvailableClientRoles = (\n adminClient: KeycloakAdminClient,\n query: PaginatingQuery,\n): Promise =>\n fetchEndpoint(adminClient, { ...query, endpoint: \"available-roles\" });\n\nexport const getEffectiveClientRoles = (\n adminClient: KeycloakAdminClient,\n query: EffectiveClientRolesQuery,\n): Promise =>\n fetchEndpoint(adminClient, { ...query, endpoint: \"effective-roles\" });\n\ntype UserQuery = {\n lastName?: string;\n firstName?: string;\n email?: string;\n username?: string;\n emailVerified?: boolean;\n idpAlias?: string;\n idpUserId?: string;\n enabled?: boolean;\n briefRepresentation?: boolean;\n exact?: boolean;\n q?: string;\n};\n\nexport type BruteUser = UserRepresentation & {\n bruteForceStatus?: Record;\n};\n\nexport const findUsers = (\n adminClient: KeycloakAdminClient,\n query: UserQuery,\n): Promise =>\n fetchAdminUI(\n adminClient,\n \"ui-ext/brute-force-user\",\n query as Record,\n );\n\nexport const fetchUsedBy = (\n adminClient: KeycloakAdminClient,\n query: PaginatingQuery,\n): Promise =>\n fetchEndpoint(adminClient, {\n ...query,\n endpoint: \"authentication-management\",\n });\n","import type KeycloakAdminClient from \"@keycloak/keycloak-admin-client\";\nimport type ClientRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/clientRepresentation\";\nimport type RoleRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/roleRepresentation\";\nimport {\n AlertVariant,\n Badge,\n Button,\n ButtonVariant,\n Checkbox,\n ToolbarItem,\n} from \"@patternfly/react-core\";\nimport { cellWidth } from \"@patternfly/react-table\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useAdminClient } from \"../../admin-client\";\nimport { emptyFormatter, upperCaseFormatter } from \"../../util\";\nimport { useAlerts } from \"../alert/Alerts\";\nimport { useConfirmDialog } from \"../confirm-dialog/ConfirmDialog\";\nimport { ListEmptyState } from \"../list-empty-state/ListEmptyState\";\nimport { Action, KeycloakDataTable } from \"../table-toolbar/KeycloakDataTable\";\nimport { AddRoleMappingModal } from \"./AddRoleMappingModal\";\nimport { deleteMapping, getEffectiveRoles, getMapping } from \"./queries\";\nimport { getEffectiveClientRoles } from \"./resource\";\n\nimport \"./role-mapping.css\";\n\nexport type CompositeRole = RoleRepresentation & {\n parent: RoleRepresentation;\n isInherited?: boolean;\n};\n\nexport type Row = {\n client?: ClientRepresentation;\n role: RoleRepresentation | CompositeRole;\n id?: string; // KeycloakDataTable expects an id for the row\n};\n\nexport const mapRoles = (\n assignedRoles: Row[],\n effectiveRoles: Row[],\n hide: boolean,\n) => [\n ...(hide\n ? assignedRoles.map((row) => ({\n ...row,\n role: {\n ...row.role,\n isInherited: false,\n },\n }))\n : effectiveRoles.map((row) => ({\n ...row,\n role: {\n ...row.role,\n isInherited:\n assignedRoles.find((r) => r.role.id === row.role.id) === undefined,\n },\n }))),\n];\n\nexport const ServiceRole = ({ role, client }: Row) => (\n <>\n {client?.clientId && (\n \n {client.clientId}\n \n )}\n {role.name}\n >\n);\n\nexport type ResourcesKey = keyof KeycloakAdminClient;\n\ntype RoleMappingProps = {\n name: string;\n id: string;\n type: ResourcesKey;\n isManager?: boolean;\n save: (rows: Row[]) => Promise;\n};\n\nexport const RoleMapping = ({\n name,\n id,\n type,\n isManager = true,\n save,\n}: RoleMappingProps) => {\n const { adminClient } = useAdminClient();\n\n const { t } = useTranslation();\n const { addAlert, addError } = useAlerts();\n\n const [key, setKey] = useState(0);\n const refresh = () => setKey(key + 1);\n\n const [hide, setHide] = useState(true);\n const [showAssign, setShowAssign] = useState(false);\n const [selected, setSelected] = useState([]);\n\n const assignRoles = async (rows: Row[]) => {\n await save(rows);\n refresh();\n };\n\n const loader = async () => {\n let effectiveRoles: Row[] = [];\n let effectiveClientRoles: Row[] = [];\n if (!hide) {\n effectiveRoles = await getEffectiveRoles(adminClient, type, id);\n\n effectiveClientRoles = (\n await getEffectiveClientRoles(adminClient, {\n type,\n id,\n })\n ).map((e) => ({\n client: { clientId: e.client, id: e.clientId },\n role: { id: e.id, name: e.role, description: e.description },\n }));\n }\n\n const roles = await getMapping(adminClient, type, id);\n const realmRolesMapping =\n roles.realmMappings?.map((role) => ({ role })) || [];\n const clientMapping = Object.values(roles.clientMappings || {})\n .map((client) =>\n client.mappings.map((role: RoleRepresentation) => ({\n client: { clientId: client.client, ...client },\n role,\n })),\n )\n .flat();\n\n return [\n ...mapRoles(\n [...realmRolesMapping, ...clientMapping],\n [...effectiveClientRoles, ...effectiveRoles],\n hide,\n ),\n ];\n };\n\n const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({\n titleKey: \"removeMappingTitle\",\n messageKey: t(\"removeMappingConfirm\", { count: selected.length }),\n continueButtonLabel: \"remove\",\n continueButtonVariant: ButtonVariant.danger,\n onCancel: () => {\n setSelected([]);\n refresh();\n },\n onConfirm: async () => {\n try {\n await Promise.all(deleteMapping(adminClient, type, id, selected));\n addAlert(t(\"clientScopeRemoveSuccess\"), AlertVariant.success);\n setSelected([]);\n refresh();\n } catch (error) {\n addError(\"clientScopeRemoveError\", error);\n }\n },\n });\n\n return (\n <>\n {showAssign && (\n setShowAssign(false)}\n />\n )}\n \n setSelected(rows)}\n searchPlaceholderKey=\"searchByName\"\n ariaLabelKey=\"clientScopeList\"\n isRowDisabled={(value) =>\n (value.role as CompositeRole).isInherited || false\n }\n toolbarItem={\n <>\n \n {\n setHide(check);\n refresh();\n }}\n />\n \n {isManager && (\n <>\n \n \n \n \n \n \n >\n )}\n >\n }\n actions={\n isManager\n ? [\n {\n title: t(\"unAssignRole\"),\n onRowClick: async (role) => {\n setSelected([role]);\n toggleDeleteDialog();\n return false;\n },\n } as Action>[0]>,\n ]\n : []\n }\n columns={[\n {\n name: \"role.name\",\n displayKey: t(\"name\"),\n transforms: [cellWidth(30)],\n cellRenderer: ServiceRole,\n },\n {\n name: \"role.isInherited\",\n displayKey: t(\"inherent\"),\n cellFormatters: [upperCaseFormatter(), emptyFormatter()],\n },\n {\n name: \"role.description\",\n displayKey: t(\"description\"),\n cellFormatters: [emptyFormatter()],\n },\n ]}\n emptyState={\n setShowAssign(true)}\n secondaryActions={[\n {\n text: t(\"showInheritedRoles\"),\n onClick: () => {\n setHide(false);\n refresh();\n },\n },\n ]}\n />\n }\n />\n >\n );\n};\n","import {\n Button,\n Dropdown,\n DropdownItem,\n DropdownList,\n MenuToggle,\n Modal,\n ModalVariant,\n ToolbarItem,\n} from \"@patternfly/react-core\";\nimport { FilterIcon } from \"@patternfly/react-icons\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useAdminClient } from \"../../admin-client\";\nimport { useAccess } from \"../../context/access/Access\";\nimport useLocaleSort from \"../../utils/useLocaleSort\";\nimport { ListEmptyState } from \"../list-empty-state/ListEmptyState\";\nimport { KeycloakDataTable } from \"../table-toolbar/KeycloakDataTable\";\nimport { ResourcesKey, Row, ServiceRole } from \"./RoleMapping\";\nimport { getAvailableRoles } from \"./queries\";\nimport { getAvailableClientRoles } from \"./resource\";\n\ntype AddRoleMappingModalProps = {\n id: string;\n type: ResourcesKey;\n name?: string;\n isRadio?: boolean;\n onAssign: (rows: Row[]) => void;\n onClose: () => void;\n isLDAPmapper?: boolean;\n};\n\ntype FilterType = \"roles\" | \"clients\";\n\nexport const AddRoleMappingModal = ({\n id,\n name,\n type,\n isRadio = false,\n isLDAPmapper,\n onAssign,\n onClose,\n}: AddRoleMappingModalProps) => {\n const { adminClient } = useAdminClient();\n\n const { t } = useTranslation();\n const { hasAccess } = useAccess();\n const canViewRealmRoles = hasAccess(\"view-realm\") || hasAccess(\"query-users\");\n\n const [searchToggle, setSearchToggle] = useState(false);\n\n const [filterType, setFilterType] = useState(\"clients\");\n const [selectedRows, setSelectedRows] = useState([]);\n const [key, setKey] = useState(0);\n const refresh = () => setKey(key + 1);\n\n const localeSort = useLocaleSort();\n const compareRow = ({ role: { name } }: Row) => name?.toUpperCase();\n\n const loader = async (\n first?: number,\n max?: number,\n search?: string,\n ): Promise => {\n const params: Record = {\n first: first!,\n max: max!,\n };\n\n if (search) {\n params.search = search;\n }\n\n const roles = await getAvailableRoles(adminClient, type, { ...params, id });\n const sorted = localeSort(roles, compareRow);\n return sorted.map((row) => {\n return {\n role: row.role,\n id: row.role.id,\n };\n });\n };\n\n const clientRolesLoader = async (\n first?: number,\n max?: number,\n search?: string,\n ): Promise => {\n const roles = await getAvailableClientRoles(adminClient, {\n id,\n type,\n first: first || 0,\n max: max || 10,\n search,\n });\n\n return localeSort(\n roles.map((e) => ({\n client: { clientId: e.client, id: e.clientId },\n role: { id: e.id, name: e.role, description: e.description },\n id: e.id,\n })),\n ({ client: { clientId }, role: { name } }) => `${clientId}${name}`,\n );\n };\n\n return (\n {\n onAssign(selectedRows);\n onClose();\n }}\n >\n {t(\"assign\")}\n ,\n ,\n ]}\n >\n setSelectedRows([...rows])}\n searchPlaceholderKey=\"searchByRoleName\"\n isPaginated={!(filterType === \"roles\" && type !== \"roles\")}\n searchTypeComponent={\n canViewRealmRoles && (\n \n setSearchToggle(isOpen)}\n onSelect={() => {\n setFilterType(filterType === \"roles\" ? \"clients\" : \"roles\");\n setSearchToggle(false);\n refresh();\n }}\n toggle={(ref) => (\n setSearchToggle(!searchToggle)}\n icon={ }\n >\n {filterType === \"roles\"\n ? t(\"filterByRoles\")\n : t(\"filterByClients\")}\n \n )}\n isOpen={searchToggle}\n >\n \n \n {filterType === \"roles\"\n ? t(\"filterByClients\")\n : t(\"filterByRoles\")}\n \n \n \n \n )\n }\n canSelectAll\n isRadio={isRadio}\n loader={filterType === \"roles\" ? loader : clientRolesLoader}\n ariaLabelKey=\"roles\"\n columns={[\n {\n name: \"name\",\n cellRenderer: ServiceRole,\n },\n {\n name: \"role.description\",\n displayKey: \"description\",\n },\n ]}\n emptyState={\n {\n setFilterType(\"clients\");\n refresh();\n },\n },\n ]}\n />\n }\n />\n \n );\n};\n"],"names":["groupFunctions","clientFunctions","mapping","castAdminClient","adminClient","resource","applyQuery","type","query","params","deleteMapping","id","rows","row","role","getMapping","result","roles","r","client","getEffectiveRoles","parentRoles","getAvailableRoles","fetchEndpoint","first","max","search","endpoint","fetchAdminUI","getAvailableClientRoles","getEffectiveClientRoles","findUsers","fetchUsedBy","mapRoles","assignedRoles","effectiveRoles","hide","ServiceRole","jsxs","Fragment","Badge","RoleMapping","name","isManager","save","useAdminClient","t","useTranslation","addAlert","addError","useAlerts","key","setKey","useState","refresh","setHide","showAssign","setShowAssign","selected","setSelected","assignRoles","loader","effectiveClientRoles","e","realmRolesMapping","clientMapping","toggleDeleteDialog","DeleteConfirm","useConfirmDialog","ButtonVariant","AlertVariant","error","jsx","AddRoleMappingModal","KeycloakDataTable","value","ToolbarItem","Checkbox","_event","check","Button","cellWidth","upperCaseFormatter","emptyFormatter","ListEmptyState","isRadio","isLDAPmapper","onAssign","onClose","hasAccess","useAccess","canViewRealmRoles","searchToggle","setSearchToggle","filterType","setFilterType","selectedRows","setSelectedRows","localeSort","useLocaleSort","compareRow","clientRolesLoader","clientId","Modal","ModalVariant","Dropdown","isOpen","ref","MenuToggle","FilterIcon","DropdownList","DropdownItem"],"mappings":"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"}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy