ChangeTracker: Unified unsaved changes handling with library panels (#34989)

* UnsavedChanges: Move Change tracker to use Prompt

* Fix a lot of race conditions and stacking of changes in onConfirm and onDismiss

* Listen to save event

* add missing delay argument

* migrated the change tracker unit tests

* Updated snapshot

* Removed unessary action

* removed updateSourcePanel

* Fix hiding save library panel modal prompt when clicking discard

* change saved libray panel title and buttons so they are a bit different as Prompt and when used from save button

* Fixed issue with saving new dashboard

* Now all scenarios work

* increase wait time

* Fixed one more race condition
This commit is contained in:
Torkel Ödegaard
2021-06-02 12:24:19 +02:00
committed by GitHub
parent f052f10289
commit e6f2b10a36
15 changed files with 538 additions and 328 deletions
@@ -9,7 +9,7 @@ import { getModalStyles } from '../../styles';
interface Props {
panel: PanelModelWithLibraryPanel;
folderId: number;
isOpen: boolean;
isUnsavedPrompt?: boolean;
onConfirm: () => void;
onDismiss: () => void;
onDiscard: () => void;
@@ -18,7 +18,7 @@ interface Props {
export const SaveLibraryPanelModal: React.FC<Props> = ({
panel,
folderId,
isOpen,
isUnsavedPrompt,
onDismiss,
onConfirm,
onDiscard,
@@ -52,11 +52,12 @@ export const SaveLibraryPanelModal: React.FC<Props> = ({
const styles = useStyles(getModalStyles);
const discardAndClose = useCallback(() => {
onDiscard();
onDismiss();
}, [onDiscard, onDismiss]);
}, [onDiscard]);
const title = isUnsavedPrompt ? 'Unsaved library panel changes' : 'Save library panel';
return (
<Modal title="Update all panel instances" icon="save" onDismiss={onDismiss} isOpen={isOpen}>
<Modal title={title} icon="save" onDismiss={onDismiss} isOpen={true}>
<div>
<p className={styles.textInfo}>
{'This update will affect '}
@@ -95,14 +96,15 @@ export const SaveLibraryPanelModal: React.FC<Props> = ({
<Button variant="secondary" onClick={onDismiss} fill="outline">
Cancel
</Button>
<Button variant="destructive" onClick={discardAndClose}>
Discard
</Button>
{isUnsavedPrompt && (
<Button variant="destructive" onClick={discardAndClose}>
Discard
</Button>
)}
<Button
onClick={() => {
saveLibraryPanel(panel, folderId).then(() => {
onConfirm();
onDismiss();
});
}}
>