{"version":3,"file":"UserListPage.acbb5778a782ca90c7ba.js","mappings":"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","sources":["webpack://grafana/./public/app/features/admin/Users/OrgUnits.tsx","webpack://grafana/./public/app/features/admin/Users/UsersTable.tsx","webpack://grafana/./public/app/features/admin/UserListAdminPage.tsx","webpack://grafana/./public/app/features/admin/Users/AnonUsersTable.tsx","webpack://grafana/./public/app/features/admin/UserListAnonymousPage.tsx","webpack://grafana/./public/app/features/admin/UserListPublicDashboardPage/DashboardsListModalButton.tsx","webpack://grafana/./public/app/features/admin/UserListPublicDashboardPage/DeleteUserModalButton.tsx","webpack://grafana/./public/app/features/admin/UserListPublicDashboardPage/UserListPublicDashboardPage.tsx","webpack://grafana/./public/app/features/admin/UserListPage.tsx","webpack://grafana/./public/app/features/admin/Users/OrgUsersTable.tsx","webpack://grafana/./public/app/features/alerting/unified/components/EmptyArea.tsx","webpack://grafana/./public/app/features/invites/InviteeRow.tsx","webpack://grafana/./public/app/features/invites/InviteesTable.tsx","webpack://grafana/./public/app/features/invites/state/selectors.ts","webpack://grafana/./public/app/features/users/state/actions.ts","webpack://grafana/./public/app/features/users/state/selectors.ts","webpack://grafana/./public/app/features/users/UsersActionBar.tsx","webpack://grafana/./public/app/features/users/UsersListPage.tsx"],"sourcesContent":["import React, { forwardRef, PropsWithChildren } from 'react';\n\nimport { IconName } from '@grafana/data';\nimport { Icon, Tooltip, Box, Stack } from '@grafana/ui';\nimport { Unit } from 'app/types';\n\ntype OrgUnitProps = { units?: Unit[]; icon: IconName };\n\nexport const OrgUnits = ({ units, icon }: OrgUnitProps) => {\n if (!units?.length) {\n return null;\n }\n\n return units.length > 1 ? (\n {units?.map((unit) => {unit.name})}}\n >\n {units.length}\n \n ) : (\n {units[0].name}\n );\n};\n\ninterface ContentProps extends PropsWithChildren {\n icon: IconName;\n}\n\nexport const Content = forwardRef(({ children, icon }, ref) => {\n return (\n \n {children}\n \n );\n});\n\nContent.displayName = 'TooltipContent';\n","import React, { useMemo } from 'react';\nimport { UseTableRowProps } from 'react-table';\n\nimport {\n Avatar,\n CellProps,\n Column,\n FetchDataFunc,\n Icon,\n InteractiveTable,\n Pagination,\n Stack,\n Tag,\n Text,\n Tooltip,\n} from '@grafana/ui';\nimport { TagBadge } from 'app/core/components/TagFilter/TagBadge';\nimport { UserDTO } from 'app/types';\n\nimport { OrgUnits } from './OrgUnits';\n\ntype Cell = CellProps;\n\ninterface UsersTableProps {\n users: UserDTO[];\n showPaging?: boolean;\n totalPages: number;\n onChangePage: (page: number) => void;\n currentPage: number;\n fetchData?: FetchDataFunc;\n}\n\nexport const UsersTable = ({\n users,\n showPaging,\n totalPages,\n onChangePage,\n currentPage,\n fetchData,\n}: UsersTableProps) => {\n const showLicensedRole = useMemo(() => users.some((user) => user.licensedRole), [users]);\n const showBelongsTo = useMemo(() => users.some((user) => user.orgs), [users]);\n const columns: Array> = useMemo(\n () => [\n {\n id: 'avatarUrl',\n header: '',\n cell: ({ cell: { value } }: Cell<'avatarUrl'>) => value && ,\n },\n {\n id: 'login',\n header: 'Login',\n cell: ({ cell: { value } }: Cell<'login'>) => value,\n sortType: 'string',\n },\n {\n id: 'email',\n header: 'Email',\n cell: ({ cell: { value } }: Cell<'email'>) => value,\n sortType: 'string',\n },\n {\n id: 'name',\n header: 'Name',\n cell: ({ cell: { value } }: Cell<'name'>) => value,\n sortType: 'string',\n },\n ...(showBelongsTo\n ? [\n {\n id: 'orgs',\n header: 'Belongs to',\n cell: ({ cell: { value, row } }: Cell<'orgs'>) => {\n return (\n \n \n {row.original.isAdmin && (\n \n \n \n )}\n \n );\n },\n sortType: (a: UseTableRowProps, b: UseTableRowProps) =>\n (a.original.orgs?.length || 0) - (b.original.orgs?.length || 0),\n },\n ]\n : []),\n ...(showLicensedRole\n ? [\n {\n id: 'licensedRole',\n header: 'Licensed role',\n cell: ({ cell: { value } }: Cell<'licensedRole'>) => {\n return value === 'None' ? (\n \n Not assigned{' '}\n \n \n \n \n ) : (\n value\n );\n },\n // Needs the assertion here, the types are not inferred correctly due to the conditional assignment\n sortType: 'string' as const,\n },\n ]\n : []),\n {\n id: 'lastSeenAtAge',\n header: 'Last active',\n headerTooltip: {\n content: 'Time since user was seen using Grafana',\n iconName: 'question-circle',\n },\n cell: ({ cell: { value } }: Cell<'lastSeenAtAge'>) => {\n return <>{value && <>{value === '10 years' ? Never : value}};\n },\n sortType: (a, b) => new Date(a.original.lastSeenAt!).getTime() - new Date(b.original.lastSeenAt!).getTime(),\n },\n {\n id: 'authLabels',\n header: 'Origin',\n cell: ({ cell: { value } }: Cell<'authLabels'>) => (\n <>{Array.isArray(value) && value.length > 0 && }\n ),\n },\n {\n id: 'isDisabled',\n header: '',\n cell: ({ cell: { value } }: Cell<'isDisabled'>) => <>{value && },\n },\n {\n id: 'edit',\n header: '',\n cell: ({ row: { original } }: Cell) => {\n return (\n \n \n \n \n \n );\n },\n },\n ],\n [showLicensedRole, showBelongsTo]\n );\n return (\n \n String(user.id)} fetchData={fetchData} />\n {showPaging && (\n \n \n \n )}\n \n );\n};\n","import { css } from '@emotion/css';\nimport React, { ComponentType, useEffect } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors as e2eSelectors } from '@grafana/e2e-selectors/src';\nimport { LinkButton, RadioButtonGroup, useStyles2, FilterInput } from '@grafana/ui';\nimport { Page } from 'app/core/components/Page/Page';\nimport { contextSrv } from 'app/core/core';\n\nimport { AccessControlAction, StoreState, UserFilter } from '../../types';\n\nimport { UsersTable } from './Users/UsersTable';\nimport { changeFilter, changePage, changeQuery, changeSort, fetchUsers } from './state/actions';\n\nexport interface FilterProps {\n filters: UserFilter[];\n onChange: (filter: UserFilter) => void;\n className?: string;\n}\nconst extraFilters: Array> = [];\nexport const addExtraFilters = (filter: ComponentType) => {\n extraFilters.push(filter);\n};\n\nconst selectors = e2eSelectors.pages.UserListPage.UserListAdminPage;\n\nconst mapDispatchToProps = {\n fetchUsers,\n changeQuery,\n changePage,\n changeFilter,\n changeSort,\n};\n\nconst mapStateToProps = (state: StoreState) => ({\n users: state.userListAdmin.users,\n query: state.userListAdmin.query,\n showPaging: state.userListAdmin.showPaging,\n totalPages: state.userListAdmin.totalPages,\n page: state.userListAdmin.page,\n filters: state.userListAdmin.filters,\n});\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\ninterface OwnProps {}\n\ntype Props = OwnProps & ConnectedProps;\n\nconst UserListAdminPageUnConnected = ({\n fetchUsers,\n query,\n changeQuery,\n users,\n showPaging,\n changeFilter,\n filters,\n totalPages,\n page,\n changePage,\n changeSort,\n}: Props) => {\n const styles = useStyles2(getStyles);\n\n useEffect(() => {\n fetchUsers();\n }, [fetchUsers]);\n\n return (\n \n
\n
\n \n changeFilter({ name: 'activeLast30Days', value })}\n value={filters.find((f) => f.name === 'activeLast30Days')?.value}\n className={styles.filter}\n />\n {extraFilters.map((FilterComponent, index) => (\n \n ))}\n {contextSrv.hasPermission(AccessControlAction.UsersCreate) && (\n \n New user\n \n )}\n
\n
\n \n
\n );\n};\n\nexport const UserListAdminPageContent = connector(UserListAdminPageUnConnected);\n\nexport function UserListAdminPage() {\n return (\n \n \n \n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n filter: css({\n margin: theme.spacing(0, 1),\n [theme.breakpoints.down('sm')]: {\n margin: 0,\n },\n }),\n actionBar: css({\n marginBottom: theme.spacing(2),\n display: 'flex',\n alignItems: 'flex-start',\n gap: theme.spacing(2),\n [theme.breakpoints.down('sm')]: {\n flexWrap: 'wrap',\n },\n }),\n row: css({\n display: 'flex',\n alignItems: 'flex-start',\n textAlign: 'left',\n marginBottom: theme.spacing(0.5),\n flexGrow: 1,\n\n [theme.breakpoints.down('sm')]: {\n flexWrap: 'wrap',\n gap: theme.spacing(2),\n width: '100%',\n },\n }),\n };\n};\n\nexport default UserListAdminPage;\n","import React, { useMemo } from 'react';\n\nimport {\n Avatar,\n CellProps,\n Column,\n InteractiveTable,\n Stack,\n Badge,\n Tooltip,\n Pagination,\n FetchDataFunc,\n} from '@grafana/ui';\nimport { EmptyArea } from 'app/features/alerting/unified/components/EmptyArea';\nimport { UserAnonymousDeviceDTO } from 'app/types';\n\ntype Cell = CellProps<\n UserAnonymousDeviceDTO,\n UserAnonymousDeviceDTO[T]\n>;\n\n// A helper function to parse the user agent string and extract parts\nconst parseUserAgent = (userAgent: string) => {\n // If the user agent string doesn't contain a space, it's probably just the browser name\n // or some other entity that are accessing grafana\n if (!userAgent.includes(' ')) {\n return {\n browser: userAgent,\n computer: '',\n };\n }\n const parts = userAgent.split(' ');\n return {\n browser: parts[0],\n computer: parts[1],\n };\n};\n\n// A helper function to truncate each part of the user agent\nconst truncatePart = (part: string, maxLength: number) => {\n return part.length > maxLength ? part.substring(0, maxLength) + '...' : part;\n};\n\ninterface UserAgentCellProps {\n value: string;\n}\n\nconst UserAgentCell = ({ value }: UserAgentCellProps) => {\n const parts = parseUserAgent(value);\n return (\n \n \n {truncatePart(parts.browser, 10)}\n {truncatePart(parts.computer, 10)}\n \n \n );\n};\n\ninterface AnonUsersTableProps {\n devices: UserAnonymousDeviceDTO[];\n // for pagination\n showPaging?: boolean;\n totalPages: number;\n onChangePage: (page: number) => void;\n currentPage: number;\n fetchData?: FetchDataFunc;\n}\n\nexport const AnonUsersDevicesTable = ({\n devices,\n showPaging,\n totalPages,\n onChangePage,\n currentPage,\n fetchData,\n}: AnonUsersTableProps) => {\n const columns: Array> = useMemo(\n () => [\n {\n id: 'avatarUrl',\n header: '',\n cell: ({ cell: { value } }: Cell<'avatarUrl'>) => value && ,\n },\n {\n id: 'login',\n header: 'Login',\n cell: ({ cell: { value } }: Cell<'login'>) => 'Anonymous',\n },\n {\n id: 'userAgent',\n header: 'User Agent',\n cell: ({ cell: { value } }: Cell<'userAgent'>) => ,\n sortType: 'string',\n },\n {\n id: 'updatedAt',\n header: 'Last active',\n cell: ({ cell: { value } }: Cell<'updatedAt'>) => value,\n sortType: (a, b) => new Date(a.original.updatedAt).getTime() - new Date(b.original.updatedAt).getTime(),\n },\n {\n id: 'clientIp',\n header: 'Origin IP (address)',\n cell: ({ cell: { value } }: Cell<'clientIp'>) => value && ,\n },\n ],\n []\n );\n return (\n \n user.deviceId} fetchData={fetchData} />\n {showPaging && (\n \n \n \n )}\n {devices.length === 0 && (\n \n No anonymous users found.\n \n )}\n \n );\n};\n","import { css } from '@emotion/css';\nimport React, { useEffect } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors as e2eSelectors } from '@grafana/e2e-selectors/src';\nimport { RadioButtonGroup, useStyles2, FilterInput } from '@grafana/ui';\nimport { Page } from 'app/core/components/Page/Page';\n\nimport { StoreState } from '../../types';\n\nimport { AnonUsersDevicesTable } from './Users/AnonUsersTable';\nimport { fetchUsersAnonymousDevices, changeAnonUserSort, changeAnonPage, changeAnonQuery } from './state/actions';\n\nconst mapDispatchToProps = {\n fetchUsersAnonymousDevices,\n changeAnonUserSort,\n changeAnonPage,\n changeAnonQuery,\n};\n\nconst mapStateToProps = (state: StoreState) => ({\n devices: state.userListAnonymousDevices.devices,\n query: state.userListAnonymousDevices.query,\n showPaging: state.userListAnonymousDevices.showPaging,\n totalPages: state.userListAnonymousDevices.totalPages,\n page: state.userListAnonymousDevices.page,\n filters: state.userListAnonymousDevices.filters,\n});\n\nconst selectors = e2eSelectors.pages.UserListPage.UserListAdminPage;\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\ninterface OwnProps {}\n\ntype Props = OwnProps & ConnectedProps;\n\nconst UserListAnonymousDevicesPageUnConnected = ({\n devices,\n fetchUsersAnonymousDevices,\n query,\n changeAnonQuery,\n filters,\n showPaging,\n totalPages,\n page,\n changeAnonPage,\n changeAnonUserSort,\n}: Props) => {\n const styles = useStyles2(getStyles);\n\n useEffect(() => {\n fetchUsersAnonymousDevices();\n }, [fetchUsersAnonymousDevices]);\n\n return (\n \n
\n
\n \n changeFilter({ name: 'activeLast30Days', value })}\n value={filters.find((f) => f.name === 'activeLast30Days')?.value}\n className={styles.filter}\n />\n
\n
\n \n
\n );\n};\n\nexport const UserListAnonymousDevicesPageContent = connector(UserListAnonymousDevicesPageUnConnected);\n\nexport function UserListAnonymousDevicesPage() {\n return (\n \n \n \n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n filter: css({\n margin: theme.spacing(0, 1),\n [theme.breakpoints.down('sm')]: {\n margin: 0,\n },\n }),\n actionBar: css({\n marginBottom: theme.spacing(2),\n display: 'flex',\n alignItems: 'flex-start',\n gap: theme.spacing(2),\n [theme.breakpoints.down('sm')]: {\n flexWrap: 'wrap',\n },\n }),\n row: css({\n display: 'flex',\n alignItems: 'flex-start',\n textAlign: 'left',\n marginBottom: theme.spacing(0.5),\n flexGrow: 1,\n\n [theme.breakpoints.down('sm')]: {\n flexWrap: 'wrap',\n gap: theme.spacing(2),\n width: '100%',\n },\n }),\n };\n};\n\nexport default UserListAnonymousDevicesPage;\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data/src';\nimport { selectors as e2eSelectors } from '@grafana/e2e-selectors/src';\nimport { Button, LoadingPlaceholder, Modal, ModalsController, useStyles2 } from '@grafana/ui/src';\nimport { Trans, t } from 'app/core/internationalization';\nimport {\n generatePublicDashboardConfigUrl,\n generatePublicDashboardUrl,\n} from 'app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils';\n\nimport { useGetActiveUserDashboardsQuery } from '../../dashboard/api/publicDashboardApi';\n\nconst selectors = e2eSelectors.pages.UserListPage.UsersListPublicDashboardsPage.DashboardsListModal;\nexport const DashboardsListModal = ({ email, onDismiss }: { email: string; onDismiss: () => void }) => {\n const styles = useStyles2(getStyles);\n\n const { data: dashboards, isLoading } = useGetActiveUserDashboardsQuery(email);\n\n return (\n \n {isLoading ? (\n
\n \n
\n ) : (\n dashboards?.map((dash) => (\n
\n

{dash.dashboardTitle}

\n
\n \n \n Public dashboard URL\n \n \n \n \n \n Public dashboard settings\n \n \n
\n
\n
\n ))\n )}\n \n );\n};\n\nexport const DashboardsListModalButton = ({ email }: { email: string }) => {\n const translatedDashboardListModalButtonText = t(\n 'public-dashboard-users-access-list.dashboard-modal.open-dashboard-list-text',\n 'Open dashboards list'\n );\n return (\n \n {({ showModal, hideModal }) => (\n showModal(DashboardsListModal, { email, onDismiss: hideModal })}\n />\n )}\n \n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n modal: css`\n width: 590px;\n `,\n loading: css`\n display: flex;\n justify-content: center;\n `,\n listItem: css`\n display: flex;\n flex-direction: column;\n gap: ${theme.spacing(0.5)};\n `,\n divider: css`\n margin: ${theme.spacing(1.5, 0)};\n color: ${theme.colors.text.secondary};\n `,\n urlsContainer: css`\n display: flex;\n gap: ${theme.spacing(0.5)};\n\n ${theme.breakpoints.down('sm')} {\n flex-direction: column;\n }\n `,\n urlsDivider: css`\n color: ${theme.colors.text.secondary};\n ${theme.breakpoints.down('sm')} {\n display: none;\n }\n `,\n dashboardTitle: css`\n font-size: ${theme.typography.body.fontSize};\n font-weight: ${theme.typography.fontWeightBold};\n margin-bottom: 0;\n `,\n url: css`\n font-size: ${theme.typography.body.fontSize};\n `,\n});\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data/src';\nimport { Button, Modal, ModalsController, useStyles2 } from '@grafana/ui/src';\nimport { Trans, t } from 'app/core/internationalization';\nimport { SessionUser } from 'app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils';\n\nimport { useRevokeAllAccessMutation } from '../../dashboard/api/publicDashboardApi';\n\nconst DeleteUserModal = ({ user, hideModal }: { user: SessionUser; hideModal: () => void }) => {\n const [revokeAllAccess] = useRevokeAllAccessMutation();\n const styles = useStyles2(getStyles);\n\n const onRevokeAccessClick = () => {\n revokeAllAccess({ email: user.email });\n hideModal();\n };\n\n return (\n \n

