From dfeee3dd4a5882900b19cf7dd9551dbfba6a83ec Mon Sep 17 00:00:00 2001
From: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com>
Date: Mon, 20 Jan 2020 09:59:35 +0100
Subject: [PATCH] grafana/ui: Add synced timepickers styling to TimePicker
 (#21598)

---
 .../src/components/TimePicker/TimePicker.tsx  | 34 ++++++++++++++-----
 .../app/features/explore/TimeSyncButton.tsx   | 10 +++++-
 .../TimeSyncButton.test.tsx.snap              |  2 +-
 3 files changed, 36 insertions(+), 10 deletions(-)

diff --git a/packages/grafana-ui/src/components/TimePicker/TimePicker.tsx b/packages/grafana-ui/src/components/TimePicker/TimePicker.tsx
index c679baa85be..22615c2f93c 100644
--- a/packages/grafana-ui/src/components/TimePicker/TimePicker.tsx
+++ b/packages/grafana-ui/src/components/TimePicker/TimePicker.tsx
@@ -1,7 +1,6 @@
 // Libraries
 import React, { PureComponent, memo, FormEvent } from 'react';
-import { css } from 'emotion';
-import classNames from 'classnames';
+import { css, cx } from 'emotion';
 
 // Components
 import { Tooltip } from '../Tooltip/Tooltip';
@@ -70,6 +69,23 @@ const getStyles = stylesFactory((theme: GrafanaTheme) => {
         font-size: ${theme.typography.size.md};
       }
     `,
+    syncedTimePicker: css`
+      label: syncedTimePicker;
+      border-color: ${theme.colors.orangeDark};
+      background-image: none;
+      background-color: transparent;
+      color: ${theme.colors.orangeDark};
+      &:focus,
+      :hover {
+        color: ${theme.colors.orangeDark};
+        background-image: none;
+        background-color: transparent;
+      }
+    `,
+    noRightBorderStyle: css`
+      label: noRightBorderStyle;
+      border-right: 0;
+    `,
   };
 });
 
@@ -140,6 +156,12 @@ export class UnthemedTimePicker extends PureComponent<Props, State> {
     const { isOpen } = this.state;
     const styles = getStyles(theme);
     const hasAbsolute = isDateTime(value.raw.from) || isDateTime(value.raw.to);
+    const syncedTimePicker = timeSyncButton && isSynced;
+    const timePickerIconClass = cx('fa fa-clock-o fa-fw', { ['icon-brand-gradient']: syncedTimePicker });
+    const timePickerButtonClass = cx('btn navbar-button navbar-button--zoom', {
+      [`btn--radius-right-0 ${styles.noRightBorderStyle}`]: !!timeSyncButton,
+      [`explore-active-button-glow ${styles.syncedTimePicker}`]: syncedTimePicker,
+    });
 
     return (
       <div className={styles.container}>
@@ -151,12 +173,8 @@ export class UnthemedTimePicker extends PureComponent<Props, State> {
           )}
           <div>
             <Tooltip content={<TimePickerTooltip timeRange={value} />} placement="bottom">
-              <button
-                aria-label="TimePicker Open Button"
-                className="btn navbar-button navbar-button--zoom"
-                onClick={this.onOpen}
-              >
-                <i className={classNames('fa fa-clock-o fa-fw', isSynced && timeSyncButton && 'icon-brand-gradient')} />
+              <button aria-label="TimePicker Open Button" className={timePickerButtonClass} onClick={this.onOpen}>
+                <i className={timePickerIconClass} />
                 <TimePickerButtonLabel {...this.props} />
                 <span className={styles.caretIcon}>
                   {isOpen ? <i className="fa fa-caret-up fa-fw" /> : <i className="fa fa-caret-down fa-fw" />}
diff --git a/public/app/features/explore/TimeSyncButton.tsx b/public/app/features/explore/TimeSyncButton.tsx
index 93e0a07fdad..ab2d3788497 100644
--- a/public/app/features/explore/TimeSyncButton.tsx
+++ b/public/app/features/explore/TimeSyncButton.tsx
@@ -24,6 +24,14 @@ const getStyles = stylesFactory((theme: GrafanaTheme) => {
       label: noRightBorderStyle;
       border-right: 0;
     `,
+    /*
+     * Required top-padding, otherwise is fa-link icon in active state
+     * cut off on top due to fontAwesome icon position
+     */
+    topPadding: css`
+      label: topPadding;
+      padding-top: 1px;
+    `,
   };
 });
 
@@ -52,7 +60,7 @@ export function TimeSyncButton(props: TimeSyncButtonProps) {
         aria-label={isSynced ? 'Synced times' : 'Unsynced times'}
         onClick={() => onClick()}
       >
-        <i className={classNames('fa fa-link', isSynced && 'icon-brand-gradient')} />
+        <i className={classNames('fa fa-link', styles.topPadding, isSynced && 'icon-brand-gradient')} />
       </button>
     </Tooltip>
   );
diff --git a/public/app/features/explore/__snapshots__/TimeSyncButton.test.tsx.snap b/public/app/features/explore/__snapshots__/TimeSyncButton.test.tsx.snap
index a569d62af9e..c785c72386a 100644
--- a/public/app/features/explore/__snapshots__/TimeSyncButton.test.tsx.snap
+++ b/public/app/features/explore/__snapshots__/TimeSyncButton.test.tsx.snap
@@ -21,7 +21,7 @@ exports[`TimeSyncButton should render component 1`] = `
         onMouseLeave={[Function]}
       >
         <i
-          className="fa fa-link icon-brand-gradient"
+          className="fa fa-link css-xmj56l-topPadding icon-brand-gradient"
         />
       </button>
     </PopoverController>