Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .server-changes/page-tab-titles.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
area: webapp
type: improvement
---

Browser tabs now name the page you're on, and the run, task or queue when you're looking at one, instead of all reading "Trigger.dev".
5 changes: 3 additions & 2 deletions apps/webapp/app/root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import {
} from "~/utils/themePreference";
import { cachedFlag } from "~/v3/featureFlags.server";
import { getTimezonePreference } from "./services/preferences/uiPreferences.server";
import { appEnvTitleTag } from "./utils";
import { appTitle } from "./utils/pageTitle";

// Derived here (not inside StaleAssetRecovery) so the shared component takes
// the flag as a prop. NODE_ENV is statically replaced in browser bundles, and
Expand All @@ -51,7 +51,8 @@ export const headers = () => ({
export const meta: MetaFunction = ({ data }) => {
const typedData = data as UseDataFunctionReturn<typeof loader>;
return [
{ title: typedData?.appEnv ? `Trigger.dev${appEnvTitleTag(typedData.appEnv)}` : "Trigger.dev" },
// Pages declare their own title with `pageMeta`; this is the fallback.
{ title: appTitle(typedData?.appEnv) },
{
name: "viewport",
content: "width=1024, initial-scale=1",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ import { dashboardAction, dashboardLoader } from "~/services/routeBuilders/dashb
import { acceptInvitePath, organizationTeamPath, v3BillingPath } from "~/utils/pathBuilder";
import { isAtOrBelow } from "~/utils/inviteRoleLadder";
import { PurchaseSeatsModal } from "../_app.orgs.$organizationSlug.settings.team/route";
import { pageMeta } from "~/utils/pageTitle";

export const meta = pageMeta("Invite team members");

const Params = z.object({
organizationSlug: z.string(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { BookOpenIcon, ExclamationTriangleIcon } from "@heroicons/react/20/solid";
import { json, type MetaFunction } from "@remix-run/node";
import { json } from "@remix-run/node";
import { useFetcher, useRevalidator } from "@remix-run/react";
import { type ActionFunctionArgs, type LoaderFunctionArgs } from "@remix-run/server-runtime";
import type { TaskRunStatus } from "@trigger.dev/database";
Expand Down Expand Up @@ -100,10 +100,9 @@ import {
v3TasksStreamingPath,
v3TestTaskPath,
} from "~/utils/pathBuilder";
import { pageMeta } from "~/utils/pageTitle";

export const meta: MetaFunction = () => {
return [{ title: `Tasks | Trigger.dev` }];
};
export const meta = pageMeta("Tasks");

export const loader = async ({ request, params }: LoaderFunctionArgs) => {
const userId = await requireUserId(request);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { BookOpenIcon } from "@heroicons/react/24/solid";
import { type MetaFunction } from "@remix-run/react";
import { type LoaderFunctionArgs } from "@remix-run/server-runtime";
import { Suspense, useMemo, useState } from "react";
import { TypedAwait, typeddefer, useTypedLoaderData } from "remix-typedjson";
Expand Down Expand Up @@ -50,11 +49,12 @@ import {
v3PlaygroundAgentPath,
} from "~/utils/pathBuilder";
import { parseFiniteInt } from "~/utils/searchParams";
import { pageMeta } from "~/utils/pageTitle";

export const meta: MetaFunction<typeof loader> = ({ data }) => {
const slug = (data as { agent?: AgentDetail | null } | undefined)?.agent?.slug;
return [{ title: slug ? `${slug} | Agents | Trigger.dev` : "Agent | Trigger.dev" }];
};
export const meta = pageMeta<typeof loader>(({ data, params }) => [
data?.agent?.slug ?? params.agentParam ?? "Agent",
"Agents",
]);

const AgentParamSchema = EnvironmentParamSchema.extend({
agentParam: z.string(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ import {
assertSafeWebhookUrl,
UnsafeWebhookUrlError,
} from "~/v3/services/alerts/safeWebhookUrl.server";
import { pageMeta } from "~/utils/pageTitle";

export const meta = pageMeta("New alert");

const FormSchema = z
.object({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
PlusIcon,
TrashIcon,
} from "@heroicons/react/20/solid";
import { Form, type MetaFunction, Outlet, useActionData, useNavigation } from "@remix-run/react";
import { Form, Outlet, useActionData, useNavigation } from "@remix-run/react";
import { type ActionFunctionArgs, type LoaderFunctionArgs, json } from "@remix-run/server-runtime";
import { SlackIcon } from "@trigger.dev/companyicons";
import type { ProjectAlertChannelType, ProjectAlertType } from "@trigger.dev/database";
Expand Down Expand Up @@ -66,14 +66,9 @@ import {
v3ProjectAlertsPath,
} from "~/utils/pathBuilder";
import { alertsWorker } from "~/v3/alertsWorker.server";
import { pageMeta } from "~/utils/pageTitle";

export const meta: MetaFunction = () => {
return [
{
title: `Alerts | Trigger.dev`,
},
];
};
export const meta = pageMeta("Alerts");

export const loader = async ({ request, params }: LoaderFunctionArgs) => {
const userId = await requireUserId(request);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { BookOpenIcon } from "@heroicons/react/20/solid";
import { type MetaFunction } from "@remix-run/react";
import { typedjson, useTypedLoaderData } from "remix-typedjson";
import { AdminDebugTooltip } from "~/components/admin/debugTooltip";
import { CopyableText } from "~/components/primitives/CopyableText";
Expand Down Expand Up @@ -38,14 +37,9 @@ import { ApiKeysPresenter } from "~/presenters/v3/ApiKeysPresenter.server";
import { dashboardLoader } from "~/services/routeBuilders/dashboardBuilder";
import { cn } from "~/utils/cn";
import { docsPath, EnvironmentParamSchema } from "~/utils/pathBuilder";
import { pageMeta } from "~/utils/pageTitle";

export const meta: MetaFunction = () => {
return [
{
title: `API keys | Trigger.dev`,
},
];
};
export const meta = pageMeta("API keys");

export const loader = dashboardLoader(
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ import { requireUserId } from "~/services/session.server";
import { cn } from "~/utils/cn";
import { formatNumber } from "~/utils/numberFormatter";
import { EnvironmentParamSchema, v3BatchesPath, v3BatchRunsPath } from "~/utils/pathBuilder";
import { pageMeta } from "~/utils/pageTitle";

export const meta = pageMeta(({ params }) => [params.batchParam ?? "Batch", "Batches"]);

const BatchParamSchema = EnvironmentParamSchema.extend({
batchParam: z.string(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ExclamationCircleIcon } from "@heroicons/react/20/solid";
import { BookOpenIcon } from "@heroicons/react/24/solid";
import { type MetaFunction, Outlet, useLocation, useNavigation, useParams } from "@remix-run/react";
import { Outlet, useLocation, useNavigation, useParams } from "@remix-run/react";
import { type LoaderFunctionArgs } from "@remix-run/server-runtime";
import { formatDuration } from "@trigger.dev/core/v3/utils/durations";
import { typedjson, useTypedLoaderData } from "remix-typedjson";
Expand Down Expand Up @@ -62,14 +62,9 @@ import {
v3BatchRunsPath,
} from "~/utils/pathBuilder";
import { throwNotFound } from "~/utils/httpErrors";
import { pageMeta } from "~/utils/pageTitle";

export const meta: MetaFunction = () => {
return [
{
title: `Batches | Trigger.dev`,
},
];
};
export const meta = pageMeta("Batches");

export const loader = async ({ request, params }: LoaderFunctionArgs) => {
const userId = await requireUserId(request);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,9 @@ import { ArchiveButton } from "../resources.branches.archive";
import { NewBranchPanel } from "~/routes/resources.branches.create";
import { BranchesOptions } from "~/utils/branches";
import { IconArrowBearRight2 } from "@tabler/icons-react";
import { pageMeta } from "~/utils/pageTitle";

export const meta = pageMeta("Preview branches");

const PurchaseSchema = z.discriminatedUnion("action", [
z.object({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,12 @@ import {
v3RunsPath,
} from "~/utils/pathBuilder";
import { BulkActionService } from "~/v3/services/bulk/BulkActionV2.server";
import { pageMeta } from "~/utils/pageTitle";

export const meta = pageMeta<typeof loader>(({ data, params }) => [
data?.bulkAction?.name || params.bulkActionParam || "Bulk action",
"Bulk actions",
]);

const BulkActionParamSchema = EnvironmentParamSchema.extend({
bulkActionParam: z.string(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { BookOpenIcon, PlusIcon } from "@heroicons/react/20/solid";
import { NoSymbolIcon } from "@heroicons/react/24/solid";
import { Outlet, useParams, type MetaFunction } from "@remix-run/react";
import { Outlet, useParams } from "@remix-run/react";
import { type LoaderFunctionArgs } from "@remix-run/server-runtime";
import { tryCatch } from "@trigger.dev/core";
import { typedjson, useTypedLoaderData } from "remix-typedjson";
Expand Down Expand Up @@ -54,14 +54,9 @@ import {
v3BulkActionPath,
v3CreateBulkActionPath,
} from "~/utils/pathBuilder";
import { pageMeta } from "~/utils/pageTitle";

export const meta: MetaFunction = () => {
return [
{
title: `Bulk actions | Trigger.dev`,
},
];
};
export const meta = pageMeta("Bulk actions");

const SearchParamsSchema = z.object({
page: z.coerce.number().optional(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,7 @@ import {
InformationCircleIcon,
} from "@heroicons/react/20/solid";
import { DialogClose } from "@radix-ui/react-dialog";
import {
Form,
useActionData,
useNavigation,
useSearchParams,
type MetaFunction,
} from "@remix-run/react";
import { Form, useActionData, useNavigation, useSearchParams } from "@remix-run/react";
import { json, type ActionFunctionArgs, type LoaderFunctionArgs } from "@remix-run/server-runtime";
import { tryCatch } from "@trigger.dev/core";
import { useEffect, useState } from "react";
Expand Down Expand Up @@ -74,14 +68,9 @@ import { concurrencyPath, EnvironmentParamSchema, v3BillingPath } from "~/utils/
import { AllocateConcurrencyService } from "~/v3/services/allocateConcurrency.server";
import { SetConcurrencyAddOnService } from "~/v3/services/setConcurrencyAddOn.server";
import { useCurrentPlan } from "../_app.orgs.$organizationSlug/route";
import { pageMeta } from "~/utils/pageTitle";

export const meta: MetaFunction = () => {
return [
{
title: `Manage concurrency | Trigger.dev`,
},
];
};
export const meta = pageMeta("Manage concurrency");

export const loader = async ({ request, params }: LoaderFunctionArgs) => {
const userId = await requireUserId(request);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,12 @@ import { canAccessQueueMetricsUi } from "~/v3/canAccessQueueMetricsUi.server";
import { QueryScopeSchema } from "~/v3/querySchemas";
import { useCurrentPlan } from "../_app.orgs.$organizationSlug/route";
import { MetricWidget } from "../resources.metric";
import { pageMeta } from "~/utils/pageTitle";

export const meta = pageMeta<typeof loader>(({ data }) => [
data?.title ?? "Dashboard",
"Dashboards",
]);

const ParamSchema = EnvironmentParamSchema.extend({
dashboardKey: z.string(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { PlusIcon } from "@heroicons/react/20/solid";
import { Link, type MetaFunction } from "@remix-run/react";
import { Link } from "@remix-run/react";
import { type LoaderFunctionArgs } from "@remix-run/server-runtime";
import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from "react";
import { typedjson, useTypedLoaderData } from "remix-typedjson";
Expand All @@ -18,10 +18,9 @@ import { findEnvironmentBySlug } from "~/models/runtimeEnvironment.server";
import { requireUserId } from "~/services/session.server";
import { cn } from "~/utils/cn";
import { EnvironmentParamSchema, v3BuiltInDashboardPath } from "~/utils/pathBuilder";
import { pageMeta } from "~/utils/pageTitle";

export const meta: MetaFunction = () => {
return [{ title: "Dashboards | Trigger.dev" }];
};
export const meta = pageMeta("Dashboards");

export const loader = async ({ request, params }: LoaderFunctionArgs) => {
const userId = await requireUserId(request);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,12 @@ import {
} from "~/utils/pathBuilder";
import { MetricDashboard } from "../_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.$dashboardKey/route";
import { useCurrentPlan } from "../_app.orgs.$organizationSlug/route";
import { pageMeta } from "~/utils/pageTitle";

export const meta = pageMeta<typeof loader>(({ data }) => [
data?.title ?? "Dashboard",
"Dashboards",
]);

const ParamSchema = EnvironmentParamSchema.extend({
dashboardId: z.string(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,12 @@ import { v3DeploymentParams, v3DeploymentsPath, v3RunsPath } from "~/utils/pathB
import { capitalizeWord } from "~/utils/string";
import { UserTag } from "../_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.deployments/route";
import { DeploymentEventFromString } from "@trigger.dev/core/v3/schemas";
import { pageMeta } from "~/utils/pageTitle";

export const meta = pageMeta(({ params }) => [
params.deploymentParam ?? "Deployment",
"Deployments",
]);

export const loader = async ({ request, params }: LoaderFunctionArgs) => {
const userId = await requireUserId(request);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,7 @@ import {
BookOpenIcon,
NoSymbolIcon,
} from "@heroicons/react/20/solid";
import {
Form,
type MetaFunction,
Outlet,
useLocation,
useNavigate,
useNavigation,
useParams,
} from "@remix-run/react";
import { Form, Outlet, useLocation, useNavigate, useNavigation, useParams } from "@remix-run/react";
import { type LoaderFunctionArgs } from "@remix-run/server-runtime";
import { CogIcon, GitBranchIcon } from "lucide-react";
import { useEffect } from "react";
Expand Down Expand Up @@ -87,14 +79,9 @@ import { compareDeploymentVersions } from "~/v3/utils/deploymentVersions";
import { useAutoRevalidate } from "~/hooks/useAutoRevalidate";
import { env } from "~/env.server";
import { DialogClose } from "@radix-ui/react-dialog";
import { pageMeta } from "~/utils/pageTitle";

export const meta: MetaFunction = () => {
return [
{
title: `Deployments | Trigger.dev`,
},
];
};
export const meta = pageMeta("Deployments");

const SearchParams = z.object({
page: z.coerce.number().optional(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ import { NewBranchPanel } from "~/routes/resources.branches.create";
import { BranchesOptions } from "~/utils/branches";
import { IconArrowBearRight2 } from "@tabler/icons-react";
import { useAutoRevalidate } from "~/hooks/useAutoRevalidate";
import { pageMeta } from "~/utils/pageTitle";

export const meta = pageMeta("Dev branches");

export const loader = async ({ request, params }: LoaderFunctionArgs) => {
const userId = await requireUserId(request);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ import {
import { EnvironmentVariablesRepository } from "~/v3/environmentVariables/environmentVariablesRepository.server";
import { EnvironmentVariableKey } from "~/v3/environmentVariables/repository";
import { findUnauthorizedEnvironmentId } from "~/v3/writableEnvironments";
import { pageMeta } from "~/utils/pageTitle";

export const meta = pageMeta("New environment variable");

const Variable = z.object({
key: EnvironmentVariableKey,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import {
useFetcher,
useNavigation,
useRevalidator,
type MetaFunction,
} from "@remix-run/react";
import { json } from "@remix-run/server-runtime";
import { useVirtualizer } from "@tanstack/react-virtual";
Expand Down Expand Up @@ -88,14 +87,9 @@ import {
shouldSyncEnvVar,
type TriggerEnvironmentType,
} from "~/v3/vercel/vercelProjectIntegrationSchema";
import { pageMeta } from "~/utils/pageTitle";

export const meta: MetaFunction = () => {
return [
{
title: `Environment variables | Trigger.dev`,
},
];
};
export const meta = pageMeta("Environment variables");

type PageVercelIntegration = NonNullable<
Awaited<ReturnType<EnvironmentVariablesPresenter["call"]>>["vercelIntegration"]
Expand Down
Loading
Loading