Skip to content

Commit dd75022

Browse files
committed
chore: remove obsolete v3/v4 version copy from the dashboard
Engine V1 (v3) execution has been removed, so every "you need V4 for this" notice in the dashboard decorated a feature that is already available to everyone, and the side menu's v3 deprecation panel advertised shutdown dates that have now passed. Removes the V4Badge/V4Title component and its call sites, the "branches require V4" copy in the environment selector and both blank-state panels, the V3 deprecation panel in the side menu, and the queues-page engine-version upgrade callout along with the presenter code paths that produced it. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 7b7d489 commit dd75022

20 files changed

Lines changed: 827 additions & 1176 deletions

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
area: webapp
3+
type: improvement
4+
---
5+
6+
Out-of-date upgrade prompts no longer appear in the dashboard: the "V4" badges, the notices saying preview branches and the queues table need V4, and the v3 deprecation warning in the side menu have all been removed.

apps/webapp/app/components/BlankStatePanels.tsx

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ import {
6363
TriggerDevStepV3,
6464
} from "./SetupCommands";
6565
import { StepContentContainer } from "./StepContentContainer";
66-
import { V4Badge } from "./V4Badge";
6766

6867
/**
6968
* What the agent is asked when it's opened from a deployment setup panel. The panel is the docs
@@ -567,14 +566,10 @@ export function BranchesNoBranchableEnvironment({ showSelfServe }: { showSelfSer
567566
)
568567
}
569568
>
570-
<Paragraph spacing variant="small">
569+
<Paragraph variant="small">
571570
Preview branches in Trigger.dev create isolated environments for testing new features before
572571
production.
573572
</Paragraph>
574-
<Paragraph variant="small">
575-
You must be on <V4Badge inline /> to access preview branches. Read our{" "}
576-
<TextLink to={docsPath("upgrade-to-v4")}>upgrade to v4 guide</TextLink> to learn more.
577-
</Paragraph>
578573
</InfoPanel>
579574
);
580575
}
@@ -648,14 +643,10 @@ export function BranchesNoBranches({
648643
/>
649644
}
650645
>
651-
<Paragraph spacing variant="small">
646+
<Paragraph variant="small">
652647
Branches are a way to test new features in isolation before merging them into the main
653648
environment.
654649
</Paragraph>
655-
<Paragraph spacing variant="small">
656-
Branches are only available when using <V4Badge inline /> or above. Read our{" "}
657-
<TextLink to={docsPath("upgrade-to-v4")}>v4 upgrade guide</TextLink> to learn more.
658-
</Paragraph>
659650
</InfoPanel>
660651
);
661652
}

apps/webapp/app/components/V4Badge.tsx

Lines changed: 0 additions & 26 deletions
This file was deleted.

apps/webapp/app/components/navigation/EnvironmentSelector.tsx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { useFeatures } from "~/hooks/useFeatures";
1111
import { useOrganization, type MatchedOrganization } from "~/hooks/useOrganizations";
1212
import { useProject } from "~/hooks/useProject";
1313
import { cn } from "~/utils/cn";
14-
import { branchesPath, branchesDevPath, docsPath, v3BillingPath } from "~/utils/pathBuilder";
14+
import { branchesPath, branchesDevPath, v3BillingPath } from "~/utils/pathBuilder";
1515
import {
1616
EnvironmentCombo,
1717
EnvironmentIcon,
@@ -29,9 +29,7 @@ import {
2929
PopoverSectionHeader,
3030
PopoverTrigger,
3131
} from "../primitives/Popover";
32-
import { TextLink } from "../primitives/TextLink";
3332
import { SimpleTooltip } from "../primitives/Tooltip";
34-
import { V4Badge } from "../V4Badge";
3533
import { type SideMenuEnvironment, type SideMenuProject } from "./SideMenu";
3634
import { Badge } from "../primitives/Badge";
3735

@@ -411,14 +409,10 @@ export function BranchesPopoverContent({
411409
<BranchEnvironmentIconSmall className={cn("size-4", envTextClassName)} />
412410
<Header2>Create your first branch</Header2>
413411
</div>
414-
<Paragraph spacing variant="small">
412+
<Paragraph variant="small">
415413
Branches are a way to test new features in isolation before merging them into the main
416414
environment.
417415
</Paragraph>
418-
<Paragraph variant="small">
419-
Branches are only available when using <V4Badge inline /> or above. Read our{" "}
420-
<TextLink to={docsPath("upgrade-to-v4")}>v4 upgrade guide</TextLink> to learn more.
421-
</Paragraph>
422416
</div>
423417
) : (
424418
<div className="flex max-w-sm flex-col gap-1 p-2">

apps/webapp/app/components/navigation/SideMenu.tsx

Lines changed: 4 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
import {
2-
ArrowTopRightOnSquareIcon,
3-
ChevronRightIcon,
4-
ExclamationTriangleIcon,
5-
} from "@heroicons/react/24/outline";
1+
import { ChevronRightIcon } from "@heroicons/react/24/outline";
62
import { EllipsisHorizontalIcon } from "@heroicons/react/20/solid";
73
import {
84
Form,
@@ -135,10 +131,9 @@ import {
135131
import { FreePlanUsage } from "../billing/FreePlanUsage";
136132
import { ConnectionIcon, DevPresencePanel, useDevPresence } from "../DevPresence";
137133
import { AlphaBadge, NewBadge } from "../FeatureBadges";
138-
import { Button, ButtonContent, LinkButton } from "../primitives/Buttons";
134+
import { Button, ButtonContent } from "../primitives/Buttons";
139135
import { Dialog, DialogTrigger } from "../primitives/Dialog";
140136
import { type RenderIcon } from "../primitives/Icon";
141-
import { Paragraph } from "../primitives/Paragraph";
142137
import { Badge } from "../primitives/Badge";
143138
import {
144139
Popover,
@@ -326,7 +321,7 @@ type SideMenuUser = Pick<
326321
};
327322
export type SideMenuProject = Pick<
328323
MatchedProject,
329-
"id" | "name" | "slug" | "version" | "environments" | "engine" | "createdAt"
324+
"id" | "name" | "slug" | "version" | "environments"
330325
>;
331326
export type SideMenuEnvironment = MatchedEnvironment;
332327

@@ -402,7 +397,6 @@ export function SideMenu({
402397
const { isManagedCloud } = useFeatures();
403398
const featureFlags = useFeatureFlags();
404399
const incidentStatus = useIncidentStatus();
405-
const isV3Project = project.engine === "V1";
406400
const favorites = useFavorites();
407401
const [isCustomizeOpen, setCustomizeOpen] = useState(false);
408402
// Lives here (not in the dialog): the dialog unmounts on close, which would abort a fetcher it
@@ -1112,7 +1106,7 @@ export function SideMenu({
11121106
isDragging={isDragging}
11131107
className="min-w-0 flex-1"
11141108
/>
1115-
{environment.type === "DEVELOPMENT" && project.engine === "V2" && (
1109+
{environment.type === "DEVELOPMENT" && (
11161110
<CollapsibleElement isDragging={isDragging} className="shrink-0">
11171111
<Dialog>
11181112
<TooltipProvider disableHoverableContent={true}>
@@ -1254,13 +1248,6 @@ export function SideMenu({
12541248
hasIncident={incidentStatus.hasIncident}
12551249
isManagedCloud={incidentStatus.isManagedCloud}
12561250
/>
1257-
<V3DeprecationPanel
1258-
isCollapsed={isCollapsed}
1259-
isV3={isV3Project}
1260-
projectCreatedAt={project.createdAt}
1261-
hasIncident={incidentStatus.hasIncident}
1262-
isManagedCloud={incidentStatus.isManagedCloud}
1263-
/>
12641251
<motion.div
12651252
layout
12661253
transition={{ duration: 0.2, ease: "easeInOut" }}
@@ -1554,100 +1541,6 @@ function SectionHeaderMenu({ onCustomize }: { onCustomize: () => void }) {
15541541
);
15551542
}
15561543

1557-
function V3DeprecationPanel({
1558-
isCollapsed,
1559-
isV3,
1560-
projectCreatedAt,
1561-
hasIncident,
1562-
isManagedCloud,
1563-
}: {
1564-
isCollapsed: boolean;
1565-
isV3: boolean;
1566-
projectCreatedAt: Date;
1567-
hasIncident: boolean;
1568-
isManagedCloud: boolean;
1569-
}) {
1570-
// Only show for projects created before v4 was released
1571-
const V4_RELEASE_DATE = new Date("2025-09-01");
1572-
const isLikelyV3 = isV3 && new Date(projectCreatedAt) < V4_RELEASE_DATE;
1573-
1574-
if (!isManagedCloud || !isLikelyV3 || hasIncident) {
1575-
return null;
1576-
}
1577-
1578-
return (
1579-
<Popover>
1580-
<div className="p-1">
1581-
<motion.div
1582-
initial={false}
1583-
animate={{
1584-
height: isCollapsed ? 0 : "auto",
1585-
opacity: isCollapsed ? 0 : 1,
1586-
}}
1587-
transition={{ duration: 0.15 }}
1588-
className="overflow-hidden"
1589-
>
1590-
<V3DeprecationContent />
1591-
</motion.div>
1592-
1593-
<motion.div
1594-
initial={false}
1595-
animate={{
1596-
height: isCollapsed ? "auto" : 0,
1597-
opacity: isCollapsed ? 1 : 0,
1598-
}}
1599-
transition={{ duration: 0.15 }}
1600-
className="overflow-hidden"
1601-
>
1602-
<SimpleTooltip
1603-
button={
1604-
<PopoverTrigger className="flex h-8! w-full items-center justify-center rounded border border-amber-500/30 bg-amber-500/15 transition-colors hover:border-amber-500/50 hover:bg-amber-500/25">
1605-
<ExclamationTriangleIcon className="size-5 text-amber-400" />
1606-
</PopoverTrigger>
1607-
}
1608-
content="V3 deprecation warning"
1609-
side="right"
1610-
sideOffset={8}
1611-
disableHoverableContent
1612-
asChild
1613-
/>
1614-
</motion.div>
1615-
</div>
1616-
<PopoverContent side="right" sideOffset={8} align="start" className="w-52 min-w-0! p-0">
1617-
<V3DeprecationContent />
1618-
</PopoverContent>
1619-
</Popover>
1620-
);
1621-
}
1622-
1623-
function V3DeprecationContent() {
1624-
return (
1625-
<div className="flex flex-col gap-2 rounded border border-amber-500/30 bg-amber-500/10 p-2 pt-1.5">
1626-
<div className="flex items-center gap-1 border-b border-amber-500/30 pb-1">
1627-
<ExclamationTriangleIcon className="size-4 text-amber-400" />
1628-
<Paragraph variant="small/bright" className="text-amber-300">
1629-
V3 deprecation warning
1630-
</Paragraph>
1631-
</div>
1632-
<Paragraph variant="extra-small/bright" className="text-amber-300">
1633-
This is a v3 project. V3 deploys will stop working on 1 April 2026. Full shutdown is 1 July
1634-
2026 where all v3 runs will stop executing. Migrate to v4 to avoid downtime.
1635-
</Paragraph>
1636-
<LinkButton
1637-
variant="secondary/small"
1638-
to="https://trigger.dev/docs/migrating-from-v3"
1639-
target="_blank"
1640-
fullWidth
1641-
TrailingIcon={ArrowTopRightOnSquareIcon}
1642-
trailingIconClassName="text-amber-300"
1643-
className="border-amber-500/30 bg-amber-500/15 hover:border-amber-500/50! hover:bg-amber-500/25!"
1644-
>
1645-
<span className="text-amber-300">View migration guide</span>
1646-
</LinkButton>
1647-
</div>
1648-
);
1649-
}
1650-
16511544
function OrgSelector({
16521545
organization,
16531546
organizations,

apps/webapp/app/components/runs/v3/ReplayRunDialog.tsx

Lines changed: 37 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -388,51 +388,43 @@ function ReplayForm({
388388
<Label htmlFor={queue.id} variant="small">
389389
Queue
390390
</Label>
391-
{replayData.allowArbitraryQueues ? (
392-
<Input
393-
{...getInputProps(queue, { type: "text" })}
394-
variant="small"
395-
defaultValue={replayData.queue}
396-
/>
397-
) : (
398-
<Select
399-
name={queue.name}
400-
id={queue.id}
401-
placeholder="Select queue"
402-
heading="Filter queues"
403-
variant="tertiary/small"
404-
dropdownIcon
405-
items={queueItems}
406-
filter={{ keys: ["label"] }}
407-
defaultValue={replayData.queue}
408-
>
409-
{(matches) =>
410-
matches.map((queueItem) => (
411-
<SelectItem
412-
key={queueItem.value}
413-
value={queueItem.value}
414-
className="max-w-(--popover-anchor-width)"
415-
icon={
416-
queueItem.type === "task" ? (
417-
<TaskIcon className="size-4 shrink-0 text-blue-500" />
418-
) : (
419-
<RectangleStackIcon className="size-4 shrink-0 text-purple-500" />
420-
)
421-
}
422-
>
423-
<div className="flex w-full min-w-0 items-center justify-between">
424-
<span className="truncate">{queueItem.label}</span>
425-
{queueItem.paused && (
426-
<Badge variant="extra-small" className="ml-1 text-warning">
427-
Paused
428-
</Badge>
429-
)}
430-
</div>
431-
</SelectItem>
432-
))
433-
}
434-
</Select>
435-
)}
391+
<Select
392+
name={queue.name}
393+
id={queue.id}
394+
placeholder="Select queue"
395+
heading="Filter queues"
396+
variant="tertiary/small"
397+
dropdownIcon
398+
items={queueItems}
399+
filter={{ keys: ["label"] }}
400+
defaultValue={replayData.queue}
401+
>
402+
{(matches) =>
403+
matches.map((queueItem) => (
404+
<SelectItem
405+
key={queueItem.value}
406+
value={queueItem.value}
407+
className="max-w-(--popover-anchor-width)"
408+
icon={
409+
queueItem.type === "task" ? (
410+
<TaskIcon className="size-4 shrink-0 text-blue-500" />
411+
) : (
412+
<RectangleStackIcon className="size-4 shrink-0 text-purple-500" />
413+
)
414+
}
415+
>
416+
<div className="flex w-full min-w-0 items-center justify-between">
417+
<span className="truncate">{queueItem.label}</span>
418+
{queueItem.paused && (
419+
<Badge variant="extra-small" className="ml-1 text-warning">
420+
Paused
421+
</Badge>
422+
)}
423+
</div>
424+
</SelectItem>
425+
))
426+
}
427+
</Select>
436428
<Hint>Assign run to a specific queue.</Hint>
437429
<FormError id={queue.errorId}>{queue.errors}</FormError>
438430
</InputGroup>

0 commit comments

Comments
 (0)