Skip to content

Commit f90960f

Browse files
authored
Better display when there are lots of dev environment (#1093)
* Created an EnvironmentLabels component that puts extra dev environments behind a + * Added new environment labels components to schedules pages
1 parent 2306217 commit f90960f

File tree

12 files changed

+83
-40
lines changed

12 files changed

+83
-40
lines changed

apps/webapp/app/components/environments/EnvironmentLabel.tsx

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
import { RuntimeEnvironment } from "~/models/runtimeEnvironment.server";
1+
import type { RuntimeEnvironment } from "~/models/runtimeEnvironment.server";
22
import { cn } from "~/utils/cn";
3+
import { sortEnvironments } from "~/utils/environmentSort";
4+
import { SimpleTooltip } from "../primitives/Tooltip";
35

46
type Environment = Pick<RuntimeEnvironment, "type">;
57
const variants = {
@@ -33,6 +35,73 @@ export function EnvironmentLabel({
3335
);
3436
}
3537

38+
type EnvironmentWithUsername = Environment & { userName?: string };
39+
40+
export function EnvironmentLabels({
41+
environments,
42+
size = "small",
43+
className,
44+
}: {
45+
environments: EnvironmentWithUsername[];
46+
size?: keyof typeof variants;
47+
className?: string;
48+
}) {
49+
const devEnvironments = sortEnvironments(
50+
environments.filter((env) => env.type === "DEVELOPMENT")
51+
);
52+
const firstDevEnvironment = devEnvironments[0];
53+
const otherDevEnvironments = devEnvironments.slice(1);
54+
const otherEnvironments = environments.filter((env) => env.type !== "DEVELOPMENT");
55+
56+
return (
57+
<div className={cn("flex items-baseline gap-2", className)}>
58+
{firstDevEnvironment && (
59+
<EnvironmentLabel
60+
environment={firstDevEnvironment}
61+
userName={firstDevEnvironment.userName}
62+
size={size}
63+
/>
64+
)}
65+
{otherDevEnvironments.length > 0 ? (
66+
<SimpleTooltip
67+
button={
68+
<span
69+
className={cn(
70+
"inline-flex items-center justify-center whitespace-nowrap border font-medium uppercase tracking-wider",
71+
environmentBorderClassName({ type: "DEVELOPMENT" }),
72+
environmentTextClassName({ type: "DEVELOPMENT" }),
73+
variants[size]
74+
)}
75+
>
76+
+{otherDevEnvironments.length}
77+
</span>
78+
}
79+
content={
80+
<div className="flex gap-1 py-1">
81+
{otherDevEnvironments.map((environment, index) => (
82+
<EnvironmentLabel
83+
key={index}
84+
environment={environment}
85+
userName={environment.userName}
86+
size={size}
87+
/>
88+
))}
89+
</div>
90+
}
91+
/>
92+
) : null}
93+
{otherEnvironments.map((environment, index) => (
94+
<EnvironmentLabel
95+
key={index}
96+
environment={environment}
97+
userName={environment.userName}
98+
size={size}
99+
/>
100+
))}
101+
</div>
102+
);
103+
}
104+
36105
export function environmentTitle(environment: Environment, username?: string) {
37106
switch (environment.type) {
38107
case "PRODUCTION":

apps/webapp/app/presenters/EnvironmentsPresenter.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
IndexEndpointStats,
1515
parseEndpointIndexStats,
1616
} from "@trigger.dev/core";
17-
import { sortEnvironments } from "~/services/environmentSort.server";
17+
import { sortEnvironments } from "~/utils/environmentSort";
1818

1919
export type Client = {
2020
slug: string;

apps/webapp/app/presenters/HttpEndpointPresenter.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { z } from "zod";
22
import { PrismaClient, prisma } from "~/db.server";
3-
import { sortEnvironments } from "~/services/environmentSort.server";
3+
import { sortEnvironments } from "~/utils/environmentSort";
44
import { httpEndpointUrl } from "~/services/httpendpoint/HandleHttpEndpointService";
55
import { getSecretStore } from "~/services/secrets/secretStore.server";
66
import { projectPath } from "~/utils/pathBuilder";

apps/webapp/app/presenters/ProjectPresenter.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { PrismaClient, prisma } from "~/db.server";
22
import { Project } from "~/models/project.server";
33
import { displayableEnvironments } from "~/models/runtimeEnvironment.server";
44
import { User } from "~/models/user.server";
5-
import { sortEnvironments } from "~/services/environmentSort.server";
5+
import { sortEnvironments } from "~/utils/environmentSort";
66

77
export class ProjectPresenter {
88
#prismaClient: PrismaClient;

apps/webapp/app/presenters/v3/ApiKeysPresenter.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { PrismaClient, prisma } from "~/db.server";
22
import { Project } from "~/models/project.server";
33
import { User } from "~/models/user.server";
4-
import { sortEnvironments } from "~/services/environmentSort.server";
4+
import { sortEnvironments } from "~/utils/environmentSort";
55

66
export class ApiKeysPresenter {
77
#prismaClient: PrismaClient;

apps/webapp/app/presenters/v3/EnvironmentVariablesPresenter.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { PrismaClient, prisma } from "~/db.server";
22
import { Project } from "~/models/project.server";
33
import { User } from "~/models/user.server";
4-
import { sortEnvironments } from "~/services/environmentSort.server";
4+
import { sortEnvironments } from "~/utils/environmentSort";
55
import { EnvironmentVariablesRepository } from "~/v3/environmentVariables/environmentVariablesRepository.server";
66

77
type Result = Awaited<ReturnType<EnvironmentVariablesPresenter["call"]>>;

apps/webapp/app/presenters/v3/TaskListPresenter.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { Organization } from "~/models/organization.server";
1010
import { Project } from "~/models/project.server";
1111
import { displayableEnvironments } from "~/models/runtimeEnvironment.server";
1212
import { User } from "~/models/user.server";
13-
import { sortEnvironments } from "~/services/environmentSort.server";
13+
import { sortEnvironments } from "~/utils/environmentSort";
1414
import { logger } from "~/services/logger.server";
1515
import { BasePresenter } from "./basePresenter.server";
1616

apps/webapp/app/presenters/v3/TestPresenter.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { TaskTriggerSource } from "@trigger.dev/database";
22
import { sqlDatabaseSchema, PrismaClient, prisma } from "~/db.server";
33
import { TestSearchParams } from "~/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.test/route";
4-
import { sortEnvironments } from "~/services/environmentSort.server";
4+
import { sortEnvironments } from "~/utils/environmentSort";
55
import { createSearchParams } from "~/utils/searchParams";
66
import { getUsername } from "~/utils/username";
77

apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam._index/route.tsx

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { InitCommandV3, TriggerDevStepV3, TriggerLoginStepV3 } from "~/component
1111
import { StepContentContainer } from "~/components/StepContentContainer";
1212
import { AdminDebugTooltip } from "~/components/admin/debugTooltip";
1313
import { InlineCode } from "~/components/code/InlineCode";
14-
import { EnvironmentLabel } from "~/components/environments/EnvironmentLabel";
14+
import { EnvironmentLabels } from "~/components/environments/EnvironmentLabel";
1515
import { MainCenteredContainer, PageBody, PageContainer } from "~/components/layout/AppLayout";
1616
import { Button } from "~/components/primitives/Buttons";
1717
import { Callout } from "~/components/primitives/Callout";
@@ -261,15 +261,7 @@ export default function Page() {
261261
</Suspense>
262262
</TableCell>
263263
<TableCell to={path}>
264-
<div className="space-x-2">
265-
{task.environments.map((environment) => (
266-
<EnvironmentLabel
267-
key={environment.id}
268-
environment={environment}
269-
userName={environment.userName}
270-
/>
271-
))}
272-
</div>
264+
<EnvironmentLabels environments={task.environments} />
273265
</TableCell>
274266
<TableCellChevron to={path} />
275267
</TableRow>

apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.schedules.$scheduleParam/route.tsx

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { typedjson, useTypedLoaderData } from "remix-typedjson";
88
import { z } from "zod";
99
import { ExitIcon } from "~/assets/icons/ExitIcon";
1010
import { InlineCode } from "~/components/code/InlineCode";
11-
import { EnvironmentLabel } from "~/components/environments/EnvironmentLabel";
11+
import { EnvironmentLabel, EnvironmentLabels } from "~/components/environments/EnvironmentLabel";
1212
import { Button, LinkButton } from "~/components/primitives/Buttons";
1313
import { DateTime } from "~/components/primitives/DateTime";
1414
import {
@@ -211,16 +211,7 @@ export default function Page() {
211211
</div>
212212
</Property>
213213
<Property label="Environments">
214-
<div className="flex flex-wrap gap-1">
215-
{schedule.environments.map((env) => (
216-
<EnvironmentLabel
217-
key={env.id}
218-
size="small"
219-
environment={env}
220-
userName={env.userName}
221-
/>
222-
))}
223-
</div>
214+
<EnvironmentLabels size="small" environments={schedule.environments} />
224215
</Property>
225216
<Property label="External ID">
226217
{schedule.externalId ? schedule.externalId : "–"}

apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.schedules/route.tsx

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { typedjson, useTypedLoaderData } from "remix-typedjson";
66
import { BlankstateInstructions } from "~/components/BlankstateInstructions";
77
import { AdminDebugTooltip } from "~/components/admin/debugTooltip";
88
import { InlineCode } from "~/components/code/InlineCode";
9-
import { EnvironmentLabel } from "~/components/environments/EnvironmentLabel";
9+
import { EnvironmentLabel, EnvironmentLabels } from "~/components/environments/EnvironmentLabel";
1010
import { MainCenteredContainer, PageBody, PageContainer } from "~/components/layout/AppLayout";
1111
import { LinkButton } from "~/components/primitives/Buttons";
1212
import { DateTime } from "~/components/primitives/DateTime";
@@ -281,15 +281,7 @@ function SchedulesTable({
281281
{schedule.lastRun ? <DateTime date={schedule.lastRun} timeZone="utc" /> : "–"}
282282
</TableCell>
283283
<TableCell to={path} className={cellClass}>
284-
<div className="flex gap-1">
285-
{schedule.environments.map((environment) => (
286-
<EnvironmentLabel
287-
key={environment.id}
288-
environment={environment}
289-
userName={environment.userName}
290-
/>
291-
))}
292-
</div>
284+
<EnvironmentLabels environments={schedule.environments} size="small" />
293285
</TableCell>
294286
<TableCell to={path}>
295287
<EnabledStatus enabled={schedule.active} />

apps/webapp/app/services/environmentSort.server.ts renamed to apps/webapp/app/utils/environmentSort.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { RuntimeEnvironmentType } from "@trigger.dev/database";
2-
import { logger } from "./logger.server";
32

43
const environmentSortOrder: RuntimeEnvironmentType[] = [
54
"DEVELOPMENT",

0 commit comments

Comments
 (0)