diff --git a/apps/webapp/app/models/job.server.ts b/apps/webapp/app/models/job.server.ts index 61d18265c..f8ecd8911 100644 --- a/apps/webapp/app/models/job.server.ts +++ b/apps/webapp/app/models/job.server.ts @@ -6,13 +6,13 @@ export type { JobRunStatus } from ".prisma/client"; export function getJob({ userId, - id, -}: Pick & { + slug, +}: Pick & { userId: User["id"]; }) { //just the very basic info because we already fetched it for the Jobs list return prisma.job.findFirst({ select: { id: true, title: true }, - where: { id, organization: { members: { some: { userId } } } }, + where: { slug, organization: { members: { some: { userId } } } }, }); } diff --git a/apps/webapp/app/presenters/RunListPresenter.server.ts b/apps/webapp/app/presenters/RunListPresenter.server.ts index 01739840f..300d5cb8c 100644 --- a/apps/webapp/app/presenters/RunListPresenter.server.ts +++ b/apps/webapp/app/presenters/RunListPresenter.server.ts @@ -6,7 +6,7 @@ export type Direction = z.infer; type RunListOptions = { userId: string; - jobId: string; + jobSlug: string; direction?: Direction; cursor?: string; }; @@ -24,7 +24,7 @@ export class RunListPresenter { public async call({ userId, - jobId, + jobSlug, direction = "forward", cursor, }: RunListOptions) { @@ -57,7 +57,9 @@ export class RunListPresenter { }, }, where: { - jobId, + job: { + slug: jobSlug, + }, organization: { members: { some: { userId } } }, environment: { OR: [ diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam._index/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam._index/route.tsx index 73a72fc26..bd3e8459d 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam._index/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam._index/route.tsx @@ -9,9 +9,6 @@ import { Handle } from "~/utils/handle"; import { ListPagination } from "./ListPagination"; import { useNavigation } from "@remix-run/react"; -//todo defer the run list query -//todo live show when there are new items in the list - export const DirectionSchema = z.union([ z.literal("forward"), z.literal("backward"), @@ -35,7 +32,7 @@ export const loader = async ({ request, params }: LoaderArgs) => { const presenter = new RunListPresenter(); const list = await presenter.call({ userId, - jobId: jobParam, + jobSlug: jobParam, direction: searchParams.direction, cursor: searchParams.cursor, }); diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam.runs.$runParam.stream/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam.runs.$runParam.stream/route.tsx index 44340fd97..45592afed 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam.runs.$runParam.stream/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam.runs.$runParam.stream/route.tsx @@ -25,6 +25,9 @@ export async function loader({ request, params }: LoaderArgs) { if (run.completedAt) { return new Response(null, { status: 200, + headers: { + "Content-Type": "text/event-stream", + }, }); } diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam.runs.$runParam/TaskCardSkeleton.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam.runs.$runParam/TaskCardSkeleton.tsx index 19991d111..f682fdbeb 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam.runs.$runParam/TaskCardSkeleton.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam.runs.$runParam/TaskCardSkeleton.tsx @@ -1,20 +1,24 @@ +import { RunPanel, RunPanelBody, RunPanelHeader } from "./RunCard"; + export function TaskCardSkeleton() { return ( -
-
-
+ + + } + /> +
-
+
-
-
-
-
+
-
-
+ + ); } diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam.runs.$runParam/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam.runs.$runParam/route.tsx index 3f1c72ced..38633e0d4 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam.runs.$runParam/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam.runs.$runParam/route.tsx @@ -92,7 +92,7 @@ export const loader = async ({ request, params }: LoaderArgs) => { runEventPath( { slug: organizationSlug }, { slug: projectParam }, - { id: jobParam }, + { slug: jobParam }, { id: runParam }, run.event.id ) @@ -391,7 +391,14 @@ function BlankTasks({ case "WAITING": case "PENDING": case "RUNNING": - return ; + return ( +
+ + Waiting for tasks… + + +
+ ); default: return ( There were no tasks for this run. diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam/route.tsx index 1be6225dc..f7a26e248 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam/route.tsx @@ -37,7 +37,7 @@ export const loader = async ({ request, params }: LoaderArgs) => { const job = await getJob({ userId, - id: jobParam, + slug: jobParam, }); if (job === null) { diff --git a/apps/webapp/app/utils/pathBuilder.ts b/apps/webapp/app/utils/pathBuilder.ts index bf690aa11..64e4f0e9e 100644 --- a/apps/webapp/app/utils/pathBuilder.ts +++ b/apps/webapp/app/utils/pathBuilder.ts @@ -5,7 +5,7 @@ import type { Project } from "~/models/project.server"; type OrgForPath = Pick; type ProjectForPath = Pick; -type JobForPath = Pick; +type JobForPath = Pick; type RunForPath = Pick; type ApiConnectionClientForPath = Pick; @@ -135,7 +135,7 @@ export function jobSettingsPath( } export function jobParam(job: JobForPath) { - return job.id; + return job.slug; } // Run