mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* Add mechanism for imperatively showing modals * Migration work in progress * Reorganise save modal components * use app events emmiter instead of root scope one * Add center alignment to layoout component * Make save buttons wotk * Prettier * Remove save dashboard logic from dashboard srv * Remove unused code * Dont show error notifications * Save modal when dashboard is overwritten * For tweaks * Folder picker tweaks * Save dashboard tweaks * Copy provisioned dashboard to clipboard * Enable saving dashboard json to file * Use SaveDashboardAsButton * Review * Align buttons in dashboard settings * Migrate SaveDashboardAs tests * TS fixes * SaveDashboardForm tests migrated * Fixe some failing tests * Fix folder picker tests * Fix HistoryListCtrl tests * Remove old import * Enable fixed positioning for folder picker select menu * Modal: show react modals with appEvents * Open react modals using event * Move save dashboard modals to dashboard feature * Make e2e pass * Update public/app/features/dashboard/components/SaveDashboard/SaveDashboardButton.tsx * Hacking old vs new buttons to make all the things look like it's old good Grafana ;) Co-authored-by: Alexander Zobnin <alexanderzobnin@gmail.com>
93 lines
3.3 KiB
TypeScript
93 lines
3.3 KiB
TypeScript
import React from 'react';
|
|
import { css } from 'emotion';
|
|
import { Button, Forms, ModalsController } from '@grafana/ui';
|
|
import { DashboardModel } from 'app/features/dashboard/state';
|
|
import { connectWithProvider } from 'app/core/utils/connectWithReduxStore';
|
|
import { provideModalsContext } from 'app/routes/ReactContainer';
|
|
import { SaveDashboardAsModal } from './SaveDashboardAsModal';
|
|
import { SaveDashboardModalProxy } from './SaveDashboardModalProxy';
|
|
|
|
interface SaveDashboardButtonProps {
|
|
dashboard: DashboardModel;
|
|
/**
|
|
* Added for being able to render this component as Angular directive!
|
|
* TODO[angular-migrations]: Remove when we migrate Dashboard Settings view to React
|
|
*/
|
|
getDashboard?: () => DashboardModel;
|
|
onSaveSuccess?: () => void;
|
|
useNewForms?: boolean;
|
|
}
|
|
|
|
export const SaveDashboardButton: React.FC<SaveDashboardButtonProps> = ({
|
|
dashboard,
|
|
onSaveSuccess,
|
|
getDashboard,
|
|
useNewForms,
|
|
}) => {
|
|
const ButtonComponent = useNewForms ? Forms.Button : Button;
|
|
return (
|
|
<ModalsController>
|
|
{({ showModal, hideModal }) => {
|
|
return (
|
|
<ButtonComponent
|
|
onClick={() => {
|
|
showModal(SaveDashboardModalProxy, {
|
|
// TODO[angular-migrations]: Remove tenary op when we migrate Dashboard Settings view to React
|
|
dashboard: getDashboard ? getDashboard() : dashboard,
|
|
onSaveSuccess,
|
|
onDismiss: hideModal,
|
|
});
|
|
}}
|
|
>
|
|
Save dashboard
|
|
</ButtonComponent>
|
|
);
|
|
}}
|
|
</ModalsController>
|
|
);
|
|
};
|
|
|
|
export const SaveDashboardAsButton: React.FC<SaveDashboardButtonProps & { variant?: string }> = ({
|
|
dashboard,
|
|
onSaveSuccess,
|
|
getDashboard,
|
|
useNewForms,
|
|
variant,
|
|
}) => {
|
|
const ButtonComponent = useNewForms ? Forms.Button : Button;
|
|
return (
|
|
<ModalsController>
|
|
{({ showModal, hideModal }) => {
|
|
return (
|
|
<ButtonComponent
|
|
/* Styles applied here are specific to dashboard settings view */
|
|
className={css`
|
|
width: 100%;
|
|
justify-content: center;
|
|
`}
|
|
onClick={() => {
|
|
showModal(SaveDashboardAsModal, {
|
|
// TODO[angular-migrations]: Remove tenary op when we migrate Dashboard Settings view to React
|
|
dashboard: getDashboard ? getDashboard() : dashboard,
|
|
onSaveSuccess,
|
|
onDismiss: hideModal,
|
|
});
|
|
}}
|
|
// TODO[angular-migrations]: Hacking the different variants for this single button
|
|
// In Dashboard Settings in sidebar we need to use new form but with inverse variant to make it look like it should
|
|
// Everywhere else we use old button component :(
|
|
variant={variant as any}
|
|
>
|
|
Save As...
|
|
</ButtonComponent>
|
|
);
|
|
}}
|
|
</ModalsController>
|
|
);
|
|
};
|
|
|
|
// TODO: this is an ugly solution for the save button to have access to Redux and Modals controller
|
|
// When we migrate dashboard settings to Angular it won't be necessary.
|
|
export const SaveDashboardButtonConnected = connectWithProvider(provideModalsContext(SaveDashboardButton));
|
|
export const SaveDashboardAsButtonConnected = connectWithProvider(provideModalsContext(SaveDashboardAsButton));
|