From 66588d10d3347801bf2f59be70e2658108c8ff82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Thu, 4 Oct 2018 19:38:19 +0100 Subject: [PATCH] chore(ui): better modal animation, based on bootstrap code --- .../Components/Animations/MountModal/index.js | 42 +++++++++++ .../Animations/MountModal/index.scss | 49 +++++++++++++ .../Components/MainModal/MainModalContent.js | 73 ++++++++++--------- .../MainModal/MainModalContent.test.js | 1 + .../MainModalContent.test.js.snap | 2 +- ui/src/Components/MainModal/index.js | 7 +- .../SilenceModal/SilenceModalContent.js | 63 +++++++++------- ui/src/Components/SilenceModal/index.js | 6 +- 8 files changed, 176 insertions(+), 67 deletions(-) create mode 100644 ui/src/Components/Animations/MountModal/index.js create mode 100644 ui/src/Components/Animations/MountModal/index.scss diff --git a/ui/src/Components/Animations/MountModal/index.js b/ui/src/Components/Animations/MountModal/index.js new file mode 100644 index 000000000..c4b2446fb --- /dev/null +++ b/ui/src/Components/Animations/MountModal/index.js @@ -0,0 +1,42 @@ +import React from "react"; +import PropTypes from "prop-types"; + +import { CSSTransition } from "react-transition-group"; + +import "./index.scss"; + +const MountModal = ({ children, duration, ...props }) => ( + + {children} + +); +MountModal.propTypes = { + children: PropTypes.node.isRequired +}; + +const MountModalBackdrop = ({ children, duration, ...props }) => ( + + {children} + +); +MountModalBackdrop.propTypes = { + children: PropTypes.node.isRequired +}; + +export { MountModal, MountModalBackdrop }; diff --git a/ui/src/Components/Animations/MountModal/index.scss b/ui/src/Components/Animations/MountModal/index.scss new file mode 100644 index 000000000..fa9c40525 --- /dev/null +++ b/ui/src/Components/Animations/MountModal/index.scss @@ -0,0 +1,49 @@ +@import "~bootstrap/scss/functions"; +@import "~bootstrap/scss/variables"; + +$duration: 0.2s; + +.components-animation-modal-appear, +.components-animation-modal-enter { + opacity: 0.01; + transform: translate(0, -25%); +} +.components-animation-modal-appear-active, +.components-animation-modal-enter-active { + opacity: 1; + transition: transform $duration ease-out, opacity $duration ease-in; + transform: translate(0, 0); +} + +.components-animation-modal-exit { + opacity: 1; + transform: translate(0, 0); +} +.components-animation-modal-exit-active { + opacity: 0.01; + transform: translate(0, -25%); + transition: transform $duration ease-in, opacity $duration ease-out; +} + +.components-animation-backdrop-appear, +.components-animation-backdrop-enter { + opacity: 0.01; +} +.components-animation-backdrop-appear-active, +.components-animation-backdrop-enter-active { + opacity: $modal-backdrop-opacity; + transition: opacity $duration ease-in; +} + +.components-animation-backdrop-enter-done { + opacity: $modal-backdrop-opacity; + transition: opacity $duration ease-in; +} + +.components-animation-backdrop-exit { + opacity: $modal-backdrop-opacity; +} +.components-animation-backdrop-exit-active { + opacity: 0.01; + transition: opacity $duration ease-out; +} diff --git a/ui/src/Components/MainModal/MainModalContent.js b/ui/src/Components/MainModal/MainModalContent.js index 33c58d4f7..67b0d88ab 100644 --- a/ui/src/Components/MainModal/MainModalContent.js +++ b/ui/src/Components/MainModal/MainModalContent.js @@ -10,6 +10,7 @@ import { disableBodyScroll, enableBodyScroll } from "body-scroll-lock"; import { AlertStore } from "Stores/AlertStore"; import { Settings } from "Stores/Settings"; import { Configuration } from "./Configuration"; +import { MountModalBackdrop } from "Components/Animations/MountModal"; import { Help } from "./Help"; const Tab = ({ title, active, onClick }) => ( @@ -38,7 +39,8 @@ const MainModalContent = observer( static propTypes = { alertStore: PropTypes.instanceOf(AlertStore).isRequired, settingsStore: PropTypes.instanceOf(Settings).isRequired, - onHide: PropTypes.func.isRequired + onHide: PropTypes.func.isRequired, + isVisible: PropTypes.bool.isRequired }; tab = observable( @@ -60,43 +62,48 @@ const MainModalContent = observer( } render() { - const { alertStore, settingsStore, onHide } = this.props; + const { alertStore, settingsStore, onHide, isVisible } = this.props; return ReactDOM.createPortal( -
-
-
-
- -
-
- {this.tab.current === TabNames.Help ? : null} - {this.tab.current === TabNames.Configuration ? ( - - ) : null} -
-
- - Version: {alertStore.info.version} - + +
+
+
+
+ +
+
+ {this.tab.current === TabNames.Help ? : null} + {this.tab.current === TabNames.Configuration ? ( + + ) : null} +
+
+ + Version: {alertStore.info.version} + +
-
, + +
+ + , document.body ); } diff --git a/ui/src/Components/MainModal/MainModalContent.test.js b/ui/src/Components/MainModal/MainModalContent.test.js index dabf4e7c4..f9b033f4a 100644 --- a/ui/src/Components/MainModal/MainModalContent.test.js +++ b/ui/src/Components/MainModal/MainModalContent.test.js @@ -28,6 +28,7 @@ const FakeModal = () => { alertStore={alertStore} settingsStore={settingsStore} onHide={onHide} + isVisible={true} /> ); }; diff --git a/ui/src/Components/MainModal/__snapshots__/MainModalContent.test.js.snap b/ui/src/Components/MainModal/__snapshots__/MainModalContent.test.js.snap index 19bf61b7c..eff9a7e04 100644 --- a/ui/src/Components/MainModal/__snapshots__/MainModalContent.test.js.snap +++ b/ui/src/Components/MainModal/__snapshots__/MainModalContent.test.js.snap @@ -2,7 +2,7 @@ exports[` matches snapshot 1`] = ` " -
- + - + ); } diff --git a/ui/src/Components/SilenceModal/SilenceModalContent.js b/ui/src/Components/SilenceModal/SilenceModalContent.js index 6c6cbb3e1..be7109652 100644 --- a/ui/src/Components/SilenceModal/SilenceModalContent.js +++ b/ui/src/Components/SilenceModal/SilenceModalContent.js @@ -9,6 +9,7 @@ import { disableBodyScroll, enableBodyScroll } from "body-scroll-lock"; import { AlertStore } from "Stores/AlertStore"; import { SilenceFormStore } from "Stores/SilenceFormStore"; import { Settings } from "Stores/Settings"; +import { MountModalBackdrop } from "Components/Animations/MountModal"; import { SilenceForm } from "./SilenceForm"; import { SilenceSubmitController } from "./SilenceSubmitController"; @@ -38,36 +39,44 @@ const SilenceModalContent = observer( } = this.props; return ReactDOM.createPortal( -
-
-
-
-
- {silenceFormStore.data.silenceID === null - ? "Add new silence" - : `Editing silence ${silenceFormStore.data.silenceID}`} -
- -
-
- {silenceFormStore.data.inProgress ? ( - - ) : ( - - )} + +
+
+
+
+
+ {silenceFormStore.data.silenceID === null + ? "Add new silence" + : `Editing silence ${silenceFormStore.data.silenceID}`} +
+ +
+
+ {silenceFormStore.data.inProgress ? ( + + ) : ( + + )} +
-
, + +
+ + , document.body ); } diff --git a/ui/src/Components/SilenceModal/index.js b/ui/src/Components/SilenceModal/index.js index d05e8470d..b615af585 100644 --- a/ui/src/Components/SilenceModal/index.js +++ b/ui/src/Components/SilenceModal/index.js @@ -9,7 +9,7 @@ import { faBellSlash } from "@fortawesome/free-solid-svg-icons/faBellSlash"; import { AlertStore } from "Stores/AlertStore"; import { SilenceFormStore } from "Stores/SilenceFormStore"; import { Settings } from "Stores/Settings"; -import { MountFade } from "Components/Animations/MountFade"; +import { MountModal } from "Components/Animations/MountModal"; import { SilenceModalContent } from "./SilenceModalContent"; import "./index.css"; @@ -60,14 +60,14 @@ const SilenceModal = observer( - + - + ); }