Commit 4f0c9411 by Hugo Häggmark Committed by GitHub

Folders: Removes the possibility to delete the General folder (#29902)

* Folders: Removes the possibility to delete the General folder

* Chore: fixes after PR comments
parent 19b28455
...@@ -4,3 +4,4 @@ export const SEARCH_ITEM_HEIGHT = 48; ...@@ -4,3 +4,4 @@ export const SEARCH_ITEM_HEIGHT = 48;
export const SEARCH_ITEM_MARGIN = 4; export const SEARCH_ITEM_MARGIN = 4;
export const DEFAULT_SORT = { label: 'A-Z', value: 'alpha-asc' }; export const DEFAULT_SORT = { label: 'A-Z', value: 'alpha-asc' };
export const SECTION_STORAGE_KEY = 'search.sections'; export const SECTION_STORAGE_KEY = 'search.sections';
export const GENERAL_FOLDER_ID = 0;
import { Dispatch } from 'react';
import { renderHook } from '@testing-library/react-hooks';
import * as useSearch from './useSearch';
import { DashboardQuery, DashboardSearchItemType, DashboardSection, SearchAction } from '../types';
import { ManageDashboardsState } from '../reducers/manageDashboards';
import { useManageDashboards } from './useManageDashboards';
import { GENERAL_FOLDER_ID } from '../constants';
describe('useManageDashboards', () => {
const useSearchMock = jest.spyOn(useSearch, 'useSearch');
const toggle = async (section: DashboardSection) => section;
function setupTestContext({ results = [] }: { results?: DashboardSection[] } = {}) {
jest.clearAllMocks();
const state: ManageDashboardsState = {
results,
loading: false,
selectedIndex: 0,
initialLoading: false,
allChecked: false,
};
const dispatch: Dispatch<SearchAction> = (null as unknown) as Dispatch<SearchAction>;
useSearchMock.mockReturnValue({ state, dispatch, onToggleSection: toggle });
const dashboardQuery: DashboardQuery = ({} as unknown) as DashboardQuery;
const { result } = renderHook(() => useManageDashboards(dashboardQuery, {}));
return { result };
}
describe('when called and only General folder is selected', () => {
it('then canDelete should be false', () => {
const results: DashboardSection[] = [
{ id: 1, checked: false, items: [], title: 'One', type: DashboardSearchItemType.DashFolder, toggle, url: '/' },
{
id: GENERAL_FOLDER_ID,
checked: true,
items: [],
title: 'General',
type: DashboardSearchItemType.DashFolder,
toggle,
url: '/',
},
{ id: 2, checked: false, items: [], title: 'Two', type: DashboardSearchItemType.DashFolder, toggle, url: '/' },
];
const { result } = setupTestContext({ results });
expect(result.current.canDelete).toBe(false);
});
});
describe('when called and General folder and another folder are selected', () => {
it('then canDelete should be true', () => {
const results: DashboardSection[] = [
{ id: 1, checked: true, items: [], title: 'One', type: DashboardSearchItemType.DashFolder, toggle, url: '/' },
{
id: GENERAL_FOLDER_ID,
checked: true,
items: [],
title: 'General',
type: DashboardSearchItemType.DashFolder,
toggle,
url: '/',
},
{ id: 2, checked: false, items: [], title: 'Two', type: DashboardSearchItemType.DashFolder, toggle, url: '/' },
];
const { result } = setupTestContext({ results });
expect(result.current.canDelete).toBe(true);
});
});
describe('when called and no folder is selected', () => {
it('then canDelete should be false', () => {
const results: DashboardSection[] = [
{ id: 1, checked: false, items: [], title: 'One', type: DashboardSearchItemType.DashFolder, toggle, url: '/' },
{
id: GENERAL_FOLDER_ID,
checked: false,
items: [],
title: 'General',
type: DashboardSearchItemType.DashFolder,
toggle,
url: '/',
},
{ id: 2, checked: false, items: [], title: 'Two', type: DashboardSearchItemType.DashFolder, toggle, url: '/' },
];
const { result } = setupTestContext({ results });
expect(result.current.canDelete).toBe(false);
});
});
});
...@@ -5,6 +5,7 @@ import { DashboardQuery, DashboardSection, OnDeleteItems, OnMoveItems, OnToggleC ...@@ -5,6 +5,7 @@ import { DashboardQuery, DashboardSection, OnDeleteItems, OnMoveItems, OnToggleC
import { DELETE_ITEMS, MOVE_ITEMS, TOGGLE_ALL_CHECKED, TOGGLE_CHECKED } from '../reducers/actionTypes'; import { DELETE_ITEMS, MOVE_ITEMS, TOGGLE_ALL_CHECKED, TOGGLE_CHECKED } from '../reducers/actionTypes';
import { manageDashboardsReducer, manageDashboardsState, ManageDashboardsState } from '../reducers/manageDashboards'; import { manageDashboardsReducer, manageDashboardsState, ManageDashboardsState } from '../reducers/manageDashboards';
import { useSearch } from './useSearch'; import { useSearch } from './useSearch';
import { GENERAL_FOLDER_ID } from '../constants';
export const useManageDashboards = ( export const useManageDashboards = (
query: DashboardQuery, query: DashboardQuery,
...@@ -42,10 +43,10 @@ export const useManageDashboards = ( ...@@ -42,10 +43,10 @@ export const useManageDashboards = (
() => results.some((result: DashboardSection) => result.items && result.items.some(item => item.checked)), () => results.some((result: DashboardSection) => result.items && result.items.some(item => item.checked)),
[results] [results]
); );
const canDelete = useMemo(() => canMove || results.some((result: DashboardSection) => result.checked), [ const canDelete = useMemo(
canMove, () => canMove || results.some((result: DashboardSection) => result.checked && result.id !== GENERAL_FOLDER_ID),
results, [canMove, results]
]); );
const canSave = folder?.canSave; const canSave = folder?.canSave;
const hasEditPermissionInFolders = folder ? canSave : contextSrv.hasEditPermissionInFolders; const hasEditPermissionInFolders = folder ? canSave : contextSrv.hasEditPermissionInFolders;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment