mirror of
https://github.com/grafana/grafana.git
synced 2025-02-15 10:03:33 -06:00
* Add and configure eslint-plugin-import * Fix the lint:ts npm command * Autofix + prettier all the files * Manually fix remaining files * Move jquery code in jest-setup to external file to safely reorder imports * Resolve issue caused by circular dependencies within Prometheus * Update .betterer.results * Fix missing // @ts-ignore * ignore iconBundle.ts * Fix missing // @ts-ignore
91 lines
2.8 KiB
TypeScript
91 lines
2.8 KiB
TypeScript
import { css } from '@emotion/css';
|
|
import React, { FC, useState } from 'react';
|
|
|
|
import { GrafanaTheme } from '@grafana/data';
|
|
import { Button, HorizontalGroup, Modal, stylesFactory, useTheme } from '@grafana/ui';
|
|
import { FolderPicker } from 'app/core/components/Select/FolderPicker';
|
|
import { useAppNotification } from 'app/core/copy/appNotification';
|
|
import { moveDashboards } from 'app/features/manage-dashboards/state/actions';
|
|
import { FolderInfo } from 'app/types';
|
|
|
|
import { DashboardSection, OnMoveItems } from '../types';
|
|
import { getCheckedDashboards } from '../utils';
|
|
|
|
interface Props {
|
|
onMoveItems: OnMoveItems;
|
|
results: DashboardSection[];
|
|
isOpen: boolean;
|
|
onDismiss: () => void;
|
|
}
|
|
|
|
export const MoveToFolderModal: FC<Props> = ({ results, onMoveItems, isOpen, onDismiss }) => {
|
|
const [folder, setFolder] = useState<FolderInfo | null>(null);
|
|
const theme = useTheme();
|
|
const styles = getStyles(theme);
|
|
const selectedDashboards = getCheckedDashboards(results);
|
|
const notifyApp = useAppNotification();
|
|
|
|
const moveTo = () => {
|
|
if (folder && selectedDashboards.length) {
|
|
const folderTitle = folder.title ?? 'General';
|
|
|
|
moveDashboards(selectedDashboards.map((d) => d.uid) as string[], folder).then((result: any) => {
|
|
if (result.successCount > 0) {
|
|
const ending = result.successCount === 1 ? '' : 's';
|
|
const header = `Dashboard${ending} Moved`;
|
|
const msg = `${result.successCount} dashboard${ending} moved to ${folderTitle}`;
|
|
notifyApp.success(header, msg);
|
|
}
|
|
|
|
if (result.totalCount === result.alreadyInFolderCount) {
|
|
notifyApp.error('Error', `Dashboard already belongs to folder ${folderTitle}`);
|
|
} else {
|
|
onMoveItems(selectedDashboards, folder);
|
|
}
|
|
|
|
onDismiss();
|
|
});
|
|
}
|
|
};
|
|
|
|
return isOpen ? (
|
|
<Modal
|
|
className={styles.modal}
|
|
title="Choose Dashboard Folder"
|
|
icon="folder-plus"
|
|
isOpen={isOpen}
|
|
onDismiss={onDismiss}
|
|
>
|
|
<>
|
|
<div className={styles.content}>
|
|
<p>
|
|
Move the {selectedDashboards.length} selected dashboard{selectedDashboards.length === 1 ? '' : 's'} to the
|
|
following folder:
|
|
</p>
|
|
<FolderPicker onChange={(f) => setFolder(f as FolderInfo)} />
|
|
</div>
|
|
|
|
<HorizontalGroup justify="center">
|
|
<Button variant="primary" onClick={moveTo}>
|
|
Move
|
|
</Button>
|
|
<Button variant="secondary" onClick={onDismiss}>
|
|
Cancel
|
|
</Button>
|
|
</HorizontalGroup>
|
|
</>
|
|
</Modal>
|
|
) : null;
|
|
};
|
|
|
|
const getStyles = stylesFactory((theme: GrafanaTheme) => {
|
|
return {
|
|
modal: css`
|
|
width: 500px;
|
|
`,
|
|
content: css`
|
|
margin-bottom: ${theme.spacing.lg};
|
|
`,
|
|
};
|
|
});
|