\n \n Are you sure you want to revoke access for {{ email: user.email }}?\n \n

\n

\n \n This action will immediately revoke {{ email: user.email }}'s access to all public dashboards.\n \n

\n \n \n \n \n \n );\n};\n\nexport const DeleteUserModalButton = ({ user }: { user: SessionUser }) => {\n const translatedDeleteUserText = t(\n 'public-dashboard-users-access-list.delete-user-modal.delete-user-button-text',\n 'Delete user'\n );\n return (\n \n {({ showModal, hideModal }) => (\n showModal(DeleteUserModal, { user, hideModal })}\n icon=\"times\"\n aria-label={translatedDeleteUserText}\n title={translatedDeleteUserText}\n />\n )}\n \n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n modal: css`\n width: 500px;\n `,\n description: css`\n font-size: ${theme.typography.body.fontSize};\n margin: 0;\n `,\n});\n","import React from 'react';\n\nimport { selectors as e2eSelectors } from '@grafana/e2e-selectors/src';\nimport { HorizontalGroup, Icon, Tag, Tooltip } from '@grafana/ui/src';\nimport { Page } from 'app/core/components/Page/Page';\nimport { Trans, t } from 'app/core/internationalization';\n\nimport { useGetActiveUsersQuery } from '../../dashboard/api/publicDashboardApi';\n\nimport { DashboardsListModalButton } from './DashboardsListModalButton';\nimport { DeleteUserModalButton } from './DeleteUserModalButton';\n\nconst selectors = e2eSelectors.pages.UserListPage.publicDashboards;\n\nexport const UserListPublicDashboardPage = () => {\n const { data: users, isLoading } = useGetActiveUsersQuery();\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n {users?.map((user) => (\n \n \n \n \n \n \n \n \n ))}\n \n
\n Email\n \n \n Activated\n \n \n \n \n \n Last active\n \n Origin\n \n Role\n
\n \n {user.email}\n \n {user.firstSeenAtAge}{user.lastSeenAtAge}\n \n {user.totalDashboards} dashboard(s)\n \n \n \n \n \n \n
\n
\n );\n};\n","import { css } from '@emotion/css';\nimport React, { useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors as e2eSelectors } from '@grafana/e2e-selectors';\nimport { config, featureEnabled } from '@grafana/runtime';\nimport { useStyles2, TabsBar, Tab } from '@grafana/ui';\nimport { t } from 'app/core/internationalization';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { isPublicDashboardsEnabled } from 'app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils';\n\nimport { Page } from '../../core/components/Page/Page';\nimport { AccessControlAction } from '../../types';\nimport { UsersListPageContent } from '../users/UsersListPage';\n\nimport { UserListAdminPageContent } from './UserListAdminPage';\nimport { UserListAnonymousDevicesPageContent } from './UserListAnonymousPage';\nimport { UserListPublicDashboardPage } from './UserListPublicDashboardPage/UserListPublicDashboardPage';\n\nenum TabView {\n ADMIN = 'admin',\n ORG = 'org',\n PUBLIC_DASHBOARDS = 'public-dashboards',\n ANON = 'anon',\n}\n\nconst selectors = e2eSelectors.pages.UserListPage;\n\nconst PublicDashboardsTab = ({ view, setView }: { view: TabView | null; setView: (v: TabView | null) => void }) => (\n setView(TabView.PUBLIC_DASHBOARDS)}\n data-testid={selectors.tabs.publicDashboardsUsers}\n />\n);\n\nconst TAB_PAGE_MAP: Record = {\n [TabView.ADMIN]: ,\n [TabView.ORG]: ,\n [TabView.PUBLIC_DASHBOARDS]: ,\n [TabView.ANON]: ,\n};\n\nexport default function UserListPage() {\n const styles = useStyles2(getStyles);\n\n const hasAccessToAdminUsers = contextSrv.hasPermission(AccessControlAction.UsersRead);\n const hasAccessToOrgUsers = contextSrv.hasPermission(AccessControlAction.OrgUsersRead);\n const hasEmailSharingEnabled =\n isPublicDashboardsEnabled() &&\n Boolean(config.featureToggles.publicDashboardsEmailSharing) &&\n featureEnabled('publicDashboardsEmailSharing');\n\n const [view, setView] = useState(() => {\n if (hasAccessToAdminUsers) {\n return TabView.ADMIN;\n } else if (hasAccessToOrgUsers) {\n return TabView.ORG;\n }\n return null;\n });\n\n const showAdminAndOrgTabs = hasAccessToOrgUsers && hasAccessToAdminUsers;\n\n return (\n \n {showAdminAndOrgTabs ? (\n \n setView(TabView.ADMIN)}\n data-testid={selectors.tabs.allUsers}\n />\n setView(TabView.ORG)}\n data-testid={selectors.tabs.orgUsers}\n />\n {config.anonymousEnabled && config.featureToggles.displayAnonymousStats && (\n setView(TabView.ANON)}\n data-testid={selectors.tabs.anonUserDevices}\n />\n )}\n {hasEmailSharingEnabled && }\n \n ) : (\n hasEmailSharingEnabled && (\n \n setView(TabView.ORG)}\n data-testid={selectors.tabs.users}\n />\n \n \n )\n )}\n {view ? TAB_PAGE_MAP[view] : }\n \n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n tabsMargin: css({\n marginBottom: theme.spacing(3),\n }),\n});\n","import React, { useEffect, useMemo, useState } from 'react';\n\nimport { OrgRole } from '@grafana/data';\nimport { selectors as e2eSelectors } from '@grafana/e2e-selectors';\nimport {\n Avatar,\n Box,\n Button,\n CellProps,\n Column,\n ConfirmModal,\n FetchDataFunc,\n Icon,\n InteractiveTable,\n Pagination,\n Stack,\n Tag,\n Text,\n Tooltip,\n} from '@grafana/ui';\nimport { UserRolePicker } from 'app/core/components/RolePicker/UserRolePicker';\nimport { fetchRoleOptions } from 'app/core/components/RolePicker/api';\nimport { TagBadge } from 'app/core/components/TagFilter/TagBadge';\nimport { contextSrv } from 'app/core/core';\nimport { AccessControlAction, OrgUser, Role } from 'app/types';\n\nimport { OrgRolePicker } from '../OrgRolePicker';\n\ntype Cell = CellProps;\n\nconst disabledRoleMessage = `This user's role is not editable because it is synchronized from your auth provider.\nRefer to the Grafana authentication docs for details.`;\n\nconst getBasicRoleDisabled = (user: OrgUser) => {\n const isUserSynced = user?.isExternallySynced;\n return !contextSrv.hasPermissionInMetadata(AccessControlAction.OrgUsersWrite, user) || isUserSynced;\n};\n\nconst selectors = e2eSelectors.pages.UserListPage.UsersListPage;\n\nexport interface Props {\n users: OrgUser[];\n orgId?: number;\n onRoleChange: (role: OrgRole, user: OrgUser) => void;\n onRemoveUser: (user: OrgUser) => void;\n fetchData?: FetchDataFunc;\n changePage: (page: number) => void;\n page: number;\n totalPages: number;\n rolesLoading?: boolean;\n}\n\nexport const OrgUsersTable = ({\n users,\n orgId,\n onRoleChange,\n onRemoveUser,\n fetchData,\n changePage,\n page,\n totalPages,\n rolesLoading,\n}: Props) => {\n const [userToRemove, setUserToRemove] = useState(null);\n const [roleOptions, setRoleOptions] = useState([]);\n\n useEffect(() => {\n async function fetchOptions() {\n try {\n if (contextSrv.hasPermission(AccessControlAction.ActionRolesList)) {\n let options = await fetchRoleOptions(orgId);\n setRoleOptions(options);\n }\n } catch (e) {\n console.error('Error loading options');\n }\n }\n if (contextSrv.licensedAccessControlEnabled()) {\n fetchOptions();\n }\n }, [orgId]);\n\n const columns: Array> = useMemo(\n () => [\n {\n id: 'avatarUrl',\n header: '',\n cell: ({ cell: { value } }: Cell<'avatarUrl'>) => value && ,\n },\n {\n id: 'login',\n header: 'Login',\n cell: ({ cell: { value } }: Cell<'login'>) =>
{value}
,\n sortType: 'string',\n },\n {\n id: 'email',\n header: 'Email',\n cell: ({ cell: { value } }: Cell<'email'>) => value,\n sortType: 'string',\n },\n {\n id: 'name',\n header: 'Name',\n cell: ({ cell: { value } }: Cell<'name'>) => value,\n sortType: 'string',\n },\n {\n id: 'lastSeenAtAge',\n header: 'Last active',\n cell: ({ cell: { value } }: Cell<'lastSeenAtAge'>) => {\n return <>{value && <>{value === '10 years' ? Never : value}};\n },\n sortType: (a, b) => new Date(a.original.lastSeenAt).getTime() - new Date(b.original.lastSeenAt).getTime(),\n },\n {\n id: 'role',\n header: 'Role',\n cell: ({ cell: { value }, row: { original } }: Cell<'role'>) => {\n const basicRoleDisabled = getBasicRoleDisabled(original);\n return contextSrv.licensedAccessControlEnabled() ? (\n onRoleChange(newRole, original)}\n basicRoleDisabled={basicRoleDisabled}\n basicRoleDisabledMessage={disabledRoleMessage}\n width={40}\n />\n ) : (\n onRoleChange(newRole, original)}\n />\n );\n },\n },\n {\n id: 'info',\n header: '',\n cell: ({ row: { original } }: Cell) => {\n const basicRoleDisabled = getBasicRoleDisabled(original);\n return (\n basicRoleDisabled && (\n \n \n This user's role is not editable because it is synchronized from your auth provider. Refer to\n the \n \n Grafana authentication docs\n \n  for details.\n \n }\n >\n \n \n \n )\n );\n },\n },\n {\n id: 'authLabels',\n header: 'Origin',\n cell: ({ cell: { value } }: Cell<'authLabels'>) => (\n <>{Array.isArray(value) && value.length > 0 && }\n ),\n },\n {\n id: 'isDisabled',\n header: '',\n cell: ({ cell: { value } }: Cell<'isDisabled'>) => <>{value && },\n },\n {\n id: 'delete',\n header: '',\n cell: ({ row: { original } }: Cell) => {\n return (\n contextSrv.hasPermissionInMetadata(AccessControlAction.OrgUsersRemove, original) && (\n {\n setUserToRemove(original);\n }}\n icon=\"times\"\n aria-label={`Delete user ${original.name}`}\n />\n )\n );\n },\n },\n ],\n [rolesLoading, orgId, roleOptions, onRoleChange]\n );\n\n return (\n \n String(user.userId)} fetchData={fetchData} />\n \n \n \n {Boolean(userToRemove) && (\n {\n setUserToRemove(null);\n }}\n isOpen={true}\n onConfirm={() => {\n if (!userToRemove) {\n return;\n }\n onRemoveUser(userToRemove);\n setUserToRemove(null);\n }}\n />\n )}\n \n );\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nexport const EmptyArea = ({ children }: React.PropsWithChildren<{}>) => {\n const styles = useStyles2(getStyles);\n\n return
{children}
;\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n container: css`\n background-color: ${theme.colors.background.secondary};\n color: ${theme.colors.text.secondary};\n padding: ${theme.spacing(4)};\n text-align: center;\n `,\n };\n};\n","import React, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { Button, ClipboardButton } from '@grafana/ui';\nimport { Invitee } from 'app/types';\n\nimport { revokeInvite } from './state/actions';\n\nconst mapDispatchToProps = {\n revokeInvite,\n};\n\nconst connector = connect(null, mapDispatchToProps);\n\ninterface OwnProps {\n invitee: Invitee;\n}\n\nexport type Props = OwnProps & ConnectedProps;\n\nclass InviteeRow extends PureComponent {\n render() {\n const { invitee, revokeInvite } = this.props;\n return (\n \n {invitee.email}\n {invitee.name}\n \n invitee.url}>\n Copy Invite\n \n  \n \n \n revokeInvite(invitee.code)}\n aria-label=\"Revoke Invite\"\n />\n \n \n );\n }\n}\n\nexport default connector(InviteeRow);\n","import React, { PureComponent } from 'react';\n\nimport { Invitee } from 'app/types';\n\nimport InviteeRow from './InviteeRow';\n\nexport interface Props {\n invitees: Invitee[];\n}\n\nexport default class InviteesTable extends PureComponent {\n render() {\n const { invitees } = this.props;\n\n return (\n \n \n \n \n \n \n \n \n {invitees.map((invitee, index) => {\n return ;\n })}\n \n
EmailName\n \n
\n );\n }\n}\n","import { EntityState, createSelector } from '@reduxjs/toolkit';\n\nimport { Invitee } from 'app/types';\n\nimport { selectors } from './reducers';\n\nexport const { selectAll, selectById, selectTotal } = selectors;\n\nconst selectQuery = (_state: EntityState, query: string) => query;\nexport const selectInvitesMatchingQuery = createSelector([selectAll, selectQuery], (invites, searchQuery) => {\n const regex = new RegExp(searchQuery, 'i');\n const matches = invites.filter((invite) => regex.test(invite.name) || regex.test(invite.email));\n return matches;\n});\n","import { debounce } from 'lodash';\n\nimport { getBackendSrv } from '@grafana/runtime';\nimport { FetchDataArgs } from '@grafana/ui';\nimport { contextSrv } from 'app/core/core';\nimport { accessControlQueryParam } from 'app/core/utils/accessControl';\nimport { OrgUser } from 'app/types';\n\nimport { AccessControlAction, ThunkResult } from '../../../types';\n\nimport {\n usersLoaded,\n pageChanged,\n usersFetchBegin,\n usersFetchEnd,\n searchQueryChanged,\n sortChanged,\n rolesFetchBegin,\n rolesFetchEnd,\n} from './reducers';\n\nexport function loadUsers(): ThunkResult {\n return async (dispatch, getState) => {\n try {\n dispatch(usersFetchBegin());\n const { perPage, page, searchQuery, sort } = getState().users;\n const users = await getBackendSrv().get(\n `/api/org/users/search`,\n accessControlQueryParam({ perpage: perPage, page, query: searchQuery, sort })\n );\n\n if (\n contextSrv.licensedAccessControlEnabled() &&\n contextSrv.hasPermission(AccessControlAction.ActionUserRolesList)\n ) {\n dispatch(rolesFetchBegin());\n const orgId = contextSrv.user.orgId;\n const userIds = users?.orgUsers.map((u: OrgUser) => u.userId);\n const roles = await getBackendSrv().post(`/api/access-control/users/roles/search`, { userIds, orgId });\n users.orgUsers.forEach((u: OrgUser) => {\n u.roles = roles ? roles[u.userId] || [] : [];\n });\n dispatch(rolesFetchEnd());\n }\n dispatch(usersLoaded(users));\n } catch (error) {\n usersFetchEnd();\n }\n };\n}\n\nconst fetchUsersWithDebounce = debounce((dispatch) => dispatch(loadUsers()), 300);\n\nexport function updateUser(user: OrgUser): ThunkResult {\n return async (dispatch) => {\n await getBackendSrv().patch(`/api/org/users/${user.userId}`, { role: user.role });\n dispatch(loadUsers());\n };\n}\n\nexport function removeUser(userId: number): ThunkResult {\n return async (dispatch) => {\n await getBackendSrv().delete(`/api/org/users/${userId}`);\n dispatch(loadUsers());\n };\n}\n\nexport function changePage(page: number): ThunkResult {\n return async (dispatch) => {\n dispatch(pageChanged(page));\n dispatch(loadUsers());\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(loadUsers());\n };\n}\n\nexport function changeSearchQuery(query: string): ThunkResult {\n return async (dispatch) => {\n dispatch(searchQueryChanged(query));\n fetchUsersWithDebounce(dispatch);\n };\n}\n","import { UsersState } from 'app/types';\n\nexport const getUsers = (state: UsersState) => {\n const regex = new RegExp(state.searchQuery, 'i');\n\n return state.users.filter((user) => {\n return regex.test(user.login) || regex.test(user.email) || regex.test(user.name);\n });\n};\n\nexport const getUsersSearchQuery = (state: UsersState) => state.searchQuery;\n","import React from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { RadioButtonGroup, LinkButton, FilterInput, InlineField } from '@grafana/ui';\nimport config from 'app/core/config';\nimport { contextSrv } from 'app/core/core';\nimport { AccessControlAction, StoreState } from 'app/types';\n\nimport { selectTotal } from '../invites/state/selectors';\n\nimport { changeSearchQuery } from './state/actions';\nimport { getUsersSearchQuery } from './state/selectors';\n\nexport interface OwnProps {\n showInvites: boolean;\n onShowInvites: () => void;\n}\n\nfunction mapStateToProps(state: StoreState) {\n return {\n searchQuery: getUsersSearchQuery(state.users),\n pendingInvitesCount: selectTotal(state.invites),\n externalUserMngLinkName: state.users.externalUserMngLinkName,\n externalUserMngLinkUrl: state.users.externalUserMngLinkUrl,\n };\n}\n\nconst mapDispatchToProps = {\n changeSearchQuery,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type Props = ConnectedProps & OwnProps;\n\nexport const UsersActionBarUnconnected = ({\n externalUserMngLinkName,\n externalUserMngLinkUrl,\n searchQuery,\n pendingInvitesCount,\n changeSearchQuery,\n onShowInvites,\n showInvites,\n}: Props): JSX.Element => {\n const options = [\n { label: 'Users', value: 'users' },\n { label: `Pending Invites (${pendingInvitesCount})`, value: 'invites' },\n ];\n const canAddToOrg: boolean = contextSrv.hasPermission(AccessControlAction.OrgUsersAdd);\n // Show invite button in the following cases:\n // 1) the instance is not a hosted Grafana instance (!config.externalUserMngInfo)\n // 2) new basic auth users can be created for this instance (!config.disableLoginForm).\n const showInviteButton: boolean = canAddToOrg && !(config.disableLoginForm && config.externalUserMngInfo);\n\n return (\n
\n \n \n \n {pendingInvitesCount > 0 && (\n
\n \n
\n )}\n {showInviteButton && Invite}\n {externalUserMngLinkUrl && (\n \n {externalUserMngLinkName}\n \n )}\n
\n );\n};\n\nexport const UsersActionBar = connector(UsersActionBarUnconnected);\n","import React, { useEffect, useState } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { renderMarkdown } from '@grafana/data';\nimport { Page } from 'app/core/components/Page/Page';\nimport { contextSrv } from 'app/core/core';\nimport { OrgUser, OrgRole, StoreState } from 'app/types';\n\nimport { OrgUsersTable } from '../admin/Users/OrgUsersTable';\nimport InviteesTable from '../invites/InviteesTable';\nimport { fetchInvitees } from '../invites/state/actions';\nimport { selectInvitesMatchingQuery } from '../invites/state/selectors';\n\nimport { UsersActionBar } from './UsersActionBar';\nimport { loadUsers, removeUser, updateUser, changePage, changeSort } from './state/actions';\nimport { getUsers, getUsersSearchQuery } from './state/selectors';\n\nfunction mapStateToProps(state: StoreState) {\n const searchQuery = getUsersSearchQuery(state.users);\n return {\n users: getUsers(state.users),\n searchQuery: getUsersSearchQuery(state.users),\n page: state.users.page,\n totalPages: state.users.totalPages,\n perPage: state.users.perPage,\n invitees: selectInvitesMatchingQuery(state.invites, searchQuery),\n externalUserMngInfo: state.users.externalUserMngInfo,\n isLoading: state.users.isLoading,\n rolesLoading: state.users.rolesLoading,\n };\n}\n\nconst mapDispatchToProps = {\n loadUsers,\n fetchInvitees,\n changePage,\n changeSort,\n updateUser,\n removeUser,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type Props = ConnectedProps;\n\nexport interface State {\n showInvites: boolean;\n}\n\nexport const UsersListPageUnconnected = ({\n users,\n page,\n totalPages,\n invitees,\n externalUserMngInfo,\n isLoading,\n rolesLoading,\n loadUsers,\n fetchInvitees,\n changePage,\n updateUser,\n removeUser,\n changeSort,\n}: Props) => {\n const [showInvites, setShowInvites] = useState(false);\n const externalUserMngInfoHtml = externalUserMngInfo ? renderMarkdown(externalUserMngInfo) : '';\n\n useEffect(() => {\n loadUsers();\n fetchInvitees();\n }, [fetchInvitees, loadUsers]);\n\n const onRoleChange = (role: OrgRole, user: OrgUser) => {\n updateUser({ ...user, role: role });\n };\n\n const onRemoveUser = (user: OrgUser) => removeUser(user.userId);\n\n const onShowInvites = () => {\n setShowInvites(!showInvites);\n };\n\n const renderTable = () => {\n if (showInvites) {\n return ;\n } else {\n return (\n \n );\n }\n };\n\n return (\n \n \n {externalUserMngInfoHtml && (\n
\n )}\n {isLoading && renderTable()}\n \n );\n};\n\nexport const UsersListPageContent = connector(UsersListPageUnconnected);\n\nexport default function UsersListPage() {\n return (\n \n \n \n );\n}\n"],"names":["OrgUnits","units","icon","Tooltip","Stack","unit","Content","children","ref","Box","Icon","UsersTable","users","showPaging","totalPages","onChangePage","currentPage","fetchData","showLicensedRole","user","showBelongsTo","columns","value","Avatar","row","a","b","Text","TagBadge","Tag","original","InteractiveTable","Pagination","extraFilters","addExtraFilters","filter","mapDispatchToProps","mapStateToProps","state","UserListAdminPageContent","fetchUsers","query","changeQuery","changeFilter","filters","page","changePage","changeSort","styles","getStyles","FilterInput","RadioButtonGroup","f","FilterComponent","index","UserListAdminPage","theme","parseUserAgent","userAgent","parts","truncatePart","part","maxLength","UserAgentCell","AnonUsersDevicesTable","devices","Badge","EmptyArea","UserListAnonymousDevicesPageContent","fetchUsersAnonymousDevices","changeAnonQuery","changeAnonPage","changeAnonUserSort","UserListAnonymousDevicesPage","DashboardsListModal","email","onDismiss","dashboards","isLoading","Modal","LoadingPlaceholder","dash","DashboardsListModalButton","translatedDashboardListModalButtonText","showModal","hideModal","Button","DeleteUserModal","revokeAllAccess","onRevokeAccessClick","DeleteUserModalButton","translatedDeleteUserText","UserListPublicDashboardPage","TabView","PublicDashboardsTab","view","setView","Tab","TAB_PAGE_MAP","UsersListPage","UserListPage","hasAccessToAdminUsers","hasAccessToOrgUsers","hasEmailSharingEnabled","config","showAdminAndOrgTabs","TabsBar","disabledRoleMessage","getBasicRoleDisabled","isUserSynced","selectors","OrgUsersTable","orgId","onRoleChange","onRemoveUser","rolesLoading","userToRemove","setUserToRemove","roleOptions","setRoleOptions","fetchOptions","options","basicRoleDisabled","newRole","connector","InviteeRow","invitee","revokeInvite","ClipboardButton","InviteesTable","invitees","selectAll","selectById","selectTotal","selectQuery","_state","selectInvitesMatchingQuery","invites","searchQuery","regex","invite","loadUsers","dispatch","getState","perPage","sort","accessControl","userIds","u","roles","fetchUsersWithDebounce","updateUser","removeUser","userId","sortBy","changeSearchQuery","getUsers","getUsersSearchQuery","UsersActionBar","externalUserMngLinkName","externalUserMngLinkUrl","pendingInvitesCount","onShowInvites","showInvites","showInviteButton","InlineField","UsersListPageUnconnected","externalUserMngInfo","fetchInvitees","setShowInvites","externalUserMngInfoHtml","role","renderTable","Page","UsersListPageContent"],"sourceRoot":""}