{"version":3,"file":"TeamList.2e23d37c91734f608f09.js","mappings":"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","sources":["webpack://grafana/./public/app/core/components/RolePicker/TeamRolePicker.tsx","webpack://grafana/./public/app/features/teams/TeamList.tsx","webpack://grafana/./public/app/features/teams/state/actions.ts","webpack://grafana/./public/app/features/teams/state/navModel.ts"],"sourcesContent":["import React, { useEffect } from 'react';\nimport { useAsyncFn } from 'react-use';\n\nimport { contextSrv } from 'app/core/core';\nimport { Role, AccessControlAction } from 'app/types';\n\nimport { RolePicker } from './RolePicker';\nimport { fetchTeamRoles, updateTeamRoles } from './api';\n\nexport interface Props {\n teamId: number;\n orgId?: number;\n roleOptions: Role[];\n disabled?: boolean;\n roles?: Role[];\n onApplyRoles?: (newRoles: Role[]) => void;\n pendingRoles?: Role[];\n /**\n * Set whether the component should send a request with the new roles to the\n * backend in TeamRolePicker.onRolesChange (apply=false), or call {@link onApplyRoles}\n * with the updated list of roles (apply=true).\n *\n * Besides it sets the RolePickerMenu's Button title to\n * * `Update` in case apply equals false\n * * `Apply` in case apply equals true\n *\n * @default false\n */\n apply?: boolean;\n maxWidth?: string | number;\n width?: string | number;\n isLoading?: boolean;\n}\n\nexport const TeamRolePicker = ({\n teamId,\n roleOptions,\n disabled,\n roles,\n onApplyRoles,\n pendingRoles,\n apply = false,\n maxWidth,\n width,\n isLoading,\n}: Props) => {\n const [{ loading, value: appliedRoles = roles || [] }, getTeamRoles] = useAsyncFn(async () => {\n try {\n if (roles) {\n return roles;\n }\n if (apply && Boolean(pendingRoles?.length)) {\n return pendingRoles;\n }\n\n if (contextSrv.hasPermission(AccessControlAction.ActionTeamsRolesList)) {\n return await fetchTeamRoles(teamId);\n }\n } catch (e) {\n console.error('Error loading options', e);\n }\n return [];\n }, [teamId, pendingRoles, roles]);\n\n useEffect(() => {\n getTeamRoles();\n }, [getTeamRoles]);\n\n const onRolesChange = async (roles: Role[]) => {\n if (!apply) {\n await updateTeamRoles(roles, teamId);\n await getTeamRoles();\n } else if (onApplyRoles) {\n onApplyRoles(roles);\n }\n };\n\n const canUpdateRoles =\n contextSrv.hasPermission(AccessControlAction.ActionTeamsRolesAdd) &&\n contextSrv.hasPermission(AccessControlAction.ActionTeamsRolesRemove);\n\n return (\n \n );\n};\n","import { css } from '@emotion/css';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport Skeleton from 'react-loading-skeleton';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport {\n Avatar,\n CellProps,\n Column,\n DeleteButton,\n FilterInput,\n Icon,\n InlineField,\n InteractiveTable,\n LinkButton,\n Pagination,\n Stack,\n Tooltip,\n useStyles2,\n} from '@grafana/ui';\nimport EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA';\nimport { Page } from 'app/core/components/Page/Page';\nimport { fetchRoleOptions } from 'app/core/components/RolePicker/api';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { AccessControlAction, Role, StoreState, Team } from 'app/types';\n\nimport { TeamRolePicker } from '../../core/components/RolePicker/TeamRolePicker';\n\nimport { deleteTeam, loadTeams, changePage, changeQuery, changeSort } from './state/actions';\n\ntype Cell = CellProps;\nexport interface OwnProps {}\n\nexport interface State {\n roleOptions: Role[];\n}\n\n// this is dummy data to pass to the table while the real data is loading\nconst skeletonData: Team[] = new Array(3).fill(null).map((_, index) => ({\n id: index,\n memberCount: 0,\n name: '',\n orgId: 0,\n permission: 0,\n}));\n\nexport const TeamList = ({\n teams,\n query,\n noTeams,\n hasFetched,\n loadTeams,\n deleteTeam,\n changeQuery,\n totalPages,\n page,\n rolesLoading,\n changePage,\n changeSort,\n}: Props) => {\n const [roleOptions, setRoleOptions] = useState([]);\n const styles = useStyles2(getStyles);\n\n useEffect(() => {\n loadTeams(true);\n }, [loadTeams]);\n\n useEffect(() => {\n if (contextSrv.licensedAccessControlEnabled() && contextSrv.hasPermission(AccessControlAction.ActionRolesList)) {\n fetchRoleOptions().then((roles) => setRoleOptions(roles));\n }\n }, []);\n\n const canCreate = contextSrv.hasPermission(AccessControlAction.ActionTeamsCreate);\n const displayRolePicker = shouldDisplayRolePicker();\n\n const columns: Array> = useMemo(\n () => [\n {\n id: 'avatarUrl',\n header: '',\n disableGrow: true,\n cell: ({ cell: { value } }: Cell<'avatarUrl'>) => {\n if (!hasFetched) {\n return ;\n }\n\n return value && ;\n },\n },\n {\n id: 'name',\n header: 'Name',\n cell: ({ cell: { value } }: Cell<'name'>) => {\n if (!hasFetched) {\n return ;\n }\n return value;\n },\n sortType: 'string',\n },\n {\n id: 'email',\n header: 'Email',\n cell: ({ cell: { value } }: Cell<'email'>) => {\n if (!hasFetched) {\n return ;\n }\n return value;\n },\n sortType: 'string',\n },\n {\n id: 'memberCount',\n header: 'Members',\n disableGrow: true,\n cell: ({ cell: { value } }: Cell<'memberCount'>) => {\n if (!hasFetched) {\n return ;\n }\n return value;\n },\n sortType: 'number',\n },\n ...(displayRolePicker\n ? [\n {\n id: 'role',\n header: 'Role',\n cell: ({ cell: { value }, row: { original } }: Cell<'memberCount'>) => {\n if (!hasFetched) {\n return ;\n }\n const canSeeTeamRoles = contextSrv.hasPermissionInMetadata(\n AccessControlAction.ActionTeamsRolesList,\n original\n );\n return (\n canSeeTeamRoles && (\n \n )\n );\n },\n },\n ]\n : []),\n {\n id: 'actions',\n header: '',\n disableGrow: true,\n cell: ({ row: { original } }: Cell) => {\n if (!hasFetched) {\n return (\n \n \n \n \n );\n }\n\n const canReadTeam = contextSrv.hasPermissionInMetadata(AccessControlAction.ActionTeamsRead, original);\n const canDelete = contextSrv.hasPermissionInMetadata(AccessControlAction.ActionTeamsDelete, original);\n return (\n \n {canReadTeam && (\n \n \n \n \n \n )}\n deleteTeam(original.id)}\n />\n \n );\n },\n },\n ],\n [displayRolePicker, hasFetched, rolesLoading, roleOptions, deleteTeam, styles]\n );\n\n return (\n \n New Team\n \n }\n >\n \n {noTeams ? (\n \n ) : (\n <>\n
\n \n \n \n
\n \n String(team.id)}\n fetchData={changeSort}\n />\n \n \n \n \n \n )}\n
\n \n );\n};\n\nfunction shouldDisplayRolePicker(): boolean {\n return (\n contextSrv.licensedAccessControlEnabled() &&\n contextSrv.hasPermission(AccessControlAction.ActionTeamsRolesList) &&\n contextSrv.hasPermission(AccessControlAction.ActionRolesList)\n );\n}\n\nfunction mapStateToProps(state: StoreState) {\n return {\n teams: state.teams.teams,\n query: state.teams.query,\n perPage: state.teams.perPage,\n page: state.teams.page,\n noTeams: state.teams.noTeams,\n totalPages: state.teams.totalPages,\n hasFetched: state.teams.hasFetched,\n rolesLoading: state.teams.rolesLoading,\n };\n}\n\nconst mapDispatchToProps = {\n loadTeams,\n deleteTeam,\n changePage,\n changeQuery,\n changeSort,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\nexport type Props = OwnProps & ConnectedProps;\nexport default connector(TeamList);\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n blockSkeleton: css({\n lineHeight: 1,\n // needed for things to align properly in the table\n display: 'flex',\n }),\n});\n","import { debounce } from 'lodash';\n\nimport { getBackendSrv } from '@grafana/runtime';\nimport { FetchDataArgs } from '@grafana/ui';\nimport { updateNavIndex } from 'app/core/actions';\nimport { contextSrv } from 'app/core/core';\nimport { accessControlQueryParam } from 'app/core/utils/accessControl';\nimport { AccessControlAction, Team, TeamMember, ThunkResult } from 'app/types';\n\nimport { buildNavModel } from './navModel';\nimport {\n teamGroupsLoaded,\n queryChanged,\n pageChanged,\n teamLoaded,\n teamMembersLoaded,\n teamsLoaded,\n sortChanged,\n rolesFetchBegin,\n rolesFetchEnd,\n} from './reducers';\n\nexport function loadTeams(initial = false): ThunkResult {\n return async (dispatch, getState) => {\n const { query, page, perPage, sort } = getState().teams;\n // Early return if the user cannot list teams\n if (!contextSrv.hasPermission(AccessControlAction.ActionTeamsRead)) {\n dispatch(teamsLoaded({ teams: [], totalCount: 0, page: 1, perPage, noTeams: true }));\n return;\n }\n\n const response = await getBackendSrv().get(\n '/api/teams/search',\n accessControlQueryParam({ query, page, perpage: perPage, sort })\n );\n\n // We only want to check if there is no teams on the initial request.\n // A query that returns no teams should not render the empty list banner.\n let noTeams = false;\n if (initial) {\n noTeams = response.teams.length === 0;\n }\n\n if (\n contextSrv.licensedAccessControlEnabled() &&\n contextSrv.hasPermission(AccessControlAction.ActionTeamsRolesList)\n ) {\n dispatch(rolesFetchBegin());\n const teamIds = response?.teams.map((t: Team) => t.id);\n const roles = await getBackendSrv().post(`/api/access-control/teams/roles/search`, { teamIds });\n response.teams.forEach((t: Team) => {\n t.roles = roles ? roles[t.id] || [] : [];\n });\n dispatch(rolesFetchEnd());\n }\n\n dispatch(teamsLoaded({ noTeams, ...response }));\n };\n}\n\nconst loadTeamsWithDebounce = debounce((dispatch) => dispatch(loadTeams()), 500);\n\nexport function loadTeam(id: number): ThunkResult {\n return async (dispatch) => {\n const response = await getBackendSrv().get(`/api/teams/${id}`, accessControlQueryParam());\n dispatch(teamLoaded(response));\n dispatch(updateNavIndex(buildNavModel(response)));\n };\n}\n\nexport function deleteTeam(id: number): ThunkResult {\n return async (dispatch) => {\n await getBackendSrv().delete(`/api/teams/${id}`);\n // Update users permissions in case they lost teams.read with the deletion\n await contextSrv.fetchUserPermissions();\n dispatch(loadTeams());\n };\n}\n\nexport function changeQuery(query: string): ThunkResult {\n return async (dispatch) => {\n dispatch(queryChanged(query));\n loadTeamsWithDebounce(dispatch);\n };\n}\n\nexport function changePage(page: number): ThunkResult {\n return async (dispatch) => {\n dispatch(pageChanged(page));\n dispatch(loadTeams());\n };\n}\n\nexport function changeSort({ sortBy }: FetchDataArgs): ThunkResult {\n const sort = sortBy.length ? `${sortBy[0].id}-${sortBy[0].desc ? 'desc' : 'asc'}` : undefined;\n return async (dispatch) => {\n dispatch(sortChanged(sort));\n dispatch(loadTeams());\n };\n}\n\nexport function loadTeamMembers(): ThunkResult {\n return async (dispatch, getStore) => {\n const team = getStore().team.team;\n const response = await getBackendSrv().get(`/api/teams/${team.id}/members`);\n dispatch(teamMembersLoaded(response));\n };\n}\n\nexport function addTeamMember(id: number): ThunkResult {\n return async (dispatch, getStore) => {\n const team = getStore().team.team;\n await getBackendSrv().post(`/api/teams/${team.id}/members`, { userId: id });\n dispatch(loadTeamMembers());\n };\n}\n\nexport function removeTeamMember(id: number): ThunkResult {\n return async (dispatch, getStore) => {\n const team = getStore().team.team;\n await getBackendSrv().delete(`/api/teams/${team.id}/members/${id}`);\n dispatch(loadTeamMembers());\n };\n}\n\nexport function updateTeam(name: string, email: string): ThunkResult {\n return async (dispatch, getStore) => {\n const team = getStore().team.team;\n await getBackendSrv().put(`/api/teams/${team.id}`, { name, email });\n dispatch(loadTeam(team.id));\n };\n}\n\nexport function loadTeamGroups(): ThunkResult {\n return async (dispatch, getStore) => {\n const team = getStore().team.team;\n const response = await getBackendSrv().get(`/api/teams/${team.id}/groups`);\n dispatch(teamGroupsLoaded(response));\n };\n}\n\nexport function addTeamGroup(groupId: string): ThunkResult {\n return async (dispatch, getStore) => {\n const team = getStore().team.team;\n await getBackendSrv().post(`/api/teams/${team.id}/groups`, { groupId: groupId });\n dispatch(loadTeamGroups());\n };\n}\n\nexport function removeTeamGroup(groupId: string): ThunkResult {\n return async (dispatch, getStore) => {\n const team = getStore().team.team;\n // need to use query parameter due to escaped characters in the request\n await getBackendSrv().delete(`/api/teams/${team.id}/groups?groupId=${encodeURIComponent(groupId)}`);\n dispatch(loadTeamGroups());\n };\n}\n\nexport function updateTeamMember(member: TeamMember): ThunkResult {\n return async (dispatch) => {\n await getBackendSrv().put(`/api/teams/${member.teamId}/members/${member.userId}`, {\n permission: member.permission,\n });\n dispatch(loadTeamMembers());\n };\n}\n","import { NavModelItem, NavModel } from '@grafana/data';\nimport { featureEnabled } from '@grafana/runtime';\nimport { ProBadge } from 'app/core/components/Upgrade/ProBadge';\nimport config from 'app/core/config';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { highlightTrial } from 'app/features/admin/utils';\nimport { AccessControlAction, Team, TeamPermissionLevel } from 'app/types';\n\nconst loadingTeam = {\n avatarUrl: 'public/img/user_profile.png',\n id: 1,\n name: 'Loading',\n email: 'loading',\n memberCount: 0,\n permission: TeamPermissionLevel.Member,\n accessControl: { isEditor: false },\n orgId: 0,\n updated: '',\n};\n\nexport function buildNavModel(team: Team): NavModelItem {\n const navModel: NavModelItem = {\n img: team.avatarUrl,\n id: 'team-' + team.id,\n subTitle: 'Manage members and settings',\n url: '',\n text: team.name,\n children: [\n // With RBAC this tab will always be available (but not always editable)\n // With Legacy it will be hidden by hideTabsFromNonTeamAdmin should the user not be allowed to see it\n {\n active: false,\n icon: 'sliders-v-alt',\n id: `team-settings-${team.id}`,\n text: 'Settings',\n url: `org/teams/edit/${team.id}/settings`,\n },\n ],\n };\n\n // While team is loading we leave the members tab\n // With RBAC the Members tab is available when user has ActionTeamsPermissionsRead for this team\n // With Legacy it will always be present\n if (\n team === loadingTeam ||\n contextSrv.hasPermissionInMetadata(AccessControlAction.ActionTeamsPermissionsRead, team)\n ) {\n navModel.children!.unshift({\n active: false,\n icon: 'users-alt',\n id: `team-members-${team.id}`,\n text: 'Members',\n url: `org/teams/edit/${team.id}/members`,\n });\n }\n\n const teamGroupSync: NavModelItem = {\n active: false,\n icon: 'sync',\n id: `team-groupsync-${team.id}`,\n text: 'External group sync',\n url: `org/teams/edit/${team.id}/groupsync`,\n };\n\n const isLoadingTeam = team === loadingTeam;\n\n if (highlightTrial()) {\n teamGroupSync.tabSuffix = () =>\n ProBadge({ experimentId: isLoadingTeam ? '' : 'feature-highlights-team-sync-badge', eventVariant: 'trial' });\n }\n\n // With both Legacy and RBAC the tab is protected being featureEnabled\n // While team is loading we leave the teamsync tab\n // With RBAC the External Group Sync tab is available when user has ActionTeamsPermissionsRead for this team\n if (featureEnabled('teamsync')) {\n if (isLoadingTeam || contextSrv.hasPermissionInMetadata(AccessControlAction.ActionTeamsPermissionsRead, team)) {\n navModel.children!.push(teamGroupSync);\n }\n } else if (config.featureToggles.featureHighlights) {\n navModel.children!.push({\n ...teamGroupSync,\n tabSuffix: () => ProBadge({ experimentId: isLoadingTeam ? '' : 'feature-highlights-team-sync-badge' }),\n });\n }\n\n return navModel;\n}\n\nexport function getTeamLoadingNav(pageName: string): NavModel {\n const main = buildNavModel(loadingTeam);\n\n let node: NavModelItem;\n\n // find active page\n for (const child of main.children!) {\n if (child.id!.indexOf(pageName) > 0) {\n child.active = true;\n node = child;\n break;\n }\n }\n\n return {\n main: main,\n node: node!,\n };\n}\n"],"names":["TeamRolePicker","teamId","roleOptions","disabled","roles","onApplyRoles","pendingRoles","apply","maxWidth","width","isLoading","loading","appliedRoles","getTeamRoles","e","onRolesChange","canUpdateRoles","skeletonData","_","index","TeamList","teams","query","noTeams","hasFetched","loadTeams","deleteTeam","changeQuery","totalPages","page","rolesLoading","changePage","changeSort","setRoleOptions","styles","getStyles","canCreate","displayRolePicker","shouldDisplayRolePicker","columns","value","original","canReadTeam","canDelete","team","mapStateToProps","state","mapDispatchToProps","theme","initial","dispatch","getState","perPage","sort","response","teamIds","t","loadTeamsWithDebounce","loadTeam","id","sortBy","loadTeamMembers","getStore","addTeamMember","removeTeamMember","updateTeam","name","email","loadTeamGroups","addTeamGroup","groupId","removeTeamGroup","updateTeamMember","member","loadingTeam","buildNavModel","navModel","teamGroupSync","isLoadingTeam","getTeamLoadingNav","pageName","main","node","child"],"sourceRoot":""}