diff --git a/.changeset/list-project-runtime-updates.md b/.changeset/list-project-runtime-updates.md new file mode 100644 index 00000000000..fe8c7479769 --- /dev/null +++ b/.changeset/list-project-runtime-updates.md @@ -0,0 +1,6 @@ +--- +"trigger.dev": patch +"@trigger.dev/core": patch +--- + +List the current Production runtime for every accessible project with `trigger projects list`. Add `--needs-update` to identify projects currently running Node.js 21. diff --git a/apps/webapp/app/components/navigation/OrganizationSettingsSideMenu.tsx b/apps/webapp/app/components/navigation/OrganizationSettingsSideMenu.tsx index 465346ad150..56b988e3e7f 100644 --- a/apps/webapp/app/components/navigation/OrganizationSettingsSideMenu.tsx +++ b/apps/webapp/app/components/navigation/OrganizationSettingsSideMenu.tsx @@ -2,6 +2,7 @@ import { ArrowLeftIcon } from "@heroicons/react/24/solid"; import { BellIcon } from "~/assets/icons/BellIcon"; import { ChainLinkIcon } from "~/assets/icons/ChainLinkIcon"; import { CreditCardIcon } from "~/assets/icons/CreditCardIcon"; +import { FolderOpenIcon } from "~/assets/icons/FolderOpenIcon"; import { PadlockIcon } from "~/assets/icons/PadlockIcon"; import { UsageIcon } from "~/assets/icons/UsageIcon"; import { RolesIcon } from "~/assets/icons/RolesIcon"; @@ -16,6 +17,7 @@ import { cn } from "~/utils/cn"; import { organizationPath, organizationRolesPath, + organizationRuntimeUpdatesPath, organizationSettingsPath, organizationSlackIntegrationPath, organizationSsoPath, @@ -49,11 +51,13 @@ export function OrganizationSettingsSideMenu({ buildInfo, isUsingPlugin, isSsoUsingPlugin, + hasProjectRuntimeUpdate, }: { organization: MatchedOrganization; buildInfo: BuildInfo; isUsingPlugin: boolean; isSsoUsingPlugin: boolean; + hasProjectRuntimeUpdate: boolean; }) { const { isManagedCloud } = useFeatures(); const featureFlags = useFeatureFlags(); @@ -127,6 +131,22 @@ export function OrganizationSettingsSideMenu({ ) : null} )} + + + Runtime update available. + + ) : undefined + } + /> { diff --git a/apps/webapp/app/components/primitives/CopyButton.tsx b/apps/webapp/app/components/primitives/CopyButton.tsx index 91d47c29668..c855d4ad137 100644 --- a/apps/webapp/app/components/primitives/CopyButton.tsx +++ b/apps/webapp/app/components/primitives/CopyButton.tsx @@ -50,7 +50,7 @@ export function CopyButton({ onClick={copy} className={cn( buttonSize, - "flex items-center justify-center rounded border border-border-bright bg-background-hover", + "flex shrink-0 items-center justify-center rounded border border-border-bright bg-background-hover", copied ? "text-green-500" : "text-text-dimmed hover:border-border-bright hover:bg-background-raised hover:text-text-bright", diff --git a/apps/webapp/app/components/primitives/Label.tsx b/apps/webapp/app/components/primitives/Label.tsx index 7213d52205c..da27dee7eab 100644 --- a/apps/webapp/app/components/primitives/Label.tsx +++ b/apps/webapp/app/components/primitives/Label.tsx @@ -2,7 +2,8 @@ import * as React from "react"; import { cn } from "~/utils/cn"; import { InfoIconTooltip } from "./Tooltip"; -const variants = { +// Non-form labels (e.g. settings row titles) share this typography, so it is exported. +export const labelVariants = { small: { text: "font-sans text-[0.8125rem] font-normal text-text-bright leading-tight flex items-center gap-1", }, @@ -17,7 +18,7 @@ const variants = { type LabelProps = React.AllHTMLAttributes & { className?: string; children: React.ReactNode; - variant?: keyof typeof variants; + variant?: keyof typeof labelVariants; required?: boolean; tooltip?: React.ReactNode; }; @@ -30,7 +31,7 @@ export function Label({ tooltip, ...props }: LabelProps) { - const variation = variants[variant]; + const variation = labelVariants[variant]; return (