mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
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:
parent
90b7a76328
commit
75760e90b4
@ -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) => {
|
||||||
|
@ -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);
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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)}
|
||||||
|
@ -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}>
|
||||||
|
@ -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;
|
|
||||||
|
Loading…
Reference in New Issue
Block a user