diff --git a/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.stories.tsx b/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.stories.tsx index fbabe7f2b7..c6bf504d91 100644 --- a/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.stories.tsx +++ b/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.stories.tsx @@ -495,7 +495,7 @@ export const Loaded: Story = { description: "", values: [ { - value: "false", + value: "true", count: 2, }, ], diff --git a/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx b/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx index d4ea79a79c..35b124734c 100644 --- a/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx +++ b/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx @@ -52,6 +52,7 @@ import { } from "react"; import { useQuery } from "react-query"; import { type SetURLSearchParams, useSearchParams } from "react-router"; +import { cn } from "utils/cn"; import { getLatencyColor } from "utils/latency"; import { addTime, @@ -219,33 +220,17 @@ export const TemplateInsightsPageView: FC = ({ }) => { return ( <> -
- {controls} -
-
+
{controls}
+
@@ -254,7 +239,7 @@ export const TemplateInsightsPageView: FC = ({ error={userActivity.error} /> @@ -282,17 +267,13 @@ const ActiveUsersPanel: FC = ({ - - {!error && !data && } - {(error || data?.length === 0) && } - {data && data.length > 0 && ( - ({ - amount: d.active_users, - date: d.start_time, - }))} - /> - )} + + ({ + amount: d.active_users, + date: d.start_time, + }))} + /> ); @@ -306,15 +287,14 @@ interface UsersLatencyPanelProps extends PanelProps { const UsersLatencyPanel: FC = ({ data, error, + className, ...panelProps }) => { const theme = useTheme(); - const users = data?.report.users; - return ( - + - + Latency by user @@ -327,35 +307,23 @@ const UsersLatencyPanel: FC = ({ - - - {!error && !users && } - {(error || users?.length === 0) && } - {users && - [...users] + + {data?.report.users && + [...data.report.users] .sort((a, b) => b.latency_ms.p50 - a.latency_ms.p50) .map((row) => (
-
+
-
{row.username}
+
{row.username}
{row.latency_ms.p50.toFixed(0)}ms @@ -375,16 +343,13 @@ interface UsersActivityPanelProps extends PanelProps { const UsersActivityPanel: FC = ({ data, error, + className, ...panelProps }) => { - const theme = useTheme(); - - const users = data?.report.users; - return ( - + - + Activity by user @@ -398,35 +363,20 @@ const UsersActivityPanel: FC = ({ - - {!error && !users && } - {(error || users?.length === 0) && } - {users && - [...users] + + {data?.report.users && + [...data.report.users] .sort((a, b) => b.seconds - a.seconds) .map((row) => (
-
+
-
{row.username}
+
{row.username}
-
+
{formatTime(row.seconds)}
@@ -444,6 +394,7 @@ interface TemplateUsagePanelProps extends PanelProps { const TemplateUsagePanel: FC = ({ data, error, + className, ...panelProps }) => { const theme = useTheme(); @@ -459,51 +410,26 @@ const TemplateUsagePanel: FC = ({ .colors(validUsage?.length ?? 0); return ( - + App & IDE Usage - - {!error && !data && } - {(error || validUsage?.length === 0) && ( - - )} - {validUsage && validUsage.length > 0 && ( -
- {validUsage.map((usage, i) => { + + { +
+ {(validUsage || []).map((usage, i) => { const percentage = (usage.seconds / totalInSeconds) * 100; return ( -
-
-
+
+
+
-
+
{usage.display_name}
@@ -512,10 +438,8 @@ const TemplateUsagePanel: FC = ({ = ({ {formatTime(usage.seconds)} {usage.times_used > 0 && ( - + Opened {usage.times_used.toLocaleString()}{" "} {usage.times_used === 1 ? "time" : "times"} @@ -555,7 +468,7 @@ const TemplateUsagePanel: FC = ({ ); })}
- )} + } ); @@ -571,18 +484,12 @@ const TemplateParametersUsagePanel: FC = ({ error, ...panelProps }) => { - const theme = useTheme(); - return ( Parameters usage - - {!error && !data && } - {(error || data?.length === 0) && ( - - )} + {data?.map((parameter, parameterIndex) => { const label = parameter.display_name !== "" @@ -591,42 +498,21 @@ const TemplateParametersUsagePanel: FC = ({ return (
-
-
{label}
-

+

+
{label}
+

{parameter.description}

-
- +
+
Value
@@ -646,7 +532,7 @@ const TemplateParametersUsagePanel: FC = ({ usage={usage} parameter={parameter} /> -
{usage.count}
+
{usage.count}
))}
@@ -670,17 +556,13 @@ const filterOrphanValues = ( const ParameterUsageRow: FC> = ({ children, + className, ...attrs }) => { return (
{children}
@@ -697,7 +579,6 @@ const ParameterUsageLabel: FC = ({ parameter, }) => { const ariaId = useId(); - const theme = useTheme(); if (parameter.options) { const option = parameter.options.find((o) => o.value === usage.value)!; @@ -705,23 +586,13 @@ const ParameterUsageLabel: FC = ({ const label = option.name; return ( -
+
{icon && ( -
+
@@ -737,12 +608,7 @@ const ParameterUsageLabel: FC = ({ href={usage.value} target="_blank" rel="noreferrer" - css={{ - display: "flex", - alignItems: "center", - gap: 1, - color: theme.palette.text.primary, - }} + className="flex items-center gap-[1px] text-content-primary" > {usage.value} @@ -753,16 +619,11 @@ const ParameterUsageLabel: FC = ({ if (parameter.type === "list(string)") { const values = JSON.parse(usage.value) as string[]; return ( -
+
{values.map((v, i) => (
{v}
@@ -773,13 +634,7 @@ const ParameterUsageLabel: FC = ({ if (parameter.type === "bool") { return ( -
+
{usage.value === "false" ? ( <> @@ -787,12 +642,7 @@ const ParameterUsageLabel: FC = ({ ) : ( <> - + True )} @@ -805,19 +655,14 @@ const ParameterUsageLabel: FC = ({ interface PanelProps extends HTMLAttributes {} -const Panel: FC = ({ children, ...attrs }) => { - const theme = useTheme(); - +const Panel: FC = ({ children, className, ...attrs }) => { return (
{children}
@@ -826,10 +671,11 @@ const Panel: FC = ({ children, ...attrs }) => { const PanelHeader: FC> = ({ children, + className, ...attrs }) => { return ( -
+
{children}
); @@ -837,22 +683,31 @@ const PanelHeader: FC> = ({ const PanelTitle: FC> = ({ children, + className, ...attrs }) => { return ( -
+
{children}
); }; -const PanelContent: FC> = ({ - children, - ...attrs -}) => { +interface PanelContentProps extends HTMLAttributes { + error: unknown | undefined; + data: readonly unknown[] | undefined; +} + +const PanelContent: FC = ({ error, data, children }) => { return ( -
- {children} +
+ {!error && !data ? ( + + ) : error || !data || data.length === 0 ? ( + + ) : ( + children + )}
); }; @@ -862,20 +717,10 @@ interface NoDataAvailableProps extends HTMLAttributes { } const NoDataAvailable: FC = ({ error, ...props }) => { - const theme = useTheme(); - return (
{error ? getErrorDetail(error) || @@ -886,29 +731,11 @@ const NoDataAvailable: FC = ({ error, ...props }) => { }; const TextValue: FC = ({ children }) => { - const theme = useTheme(); - return ( - - " - + " {children} - - " - + " ); };