From 90f0b1c6e2756f240f790cf01b28b62cc13786e0 Mon Sep 17 00:00:00 2001 From: Ashley Harrison Date: Mon, 17 Apr 2023 11:42:21 +0100 Subject: [PATCH] Navigation: Redirect to root page when switching organization (#66655) * just redirect to root when switching org * remove old orgswitcher modal --- .../OrganizationSwitcher.tsx | 2 +- public/app/core/components/OrgSwitcher.tsx | 68 ------------------ public/app/core/specs/OrgSwitcher.test.tsx | 71 ------------------- 3 files changed, 1 insertion(+), 140 deletions(-) delete mode 100644 public/app/core/components/OrgSwitcher.tsx delete mode 100644 public/app/core/specs/OrgSwitcher.test.tsx diff --git a/public/app/core/components/AppChrome/OrganizationSwitcher/OrganizationSwitcher.tsx b/public/app/core/components/AppChrome/OrganizationSwitcher/OrganizationSwitcher.tsx index bcd70326ad7..4398ceb1097 100644 --- a/public/app/core/components/AppChrome/OrganizationSwitcher/OrganizationSwitcher.tsx +++ b/public/app/core/components/AppChrome/OrganizationSwitcher/OrganizationSwitcher.tsx @@ -18,7 +18,7 @@ export function OrganizationSwitcher() { const onSelectChange = (option: SelectableValue) => { if (option.value) { setUserOrganization(option.value.orgId); - locationService.partial({ orgId: option.value.orgId }, true); + locationService.push(`/?orgId=${option.value.orgId}`); // TODO how to reload the current page window.location.reload(); } diff --git a/public/app/core/components/OrgSwitcher.tsx b/public/app/core/components/OrgSwitcher.tsx deleted file mode 100644 index 1b89d7b0a14..00000000000 --- a/public/app/core/components/OrgSwitcher.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { css } from '@emotion/css'; -import React, { ReactElement } from 'react'; -import { useAsync } from 'react-use'; - -import { UserOrgDTO } from '@grafana/data'; -import { Button, CustomScrollbar, Modal } from '@grafana/ui'; -import config from 'app/core/config'; -import { contextSrv } from 'app/core/services/context_srv'; - -import { api } from '../../features/profile/api'; - -interface Props { - onDismiss: () => void; -} - -export function OrgSwitcher({ onDismiss }: Props): ReactElement { - const { value: orgs = [] } = useAsync(() => { - return api.loadOrgs(); - }, []); - const currentOrgId = contextSrv.user.orgId; - const contentClassName = css({ - display: 'flex', - maxHeight: 'calc(85vh - 42px)', - }); - const setCurrentOrg = async (org: UserOrgDTO) => { - await api.setUserOrg(org); - window.location.href = `${config.appSubUrl}${config.appSubUrl.endsWith('/') ? '' : '/'}?orgId=${org.orgId}`; - }; - - return ( - - - - - - - - - - - {orgs.map((org) => ( - - - - - - ))} - -
NameRole -
{org.name}{org.role} - {org.orgId === currentOrgId ? ( - - ) : ( - - )} -
-
-
- ); -} diff --git a/public/app/core/specs/OrgSwitcher.test.tsx b/public/app/core/specs/OrgSwitcher.test.tsx deleted file mode 100644 index cb612259ec3..00000000000 --- a/public/app/core/specs/OrgSwitcher.test.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { render, screen, waitFor, within } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; -import React from 'react'; - -import { api } from '../../features/profile/api'; -import { OrgRole } from '../../types'; -import { OrgSwitcher } from '../components/OrgSwitcher'; - -jest.mock('@grafana/runtime', () => ({ - config: { - appSubUrl: '/subUrl', - }, -})); - -jest.mock('app/core/services/context_srv', () => ({ - contextSrv: { - user: { orgId: 1 }, - }, -})); - -describe('OrgSwitcher', () => { - const { location } = window; - let setUserOrgSpy: jest.SpyInstance; - - beforeEach(async () => { - jest.clearAllMocks(); - const orgs = [ - { orgId: 1, name: 'Main Org.', role: OrgRole.Admin }, - { orgId: 2, name: 'Org 2', role: OrgRole.Admin }, - ]; - const loadOrgsSpy = jest.spyOn(api, 'loadOrgs').mockResolvedValue(orgs); - setUserOrgSpy = jest.spyOn(api, 'setUserOrg').mockResolvedValue(undefined); - - // @ts-ignore - delete window.location; - window.location = {} as Location; - - render( {}} />); - await waitFor(() => expect(loadOrgsSpy).toHaveBeenCalledTimes(1)); - }); - - afterEach(() => { - window.location = location; - }); - - describe('when switching org', () => { - it('should render correct rows', async () => { - expect(screen.getAllByRole('row')).toHaveLength(3); // header + 2 orgs - expect(screen.getByRole('row', { name: /main org. admin current/i })).toBeInTheDocument(); - expect(screen.getByRole('row', { name: /org 2 admin switch to/i })).toBeInTheDocument(); - }); - - it('should switch orgId in call to backend', async () => { - const row = screen.getByRole('row', { name: /org 2 admin switch to/i }); - const switchToButton = within(row).getByText(/switch to/i); - await userEvent.click(switchToButton); - - await waitFor(() => expect(setUserOrgSpy).toBeCalledWith({ orgId: 2, name: 'Org 2', role: 'Admin' })); - }); - - it('should redirect to home page', async () => { - expect(window.location.href).toBeUndefined(); - - const row = screen.getByRole('row', { name: /org 2 admin switch to/i }); - const switchToButton = within(row).getByText(/switch to/i); - await userEvent.click(switchToButton); - - await waitFor(() => expect(window.location.href).toEqual('/subUrl/?orgId=2')); - }); - }); -});