import { css } from '@emotion/css'; import { useState } from 'react'; import * as React from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors'; import { t } from '@grafana/i18n'; import { config } from '@grafana/runtime'; import { useStyles2, TabsBar, Tab } from '@grafana/ui'; import { contextSrv } from 'app/core/services/context_srv'; import { isEmailSharingEnabled } from 'app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils'; import { AccessControlAction } from 'app/types/accessControl'; import { Page } from '../../core/components/Page/Page'; import { UsersListPageContent } from '../users/UsersListPage'; import { UserListAdminPageContent } from './UserListAdminPage'; import { UserListAnonymousDevicesPageContent } from './UserListAnonymousPage'; import { UserListPublicDashboardPage } from './UserListPublicDashboardPage/UserListPublicDashboardPage'; enum TabView { ADMIN = 'admin', ORG = 'org', PUBLIC_DASHBOARDS = 'public-dashboards', ANON = 'anon', } const selectors = e2eSelectors.pages.UserListPage; const PublicDashboardsTab = ({ view, setView }: { view: TabView | null; setView: (v: TabView | null) => void }) => { return ( setView(TabView.PUBLIC_DASHBOARDS)} data-testid={selectors.tabs.publicDashboardsUsers} /> ); }; const TAB_PAGE_MAP: Record = { [TabView.ADMIN]: , [TabView.ORG]: , [TabView.PUBLIC_DASHBOARDS]: , [TabView.ANON]: , }; export default function UserListPage() { const styles = useStyles2(getStyles); const hasAccessToAdminUsers = contextSrv.hasPermission(AccessControlAction.UsersRead); const hasAccessToOrgUsers = contextSrv.hasPermission(AccessControlAction.OrgUsersRead); const [view, setView] = useState(() => { if (hasAccessToAdminUsers) { return TabView.ADMIN; } else if (hasAccessToOrgUsers) { return TabView.ORG; } return null; }); const showAdminAndOrgTabs = hasAccessToOrgUsers && hasAccessToAdminUsers; return ( {showAdminAndOrgTabs ? ( setView(TabView.ADMIN)} data-testid={selectors.tabs.allUsers} /> setView(TabView.ORG)} data-testid={selectors.tabs.orgUsers} /> {config.anonymousEnabled && ( setView(TabView.ANON)} data-testid={selectors.tabs.anonUserDevices} /> )} {isEmailSharingEnabled() && } ) : ( isEmailSharingEnabled() && ( setView(TabView.ORG)} data-testid={selectors.tabs.users} /> ) )} {view ? TAB_PAGE_MAP[view] : } ); } const getStyles = (theme: GrafanaTheme2) => ({ tabsMargin: css({ marginBottom: theme.spacing(3), }), });