Search(Playground): Sync data when Move and Delete Dashboards (#48944)

Co-authored-by: kay delaney <45561153+kaydelaney@users.noreply.github.com>
This commit is contained in:
Maria Alexandra 2022-05-13 13:42:47 +02:00 committed by GitHub
parent 90b7a76328
commit 75760e90b4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 26 additions and 29 deletions

View File

@ -88,6 +88,14 @@ export default function SearchPage() {
setSearchSelection(updateSearchSelection(searchSelection, !current, kind, [uid])); setSearchSelection(updateSearchSelection(searchSelection, !current, kind, [uid]));
}; };
// function to update items when dashboards or folders are moved or deleted
const onChangeItemsList = async () => {
// clean up search selection
setSearchSelection(newSearchSelection());
// trigger again the search to the backend
onQueryChange(inputValue);
};
const renderResults = () => { const renderResults = () => {
const value = results.value; const value = results.value;
@ -174,7 +182,7 @@ export default function SearchPage() {
</InlineFieldRow> </InlineFieldRow>
{Boolean(searchSelection.items.size > 0) ? ( {Boolean(searchSelection.items.size > 0) ? (
<ManageActions items={searchSelection.items} /> <ManageActions items={searchSelection.items} onChange={onChangeItemsList} />
) : ( ) : (
<ActionRow <ActionRow
onLayoutChange={(v) => { onLayoutChange={(v) => {

View File

@ -5,10 +5,10 @@ import { GrafanaTheme } from '@grafana/data';
import { ConfirmModal, stylesFactory, useTheme } from '@grafana/ui'; import { ConfirmModal, stylesFactory, useTheme } from '@grafana/ui';
import { deleteFoldersAndDashboards } from 'app/features/manage-dashboards/state/actions'; import { deleteFoldersAndDashboards } from 'app/features/manage-dashboards/state/actions';
import { OnDeleteSelectedItems } from '../../types'; import { OnMoveOrDeleleSelectedItems } from '../../types';
interface Props { interface Props {
onDeleteItems: OnDeleteSelectedItems; onDeleteItems: OnMoveOrDeleleSelectedItems;
results: Map<string, Set<string>>; results: Map<string, Set<string>>;
isOpen: boolean; isOpen: boolean;
onDismiss: () => void; onDismiss: () => void;
@ -40,8 +40,8 @@ export const ConfirmDeleteModal: FC<Props> = ({ results, onDeleteItems, isOpen,
const deleteItems = () => { const deleteItems = () => {
deleteFoldersAndDashboards(folders, dashboards).then(() => { deleteFoldersAndDashboards(folders, dashboards).then(() => {
onDeleteItems();
onDismiss(); onDismiss();
onDeleteItems(folders, dashboards);
}); });
}; };

View File

@ -2,9 +2,10 @@ import React, { useState } from 'react';
import { Button, Checkbox, HorizontalGroup, useStyles2 } from '@grafana/ui'; import { Button, Checkbox, HorizontalGroup, useStyles2 } from '@grafana/ui';
import { contextSrv } from 'app/core/services/context_srv'; import { contextSrv } from 'app/core/services/context_srv';
import { FolderDTO, FolderInfo } from 'app/types'; import { FolderDTO } from 'app/types';
import { GENERAL_FOLDER_UID } from '../../constants'; import { GENERAL_FOLDER_UID } from '../../constants';
import { OnMoveOrDeleleSelectedItems } from '../../types';
import { getStyles } from './ActionRow'; import { getStyles } from './ActionRow';
import { ConfirmDeleteModal } from './ConfirmDeleteModal'; import { ConfirmDeleteModal } from './ConfirmDeleteModal';
@ -13,9 +14,10 @@ import { MoveToFolderModal } from './MoveToFolderModal';
type Props = { type Props = {
items: Map<string, Set<string>>; items: Map<string, Set<string>>;
folder?: FolderDTO; // when we are loading in folder page folder?: FolderDTO; // when we are loading in folder page
onChange: OnMoveOrDeleleSelectedItems;
}; };
export function ManageActions({ items, folder }: Props) { export function ManageActions({ items, folder, onChange }: Props) {
const styles = useStyles2(getStyles); const styles = useStyles2(getStyles);
const canSave = folder?.canSave; const canSave = folder?.canSave;
@ -45,20 +47,6 @@ export function ManageActions({ items, folder }: Props) {
alert('TODO, toggle all....'); alert('TODO, toggle all....');
}; };
//Todo: update item lists that were moved
const onMoveItems = (selectedDashboards: string[], folder: FolderInfo | null) => {
console.log({ selectedDashboards });
console.log({ folder });
console.log('items were moved in the backend');
};
//Todo: update item lists that were deleted
const onDeleteItems = (folders: string[], dashboards: string[]) => {
console.log({ folders });
console.log({ dashboards });
console.log('items were moved in the backend');
};
return ( return (
<div className={styles.actionRow}> <div className={styles.actionRow}>
<div className={styles.rowContainer}> <div className={styles.rowContainer}>
@ -83,13 +71,13 @@ export function ManageActions({ items, folder }: Props) {
</div> </div>
<ConfirmDeleteModal <ConfirmDeleteModal
onDeleteItems={onDeleteItems} onDeleteItems={onChange}
results={items} results={items}
isOpen={isDeleteModalOpen} isOpen={isDeleteModalOpen}
onDismiss={() => setIsDeleteModalOpen(false)} onDismiss={() => setIsDeleteModalOpen(false)}
/> />
<MoveToFolderModal <MoveToFolderModal
onMoveItems={onMoveItems} onMoveItems={onChange}
results={items} results={items}
isOpen={isMoveModalOpen} isOpen={isMoveModalOpen}
onDismiss={() => setIsMoveModalOpen(false)} onDismiss={() => setIsMoveModalOpen(false)}

View File

@ -8,10 +8,10 @@ import { useAppNotification } from 'app/core/copy/appNotification';
import { moveDashboards } from 'app/features/manage-dashboards/state/actions'; import { moveDashboards } from 'app/features/manage-dashboards/state/actions';
import { FolderInfo } from 'app/types'; import { FolderInfo } from 'app/types';
import { OnMoveSelectedItems } from '../../types'; import { OnMoveOrDeleleSelectedItems } from '../../types';
interface Props { interface Props {
onMoveItems: OnMoveSelectedItems; onMoveItems: OnMoveOrDeleleSelectedItems;
results: Map<string, Set<string>>; results: Map<string, Set<string>>;
isOpen: boolean; isOpen: boolean;
onDismiss: () => void; onDismiss: () => void;
@ -23,11 +23,12 @@ export const MoveToFolderModal: FC<Props> = ({ results, onMoveItems, isOpen, onD
const styles = getStyles(theme); const styles = getStyles(theme);
const notifyApp = useAppNotification(); const notifyApp = useAppNotification();
const selectedDashboards = Array.from(results.get('dashboard') ?? []); const selectedDashboards = Array.from(results.get('dashboard') ?? []);
const [moving, setMoving] = useState(false);
const moveTo = () => { const moveTo = () => {
if (folder && selectedDashboards.length) { if (folder && selectedDashboards.length) {
const folderTitle = folder.title ?? 'General'; const folderTitle = folder.title ?? 'General';
setMoving(true);
moveDashboards(selectedDashboards, folder).then((result: any) => { moveDashboards(selectedDashboards, folder).then((result: any) => {
if (result.successCount > 0) { if (result.successCount > 0) {
const ending = result.successCount === 1 ? '' : 's'; const ending = result.successCount === 1 ? '' : 's';
@ -40,9 +41,10 @@ export const MoveToFolderModal: FC<Props> = ({ results, onMoveItems, isOpen, onD
notifyApp.error('Error', `Dashboard already belongs to folder ${folderTitle}`); notifyApp.error('Error', `Dashboard already belongs to folder ${folderTitle}`);
} else { } else {
//update the list //update the list
onMoveItems(selectedDashboards, folder); onMoveItems();
} }
setMoving(false);
onDismiss(); onDismiss();
}); });
} }
@ -66,7 +68,7 @@ export const MoveToFolderModal: FC<Props> = ({ results, onMoveItems, isOpen, onD
</div> </div>
<HorizontalGroup justify="center"> <HorizontalGroup justify="center">
<Button variant="primary" onClick={moveTo}> <Button icon={moving ? 'fa fa-spinner' : undefined} variant="primary" onClick={moveTo}>
Move Move
</Button> </Button>
<Button variant="secondary" onClick={onDismiss}> <Button variant="secondary" onClick={onDismiss}>

View File

@ -110,5 +110,4 @@ export interface SearchQueryParams {
} }
// new Search Types // new Search Types
export type OnDeleteSelectedItems = (folders: string[], dashboards: string[]) => void; export type OnMoveOrDeleleSelectedItems = () => void;
export type OnMoveSelectedItems = (selectedDashboards: string[], folder: FolderInfo | null) => void;