All Downloads are FREE. Search and download functionalities are using the official Maven repository.

theme.keycloak.v2.admin.resources.assets.AddRoleMappingModal-71c36ce9.js.map Maven / Gradle / Ivy

There is a newer version: 25.0.1
Show newest version
{"version":3,"file":"AddRoleMappingModal-71c36ce9.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\");\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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"}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy