Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
theme.keycloak.v2.admin.resources.assets.AddRoleMappingModal-e0605cd7.js.map Maven / Gradle / Ivy
Go to download
The user inferface to administrate the Keycloak server.
{"version":3,"file":"AddRoleMappingModal-e0605cd7.js","sources":["../../src/components/role-mapping/queries.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\";\n\nimport { adminClient } from \"../../admin-client\";\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 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 \"listAvailableRealmScopeMappings\",\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 = (resource: ResourcesKey) =>\n adminClient[resource] as unknown as {\n [index in queryType]: (...params: any) => Promise;\n };\n\nconst applyQuery = (\n type: ResourcesKey,\n query: queryType,\n ...params: object[]\n): Promise => castAdminClient(type)[query](...params);\n\nexport const deleteMapping = (type: ResourcesKey, id: string, rows: Row[]) =>\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 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 type: ResourcesKey,\n id: string,\n): Promise => {\n const query = mapping[type]!.listEffective[0];\n const result = applyQuery(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 type: ResourcesKey,\n id: string,\n): Promise => {\n const query = mapping[type]!.listEffective[1];\n if (type !== \"roles\") {\n return (await applyQuery(type, query, { id })).map((role) => ({\n role,\n }));\n }\n const roles = await applyQuery(type, query, { id });\n const parentRoles = await Promise.all(\n roles\n .filter((r) => r.composite)\n .map((r) => applyQuery(type, query, { id: r.id })),\n );\n return [...roles, ...parentRoles.flat()].map((role) => ({ role }));\n};\n\nexport const getAvailableRoles = async (\n type: ResourcesKey,\n params: Record,\n): Promise => {\n const query = mapping[type]!.listAvailable[1];\n return (await applyQuery(type, query, params)).map((role) => ({\n role,\n }));\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\";\n\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 { t } = useTranslation(type);\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(type, id);\n\n effectiveClientRoles = (\n await getEffectiveClientRoles({\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(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: \"clients:removeMappingTitle\",\n messageKey: t(\"clients:removeMappingConfirm\", { count: selected.length }),\n continueButtonLabel: \"common:remove\",\n continueButtonVariant: ButtonVariant.danger,\n onConfirm: async () => {\n try {\n await Promise.all(deleteMapping(type, id, selected));\n addAlert(t(\"clients:clientScopeRemoveSuccess\"), AlertVariant.success);\n refresh();\n } catch (error) {\n addError(\"clients:clientScopeRemoveError\", error);\n }\n },\n });\n\n return (\n <>\n {showAssign && (\n setShowAssign(false)}\n />\n )}\n \n setSelected(rows)}\n searchPlaceholderKey=\"clients:searchByName\"\n ariaLabelKey=\"clients: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 setShowAssign(true)}\n >\n {t(\"common:assignRole\")}\n \n \n \n \n {t(\"common:unAssignRole\")}\n \n \n >\n )}\n >\n }\n actions={\n isManager\n ? [\n {\n title: t(\"common: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(\"common:name\"),\n transforms: [cellWidth(30)],\n cellRenderer: ServiceRole,\n },\n {\n name: \"role.isInherited\",\n displayKey: t(\"common:inherent\"),\n cellFormatters: [upperCaseFormatter(), emptyFormatter()],\n },\n {\n name: \"role.description\",\n displayKey: t(\"common:description\"),\n cellFormatters: [emptyFormatter()],\n },\n ]}\n emptyState={\n setShowAssign(true)}\n />\n }\n />\n >\n );\n};\n","import {\n Button,\n Dropdown,\n DropdownItem,\n DropdownToggle,\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\";\n\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 { t } = useTranslation(type);\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(\n canViewRealmRoles ? \"roles\" : \"clients\",\n );\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(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({\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(\"common:assign\")}\n ,\n \n {t(\"common:cancel\")}\n ,\n ]}\n >\n setSelectedRows([...rows])}\n searchPlaceholderKey=\"clients:searchByRoleName\"\n isPaginated={!(filterType === \"roles\" && type !== \"roles\")}\n searchTypeComponent={\n canViewRealmRoles && (\n \n {\n setFilterType(filterType === \"roles\" ? \"clients\" : \"roles\");\n setSearchToggle(false);\n refresh();\n }}\n data-testid=\"filter-type-dropdown\"\n toggle={\n }\n >\n {filterType === \"roles\"\n ? t(\"common:filterByRoles\")\n : t(\"common:filterByClients\")}\n \n }\n isOpen={searchToggle}\n dropdownItems={[\n \n {filterType === \"roles\"\n ? t(\"common:filterByClients\")\n : t(\"common:filterByRoles\")}\n ,\n ]}\n />\n \n )\n }\n canSelectAll\n isRadio={isRadio}\n loader={filterType === \"roles\" ? loader : clientRolesLoader}\n ariaLabelKey=\"clients:roles\"\n columns={[\n {\n name: \"name\",\n cellRenderer: ServiceRole,\n },\n {\n name: \"role.description\",\n displayKey: \"common: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","resource","adminClient","applyQuery","type","query","params","deleteMapping","id","rows","row","role","getMapping","result","roles","r","client","getEffectiveRoles","parentRoles","getAvailableRoles","mapRoles","assignedRoles","effectiveRoles","hide","ServiceRole","jsxs","Fragment","Badge","RoleMapping","name","isManager","save","t","useTranslation","addAlert","addError","useAlerts","key","setKey","useState","refresh","setHide","showAssign","setShowAssign","selected","setSelected","assignRoles","loader","effectiveClientRoles","getEffectiveClientRoles","e","realmRolesMapping","clientMapping","toggleDeleteDialog","DeleteConfirm","useConfirmDialog","ButtonVariant","AlertVariant","error","jsx","AddRoleMappingModal","KeycloakDataTable","value","ToolbarItem","Checkbox","check","Button","cellWidth","upperCaseFormatter","emptyFormatter","ListEmptyState","isRadio","isLDAPmapper","onAssign","onClose","hasAccess","useAccess","canViewRealmRoles","searchToggle","setSearchToggle","filterType","setFilterType","selectedRows","setSelectedRows","localeSort","useLocaleSort","compareRow","first","max","search","clientRolesLoader","getAvailableClientRoles","clientId","Modal","ModalVariant","Dropdown","DropdownToggle","FilterIcon","DropdownItem"],"mappings":"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"}