{"version":3,"file":"TeamPages.4f6177b4c6ec769c72d8.js","mappings":"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","sources":["webpack://grafana/./public/app/core/components/RolePicker/TeamRolePicker.tsx","webpack://grafana/./public/app/core/components/RolePicker/hooks.ts","webpack://grafana/./public/app/core/components/SharedPreferences/SharedPreferences.tsx","webpack://grafana/./public/app/core/components/Upgrade/UpgradeBox.tsx","webpack://grafana/./public/app/features/teams/state/selectors.ts","webpack://grafana/./public/app/features/teams/TeamGroupSync.tsx","webpack://grafana/./public/app/features/teams/TeamPermissions.tsx","webpack://grafana/./public/app/features/teams/TeamSettings.tsx","webpack://grafana/./public/app/features/teams/TeamPages.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 { useState } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\n\nimport { contextSrv } from 'app/core/core';\nimport { AccessControlAction } from 'app/types';\n\nimport { fetchRoleOptions } from './api';\n\nexport const useRoleOptions = (organizationId: number) => {\n const [orgId, setOrgId] = useState(organizationId);\n\n const { value = [] } = useAsync(async () => {\n if (contextSrv.licensedAccessControlEnabled() && contextSrv.hasPermission(AccessControlAction.ActionRolesList)) {\n return fetchRoleOptions(orgId);\n }\n return Promise.resolve([]);\n }, [orgId]);\n\n return [{ roleOptions: value }, setOrgId] as const;\n};\n","import { css } from '@emotion/css';\nimport React, { PureComponent } from 'react';\n\nimport { FeatureState, SelectableValue, getBuiltInThemes, ThemeRegistryItem } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { config, reportInteraction } from '@grafana/runtime';\nimport { Preferences as UserPreferencesDTO } from '@grafana/schema/src/raw/preferences/x/preferences_types.gen';\nimport {\n Button,\n Field,\n FieldSet,\n Label,\n Select,\n stylesFactory,\n TimeZonePicker,\n WeekStartPicker,\n FeatureBadge,\n} from '@grafana/ui';\nimport { DashboardPicker } from 'app/core/components/Select/DashboardPicker';\nimport { t, Trans } from 'app/core/internationalization';\nimport { LANGUAGES } from 'app/core/internationalization/constants';\nimport { PreferencesService } from 'app/core/services/PreferencesService';\nimport { changeTheme } from 'app/core/services/theme';\n\nexport interface Props {\n resourceUri: string;\n disabled?: boolean;\n preferenceType: 'org' | 'team' | 'user';\n onConfirm?: () => Promise;\n}\n\nexport type State = UserPreferencesDTO;\n\nfunction getLanguageOptions(): Array> {\n const languageOptions = LANGUAGES.map((v) => ({\n value: v.code,\n label: v.name,\n }));\n\n const options = [\n {\n value: '',\n label: t('common.locale.default', 'Default'),\n },\n ...languageOptions,\n ];\n\n return options;\n}\n\nexport class SharedPreferences extends PureComponent {\n service: PreferencesService;\n themeOptions: SelectableValue[];\n\n constructor(props: Props) {\n super(props);\n\n this.service = new PreferencesService(props.resourceUri);\n this.state = {\n theme: '',\n timezone: '',\n weekStart: '',\n language: '',\n queryHistory: { homeTab: '' },\n };\n\n this.themeOptions = getBuiltInThemes(config.featureToggles.extraThemes).map((theme) => ({\n value: theme.id,\n label: getTranslatedThemeName(theme),\n }));\n\n // Add default option\n this.themeOptions.unshift({ value: '', label: t('shared-preferences.theme.default-label', 'Default') });\n }\n\n async componentDidMount() {\n const prefs = await this.service.load();\n\n this.setState({\n homeDashboardUID: prefs.homeDashboardUID,\n theme: prefs.theme,\n timezone: prefs.timezone,\n weekStart: prefs.weekStart,\n language: prefs.language,\n queryHistory: prefs.queryHistory,\n });\n }\n\n onSubmitForm = async (event: React.FormEvent) => {\n event.preventDefault();\n const confirmationResult = this.props.onConfirm ? await this.props.onConfirm() : true;\n\n if (confirmationResult) {\n const { homeDashboardUID, theme, timezone, weekStart, language, queryHistory } = this.state;\n await this.service.update({ homeDashboardUID, theme, timezone, weekStart, language, queryHistory });\n window.location.reload();\n }\n };\n\n onThemeChanged = (value: SelectableValue) => {\n this.setState({ theme: value.value });\n\n if (value.value) {\n changeTheme(value.value, true);\n }\n };\n\n onTimeZoneChanged = (timezone?: string) => {\n if (typeof timezone !== 'string') {\n return;\n }\n this.setState({ timezone: timezone });\n };\n\n onWeekStartChanged = (weekStart: string) => {\n this.setState({ weekStart: weekStart });\n };\n\n onHomeDashboardChanged = (dashboardUID: string) => {\n this.setState({ homeDashboardUID: dashboardUID });\n };\n\n onLanguageChanged = (language: string) => {\n this.setState({ language });\n\n reportInteraction('grafana_preferences_language_changed', {\n toLanguage: language,\n preferenceType: this.props.preferenceType,\n });\n };\n\n render() {\n const { theme, timezone, weekStart, homeDashboardUID, language } = this.state;\n const { disabled } = this.props;\n const styles = getStyles();\n const languages = getLanguageOptions();\n const currentThemeOption = this.themeOptions.find((x) => x.value === theme) ?? this.themeOptions[0];\n\n return (\n
\n
Preferences} disabled={disabled}>\n \n \n \n\n \n \n Home Dashboard\n \n \n }\n data-testid=\"User preferences home dashboard drop down\"\n >\n this.onHomeDashboardChanged(v?.uid ?? '')}\n defaultOptions={true}\n isClearable={true}\n placeholder={t('shared-preferences.fields.home-dashboard-placeholder', 'Default dashboard')}\n inputId=\"home-dashboard-select\"\n />\n \n\n \n \n \n\n \n \n \n\n \n \n Language\n \n \n \n }\n data-testid=\"User preferences language drop down\"\n >\n lang.value === language)}\n onChange={(lang: SelectableValue) => this.onLanguageChanged(lang.value ?? '')}\n options={languages}\n placeholder={t('shared-preferences.fields.locale-placeholder', 'Choose language')}\n inputId=\"locale-select\"\n />\n \n
\n \n
\n );\n }\n}\n\nexport default SharedPreferences;\n\nconst getStyles = stylesFactory(() => {\n return {\n labelText: css({\n marginRight: '6px',\n }),\n form: css({\n width: '100%',\n maxWidth: '600px',\n }),\n };\n});\n\nfunction getTranslatedThemeName(theme: ThemeRegistryItem) {\n switch (theme.id) {\n case 'dark':\n return t('shared.preferences.theme.dark-label', 'Dark');\n case 'light':\n return t('shared.preferences.theme.light-label', 'Light');\n case 'system':\n return t('shared.preferences.theme.system-label', 'System preference');\n default:\n return theme.name;\n }\n}\n","import { css, cx } from '@emotion/css';\nimport React, { HTMLAttributes, useEffect } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { reportExperimentView } from '@grafana/runtime/src';\nimport { Button, Icon, LinkButton, useStyles2 } from '@grafana/ui';\n\ntype ComponentSize = 'sm' | 'md';\n\nexport interface Props extends HTMLAttributes {\n featureName: string;\n size?: ComponentSize;\n text?: string;\n eventVariant?: string;\n featureId: string;\n}\n\nexport const UpgradeBox = ({\n featureName,\n className,\n children,\n text,\n featureId,\n eventVariant = '',\n size = 'md',\n ...htmlProps\n}: Props) => {\n const styles = useStyles2(getUpgradeBoxStyles, size);\n\n useEffect(() => {\n reportExperimentView(`feature-highlights-${featureId}`, 'test', eventVariant);\n }, [eventVariant, featureId]);\n\n return (\n
\n \n
\n

\n You’ve discovered a Pro feature! {text || `Get the Grafana Pro plan to access ${featureName}.`}\n

\n \n Upgrade\n \n
\n
\n );\n};\n\nconst getUpgradeBoxStyles = (theme: GrafanaTheme2, size: ComponentSize) => {\n const borderRadius = theme.shape.borderRadius(2);\n const fontBase = size === 'md' ? 'body' : 'bodySmall';\n\n return {\n box: css`\n display: flex;\n align-items: center;\n position: relative;\n border-radius: ${borderRadius};\n background: ${theme.colors.success.transparent};\n padding: ${theme.spacing(2)};\n color: ${theme.colors.success.text};\n font-size: ${theme.typography[fontBase].fontSize};\n text-align: left;\n line-height: 16px;\n margin: ${theme.spacing(0, 'auto', 3, 'auto')};\n max-width: ${theme.breakpoints.values.xxl}px;\n width: 100%;\n `,\n inner: css`\n display: flex;\n align-items: center;\n width: 100%;\n justify-content: space-between;\n `,\n text: css`\n margin: 0;\n `,\n button: css`\n background-color: ${theme.colors.success.main};\n font-weight: ${theme.typography.fontWeightLight};\n color: white;\n\n &:hover {\n background-color: ${theme.colors.success.main};\n }\n\n &:focus-visible {\n box-shadow: none;\n color: ${theme.colors.text.primary};\n outline: 2px solid ${theme.colors.primary.main};\n }\n `,\n icon: css`\n margin: ${theme.spacing(0.5, 1, 0.5, 0.5)};\n `,\n };\n};\n\nexport interface UpgradeContentProps {\n image: string;\n featureUrl?: string;\n featureName: string;\n description?: string;\n listItems: string[];\n caption?: string;\n action?: {\n text: string;\n link?: string;\n onClick?: () => void;\n };\n}\n\nexport const UpgradeContent = ({\n listItems,\n image,\n featureUrl,\n featureName,\n description,\n caption,\n action,\n}: UpgradeContentProps) => {\n const styles = useStyles2(getUpgradeContentStyles);\n return (\n
\n
\n

Get started with {featureName}

\n {description &&
{description}
}\n
    \n {listItems.map((item, index) => (\n
  • \n {item}\n
  • \n ))}\n
\n {action?.link && (\n \n {action.text}\n \n )}\n {action?.onClick && (\n \n )}\n {featureUrl && (\n \n Learn more\n \n )}\n
\n
\n {'Feature\n {caption &&

{caption}

}\n
\n
\n );\n};\n\nconst getUpgradeContentStyles = (theme: GrafanaTheme2) => {\n return {\n container: css`\n display: flex;\n justify-content: space-between;\n `,\n content: css`\n width: 45%;\n margin-right: ${theme.spacing(4)};\n `,\n media: css`\n width: 55%;\n\n img {\n width: 100%;\n }\n `,\n title: css`\n color: ${theme.colors.text.maxContrast};\n `,\n description: css`\n color: ${theme.colors.text.primary};\n font-weight: ${theme.typography.fontWeightLight};\n `,\n list: css`\n list-style: none;\n margin: ${theme.spacing(4, 0, 2, 0)};\n\n li {\n display: flex;\n align-items: flex-start;\n color: ${theme.colors.text.primary};\n padding: ${theme.spacing(1, 0)};\n }\n `,\n icon: css`\n color: ${theme.colors.success.main};\n margin-right: ${theme.spacing(1)};\n `,\n link: css`\n margin-left: ${theme.spacing(2)};\n `,\n caption: css`\n font-weight: ${theme.typography.fontWeightLight};\n margin: ${theme.spacing(1, 0, 0)};\n `,\n };\n};\n\nexport const UpgradeContentVertical = ({\n featureName,\n description,\n featureUrl,\n image,\n}: Omit) => {\n const styles = useStyles2(getContentVerticalStyles);\n return (\n
\n

Get started with {featureName}

\n {description &&
{description}
}\n \n Learn more\n \n
\n {'Feature\n
\n
\n );\n};\n\nconst getContentVerticalStyles = (theme: GrafanaTheme2) => {\n return {\n container: css`\n overflow: auto;\n height: 100%;\n `,\n title: css`\n color: ${theme.colors.text.maxContrast};\n `,\n description: css`\n color: ${theme.colors.text.primary};\n font-weight: ${theme.typography.fontWeightLight};\n `,\n media: css`\n width: 100%;\n margin-top: ${theme.spacing(2)};\n\n img {\n width: 100%;\n }\n `,\n };\n};\n\nconst getImgUrl = (urlOrId: string) => {\n if (urlOrId.startsWith('http')) {\n return urlOrId;\n }\n\n return '/public/img/enterprise/highlights/' + urlOrId;\n};\n","import { Team, TeamState } from 'app/types';\n\nexport const getTeamGroups = (state: TeamState) => state.groups;\n\nexport const getTeam = (state: TeamState, currentTeamId: any): Team | null => {\n if (state.team.id === parseInt(currentTeamId, 10)) {\n return state.team;\n }\n\n return null;\n};\n","import React, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { Input, Tooltip, Icon, Button, useTheme2, InlineField, InlineFieldRow } from '@grafana/ui';\nimport { SlideDown } from 'app/core/components/Animations/SlideDown';\nimport { CloseButton } from 'app/core/components/CloseButton/CloseButton';\nimport EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA';\nimport { UpgradeBox, UpgradeContent, UpgradeContentProps } from 'app/core/components/Upgrade/UpgradeBox';\nimport { highlightTrial } from 'app/features/admin/utils';\n\nimport { StoreState, TeamGroup } from '../../types';\n\nimport { addTeamGroup, loadTeamGroups, removeTeamGroup } from './state/actions';\nimport { getTeamGroups } from './state/selectors';\n\nfunction mapStateToProps(state: StoreState) {\n return {\n groups: getTeamGroups(state.team),\n };\n}\n\nconst mapDispatchToProps = {\n loadTeamGroups,\n addTeamGroup,\n removeTeamGroup,\n};\n\ninterface OwnProps {\n isReadOnly: boolean;\n}\n\ninterface State {\n isAdding: boolean;\n newGroupId: string;\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\nexport type Props = OwnProps & ConnectedProps;\n\nconst headerTooltip = `Sync LDAP, OAuth or SAML groups with your Grafana teams.`;\n\nexport class TeamGroupSync extends PureComponent {\n constructor(props: Props) {\n super(props);\n this.state = { isAdding: false, newGroupId: '' };\n }\n\n componentDidMount() {\n this.fetchTeamGroups();\n }\n\n async fetchTeamGroups() {\n await this.props.loadTeamGroups();\n }\n\n onToggleAdding = () => {\n this.setState({ isAdding: !this.state.isAdding });\n };\n\n onNewGroupIdChanged = (event: any) => {\n this.setState({ newGroupId: event.target.value });\n };\n\n onAddGroup = (event: any) => {\n event.preventDefault();\n this.props.addTeamGroup(this.state.newGroupId);\n this.setState({ isAdding: false, newGroupId: '' });\n };\n\n onRemoveGroup = (group: TeamGroup) => {\n this.props.removeTeamGroup(group.groupId);\n };\n\n isNewGroupValid() {\n return this.state.newGroupId.length > 1;\n }\n\n renderGroup(group: TeamGroup) {\n const { isReadOnly } = this.props;\n return (\n \n {group.groupId}\n \n this.onRemoveGroup(group)}\n disabled={isReadOnly}\n aria-label={`Remove group ${group.groupId}`}\n >\n \n \n \n \n );\n }\n\n render() {\n const { isAdding, newGroupId } = this.state;\n const { groups, isReadOnly } = this.props;\n return (\n
\n {highlightTrial() && (\n \n )}\n
\n {(!highlightTrial() || groups.length > 0) && (\n <>\n

External group sync

\n \n \n \n \n )}\n
\n {groups.length > 0 && (\n \n )}\n
\n\n \n
\n \n
\n \n \n \n \n \n \n
\n
\n
\n\n {groups.length === 0 &&\n !isAdding &&\n (highlightTrial() ? (\n \n ) : (\n \n ))}\n\n {groups.length > 0 && (\n
\n \n \n \n \n \n \n {groups.map((group) => this.renderGroup(group))}\n
External Group ID\n
\n
\n )}\n
\n );\n }\n}\n\nexport const TeamSyncUpgradeContent = ({ action }: { action?: UpgradeContentProps['action'] }) => {\n const theme = useTheme2();\n return (\n \n );\n};\nexport default connect(mapStateToProps, mapDispatchToProps)(TeamGroupSync);\n","import React from 'react';\n\nimport { Permissions } from 'app/core/components/AccessControl';\nimport { contextSrv } from 'app/core/services/context_srv';\n\nimport { AccessControlAction, Team } from '../../types';\n\ntype TeamPermissionsProps = {\n team: Team;\n};\n\n// TeamPermissions component replaces TeamMembers component when the accesscontrol feature flag is set\nconst TeamPermissions = (props: TeamPermissionsProps) => {\n const canSetPermissions = contextSrv.hasPermissionInMetadata(\n AccessControlAction.ActionTeamsPermissionsWrite,\n props.team\n );\n\n return (\n \n );\n};\n\nexport default TeamPermissions;\n","import React, { useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { Input, Field, Button, FieldSet, Stack } from '@grafana/ui';\nimport { TeamRolePicker } from 'app/core/components/RolePicker/TeamRolePicker';\nimport { updateTeamRoles } from 'app/core/components/RolePicker/api';\nimport { useRoleOptions } from 'app/core/components/RolePicker/hooks';\nimport { SharedPreferences } from 'app/core/components/SharedPreferences/SharedPreferences';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { AccessControlAction, Role, Team } from 'app/types';\n\nimport { updateTeam } from './state/actions';\n\nconst mapDispatchToProps = {\n updateTeam,\n};\n\nconst connector = connect(null, mapDispatchToProps);\n\ninterface OwnProps {\n team: Team;\n}\nexport type Props = ConnectedProps & OwnProps;\n\nexport const TeamSettings = ({ team, updateTeam }: Props) => {\n const canWriteTeamSettings = contextSrv.hasPermissionInMetadata(AccessControlAction.ActionTeamsWrite, team);\n const currentOrgId = contextSrv.user.orgId;\n\n const [{ roleOptions }] = useRoleOptions(currentOrgId);\n const [pendingRoles, setPendingRoles] = useState([]);\n const {\n handleSubmit,\n register,\n formState: { errors },\n } = useForm({ defaultValues: team });\n\n const canUpdateRoles =\n contextSrv.hasPermission(AccessControlAction.ActionTeamsRolesAdd) &&\n contextSrv.hasPermission(AccessControlAction.ActionTeamsRolesRemove);\n\n const canListRoles =\n contextSrv.hasPermissionInMetadata(AccessControlAction.ActionTeamsRolesList, team) &&\n contextSrv.hasPermission(AccessControlAction.ActionRolesList);\n\n const onSubmit = async (formTeam: Team) => {\n if (contextSrv.licensedAccessControlEnabled() && canUpdateRoles) {\n await updateTeamRoles(pendingRoles, team.id);\n }\n updateTeam(formTeam.name, formTeam.email || '');\n };\n\n return (\n \n
\n
\n \n \n \n\n {contextSrv.licensedAccessControlEnabled() && canListRoles && (\n \n \n \n )}\n\n \n \n \n \n
\n
\n \n
\n );\n};\n\nexport default connector(TeamSettings);\n","import { includes } from 'lodash';\nimport React, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { featureEnabled } from '@grafana/runtime';\nimport { Themeable2, withTheme2 } from '@grafana/ui';\nimport { Page } from 'app/core/components/Page/Page';\nimport { UpgradeBox } from 'app/core/components/Upgrade/UpgradeBox';\nimport config from 'app/core/config';\nimport { GrafanaRouteComponentProps } from 'app/core/navigation/types';\nimport { getNavModel } from 'app/core/selectors/navModel';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { AccessControlAction, StoreState } from 'app/types';\n\nimport TeamGroupSync, { TeamSyncUpgradeContent } from './TeamGroupSync';\nimport TeamPermissions from './TeamPermissions';\nimport TeamSettings from './TeamSettings';\nimport { loadTeam } from './state/actions';\nimport { getTeamLoadingNav } from './state/navModel';\nimport { getTeam } from './state/selectors';\n\ninterface TeamPageRouteParams {\n id: string;\n page: string | null;\n}\n\nexport interface OwnProps extends GrafanaRouteComponentProps, Themeable2 {}\n\ninterface State {\n isSyncEnabled: boolean;\n isLoading: boolean;\n}\n\nenum PageTypes {\n Members = 'members',\n Settings = 'settings',\n GroupSync = 'groupsync',\n}\n\nfunction mapStateToProps(state: StoreState, props: OwnProps) {\n const teamId = parseInt(props.match.params.id, 10);\n const team = getTeam(state.team, teamId);\n let defaultPage = 'members';\n // With RBAC the settings page will always be available\n if (!team || !contextSrv.hasPermissionInMetadata(AccessControlAction.ActionTeamsPermissionsRead, team)) {\n defaultPage = 'settings';\n }\n const pageName = props.match.params.page ?? defaultPage;\n const teamLoadingNav = getTeamLoadingNav(pageName);\n const pageNav = getNavModel(state.navIndex, `team-${pageName}-${teamId}`, teamLoadingNav).main;\n\n return {\n pageNav,\n teamId: teamId,\n pageName: pageName,\n team,\n };\n}\n\nconst mapDispatchToProps = {\n loadTeam,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type Props = OwnProps & ConnectedProps;\n\nexport class TeamPages extends PureComponent {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n isLoading: false,\n isSyncEnabled: featureEnabled('teamsync'),\n };\n }\n\n async componentDidMount() {\n await this.fetchTeam();\n }\n\n async fetchTeam() {\n const { loadTeam, teamId } = this.props;\n this.setState({ isLoading: true });\n const team = await loadTeam(teamId);\n this.setState({ isLoading: false });\n return team;\n }\n\n getCurrentPage() {\n const pages = ['members', 'settings', 'groupsync'];\n const currentPage = this.props.pageName;\n return includes(pages, currentPage) ? currentPage : pages[0];\n }\n\n textsAreEqual = (text1: string, text2: string) => {\n if (!text1 && !text2) {\n return true;\n }\n\n if (!text1 || !text2) {\n return false;\n }\n\n return text1.toLocaleLowerCase() === text2.toLocaleLowerCase();\n };\n\n renderPage(): React.ReactNode {\n const { isSyncEnabled } = this.state;\n const { team } = this.props;\n const currentPage = this.getCurrentPage();\n\n const canReadTeam = contextSrv.hasPermissionInMetadata(AccessControlAction.ActionTeamsRead, team!);\n const canReadTeamPermissions = contextSrv.hasPermissionInMetadata(\n AccessControlAction.ActionTeamsPermissionsRead,\n team!\n );\n const canWriteTeamPermissions = contextSrv.hasPermissionInMetadata(\n AccessControlAction.ActionTeamsPermissionsWrite,\n team!\n );\n\n switch (currentPage) {\n case PageTypes.Members:\n if (canReadTeamPermissions) {\n return ;\n }\n case PageTypes.Settings:\n return canReadTeam && ;\n case PageTypes.GroupSync:\n if (isSyncEnabled) {\n if (canReadTeamPermissions) {\n return ;\n }\n } else if (config.featureToggles.featureHighlights) {\n return (\n <>\n \n \n \n );\n }\n }\n\n return null;\n }\n\n render() {\n const { team, pageNav } = this.props;\n\n return (\n \n \n {team && Object.keys(team).length !== 0 && this.renderPage()}\n \n \n );\n }\n}\n\nexport default connector(withTheme2(TeamPages));\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","useRoleOptions","organizationId","orgId","setOrgId","value","getLanguageOptions","languageOptions","v","SharedPreferences","props","event","homeDashboardUID","theme","timezone","weekStart","language","queryHistory","dashboardUID","getTranslatedThemeName","prefs","styles","getStyles","languages","currentThemeOption","x","lang","UpgradeBox","featureName","className","children","text","featureId","eventVariant","size","htmlProps","getUpgradeBoxStyles","Icon","borderRadius","fontBase","UpgradeContent","listItems","image","featureUrl","description","caption","action","getUpgradeContentStyles","item","index","Button","getImgUrl","UpgradeContentVertical","getContentVerticalStyles","urlOrId","getTeamGroups","state","getTeam","currentTeamId","mapStateToProps","mapDispatchToProps","connector","headerTooltip","TeamGroupSync","group","isReadOnly","isAdding","newGroupId","groups","Tooltip","SlideDown","CloseButton","InlineFieldRow","InlineField","Input","TeamSyncUpgradeContent","EmptyListCTA","canSetPermissions","team","updateTeam","canWriteTeamSettings","currentOrgId","setPendingRoles","handleSubmit","register","errors","canListRoles","onSubmit","formTeam","Stack","FieldSet","Field","PageTypes","defaultPage","pageName","teamLoadingNav","TeamPages","text1","text2","loadTeam","pages","currentPage","isSyncEnabled","canReadTeam","canReadTeamPermissions","canWriteTeamPermissions","config","pageNav","Page","loadTeams","initial","dispatch","getState","query","page","perPage","sort","response","noTeams","teamIds","t","loadTeamsWithDebounce","id","deleteTeam","changeQuery","changePage","changeSort","sortBy","loadTeamMembers","getStore","addTeamMember","removeTeamMember","name","email","loadTeamGroups","addTeamGroup","groupId","removeTeamGroup","updateTeamMember","member","loadingTeam","buildNavModel","navModel","teamGroupSync","isLoadingTeam","getTeamLoadingNav","main","node","child"],"sourceRoot":""}