From f6ca7d1a95da517d28fb916969ce0a401b64cb69 Mon Sep 17 00:00:00 2001 From: Kirill Chernakov Date: Tue, 27 Aug 2024 16:29:15 +0400 Subject: [PATCH] feat: slightly different UX for provider tiles without hiding content on hover (#1736) --- keep-ui/app/providers/provider-tile.tsx | 166 +++++++++--------- keep-ui/app/providers/providers-tiles.tsx | 52 +++--- tests/e2e_tests/test_end_to_end.py | 18 +- .../test_pushing_prometheus_alerts.py | 18 +- 4 files changed, 130 insertions(+), 124 deletions(-) diff --git a/keep-ui/app/providers/provider-tile.tsx b/keep-ui/app/providers/provider-tile.tsx index 3bfa29f477..51d0a4865a 100644 --- a/keep-ui/app/providers/provider-tile.tsx +++ b/keep-ui/app/providers/provider-tile.tsx @@ -1,13 +1,12 @@ import { Badge, - Button, Icon, SparkAreaChart, Subtitle, Text, Title, } from "@tremor/react"; -import {Provider, TProviderLabels} from "./providers"; +import { Provider, TProviderLabels } from "./providers"; import { BellAlertIcon, ChatBubbleBottomCenterIcon, @@ -15,6 +14,7 @@ import { QueueListIcon, TicketIcon, MapIcon, + Cog6ToothIcon, } from "@heroicons/react/20/solid"; import "./provider-tile.css"; import moment from "moment"; @@ -88,8 +88,7 @@ const getEmptyDistribution = () => { return emptyDistribution; }; - -function getIconForTag(tag:TProviderLabels) { +function getIconForTag(tag: TProviderLabels) { switch (tag) { case "alert": return BellAlertIcon; @@ -111,25 +110,59 @@ export default function ProviderTile({ provider, onClick }: Props) { if (provider.installed || provider.linked) { return null; } - return (
- {provider.tags.map((tag) => { - return ( - -

{tag}

-
- ); - })} -
) - } + return ( +
+ {provider.tags.map((tag) => { + return ( + +

{tag}

+
+ ); + })} +
+ ); + }; + + const renderChart = () => { + const className = "mt-2 h-8 w-20 sm:h-10 sm:w-full"; + if (!provider.installed && !provider.linked) { + return null; + } + + if (provider.alertsDistribution && provider.alertsDistribution.length > 0) { + return ( + + ); + } + + return ( + + ); + }; return ( -
@@ -158,7 +191,7 @@ export default function ProviderTile({ provider, onClick }: Props) { /> )} {provider.installed ? ( - + Connected ) : null} @@ -169,24 +202,17 @@ export default function ProviderTile({ provider, onClick }: Props) { ) : null}
- + <Title className="capitalize" title={provider.details?.name}> {provider.display_name}{" "} {provider.details && provider.details.name && ( - + id: {provider.details.name} )} {provider.last_alert_received ? ( - + Last alert: {moment(provider.last_alert_received).fromNow()} ) : ( @@ -195,59 +221,35 @@ export default function ProviderTile({ provider, onClick }: Props) { {provider.linked && provider.id ? ( Id: {provider.id} ) : null} - {(provider.installed || provider.linked) && - provider.alertsDistribution && - provider.alertsDistribution.length > 0 ? ( - - ) : provider.installed || provider.linked ? ( - - ) : null} + {renderChart()}
{renderTags()} - {!provider.linked && ( - - )}
- -
+
+
+ +
+ {provider.installed ? ( + + ) : null} +
+ ); } diff --git a/keep-ui/app/providers/providers-tiles.tsx b/keep-ui/app/providers/providers-tiles.tsx index 78a3411176..71b5e3af19 100644 --- a/keep-ui/app/providers/providers-tiles.tsx +++ b/keep-ui/app/providers/providers-tiles.tsx @@ -98,18 +98,31 @@ const ProvidersTiles = ({ if (isConnected) handleCloseModal(); }; + const getSectionTitle = () => { + if (installedProvidersMode) { + return "Installed Providers"; + } + + if (linkedProvidersMode) { + return "Linked Providers"; + } + + return "Connect Provider"; + }; + + const sortedProviders = providers.sort( + (a, b) => + Number(b.can_setup_webhook) - Number(a.can_setup_webhook) || + Number(b.supports_webhook) - Number(a.supports_webhook) || + Number(b.oauth2_url ? true : false) - Number(a.oauth2_url ? true : false) + ); + return (
- - {installedProvidersMode - ? "Installed Providers" - : linkedProvidersMode - ? "Linked Providers" - : "Available Providers"} - + {getSectionTitle()} {linkedProvidersMode && ( -
+
- {providers - .filter(provider => Object.keys(provider.config || {}).length > 0 || (provider.tags && provider.tags.includes('alert'))) - .sort( - (a, b) => - Number(b.can_setup_webhook) - Number(a.can_setup_webhook) || - Number(b.supports_webhook) - Number(a.supports_webhook) || - Number(b.oauth2_url ? true : false) - - Number(a.oauth2_url ? true : false) - ) - .map((provider) => ( - handleConnectProvider(provider)} - > - ))} + {sortedProviders.map((provider) => ( + handleConnectProvider(provider)} + > + ))}