Skip to content

Commit 34e4b29

Browse files
committed
Only show the environments, not tasks. Renamed to “Concurrency limits”
1 parent 1571f35 commit 34e4b29

File tree

2 files changed

+10
-139
lines changed

2 files changed

+10
-139
lines changed

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

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,12 @@ import {
55
displayableEnvironment,
66
type DisplayableInputEnvironment,
77
} from "~/models/runtimeEnvironment.server";
8-
import { getAllTaskIdentifiers } from "~/models/task.server";
98
import { type User } from "~/models/user.server";
109
import { getLimit } from "~/services/platform.v3.server";
1110
import { sortEnvironments } from "~/utils/environmentSort";
1211
import { concurrencyTracker } from "~/v3/services/taskRunConcurrencyTracker.server";
1312
import { BasePresenter } from "./basePresenter.server";
1413

15-
export type Task = Awaited<ReturnType<ConcurrencyPresenter["taskConcurrency"]>>[number];
1614
export type Environment = Awaited<
1715
ReturnType<ConcurrencyPresenter["environmentConcurrency"]>
1816
>[number];
@@ -56,52 +54,11 @@ export class ConcurrencyPresenter extends BasePresenter {
5654
throw new Error(`Project not found: ${projectSlug}`);
5755
}
5856

59-
const limit = await getLimit(project.organizationId, "concurrentRuns", 10);
60-
6157
return {
6258
environments: this.environmentConcurrency(project.id, userId, project.environments),
63-
tasks: this.taskConcurrency(project.id),
64-
limit,
6559
};
6660
}
6761

68-
async taskConcurrency(projectId: string) {
69-
//get all possible tasks
70-
const possibleTasks = await getAllTaskIdentifiers(this._replica, projectId);
71-
const concurrencies = await concurrencyTracker.taskConcurrentRunCounts(
72-
projectId,
73-
possibleTasks.map((task) => task.slug)
74-
);
75-
const queued = await this._replica.$queryRaw<
76-
{
77-
taskIdentifier: string;
78-
count: BigInt;
79-
}[]
80-
>`
81-
SELECT
82-
tr."taskIdentifier",
83-
COUNT(*)
84-
FROM
85-
${sqlDatabaseSchema}."TaskRun" as tr
86-
WHERE
87-
tr."taskIdentifier" IN (${Prisma.join(possibleTasks.map((task) => task.slug))})
88-
AND tr."projectId" = ${projectId}
89-
AND tr."status" = ANY(ARRAY[${Prisma.join(QUEUED_STATUSES)}]::\"TaskRunStatus\"[])
90-
GROUP BY
91-
tr."taskIdentifier"
92-
ORDER BY
93-
tr."taskIdentifier" ASC`;
94-
95-
return possibleTasks
96-
.map((task) => ({
97-
identifier: task.slug,
98-
triggerSource: task.triggerSource,
99-
concurrency: concurrencies[task.slug] ?? 0,
100-
queued: Number(queued.find((q) => q.taskIdentifier === task.slug)?.count ?? 0),
101-
}))
102-
.sort((a, b) => a.identifier.localeCompare(b.identifier));
103-
}
104-
10562
async environmentConcurrency(
10663
projectId: string,
10764
userId: string,
Lines changed: 10 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,32 @@
11
import { ArrowUpCircleIcon, BookOpenIcon } from "@heroicons/react/20/solid";
2-
import { LoaderFunctionArgs } from "@remix-run/server-runtime";
3-
import { typeddefer, typedjson, UseDataFunctionReturn, useTypedLoaderData } from "remix-typedjson";
2+
import { Await } from "@remix-run/react";
3+
import { type LoaderFunctionArgs } from "@remix-run/server-runtime";
4+
import { Suspense } from "react";
5+
import { typeddefer, useTypedLoaderData } from "remix-typedjson";
46
import { AdminDebugTooltip } from "~/components/admin/debugTooltip";
57
import { EnvironmentLabel } from "~/components/environments/EnvironmentLabel";
8+
import { Feedback } from "~/components/Feedback";
69
import { PageBody, PageContainer } from "~/components/layout/AppLayout";
710
import { Button, LinkButton } from "~/components/primitives/Buttons";
811
import { Header2 } from "~/components/primitives/Headers";
9-
import { Input } from "~/components/primitives/Input";
1012
import { NavBar, PageAccessories, PageTitle } from "~/components/primitives/PageHeader";
11-
import { Paragraph } from "~/components/primitives/Paragraph";
12-
import * as Property from "~/components/primitives/PropertyTable";
13+
import { Spinner } from "~/components/primitives/Spinner";
1314
import {
1415
Table,
15-
TableBlankRow,
1616
TableBody,
1717
TableCell,
1818
TableHeader,
1919
TableHeaderCell,
2020
TableRow,
2121
} from "~/components/primitives/Table";
22-
import { SimpleTooltip } from "~/components/primitives/Tooltip";
23-
import {
24-
taskTriggerSourceDescription,
25-
TaskTriggerSourceIcon,
26-
} from "~/components/runs/v3/TaskTriggerSource";
2722
import { useOrganization } from "~/hooks/useOrganizations";
28-
import { useTextFilter } from "~/hooks/useTextFilter";
2923
import {
3024
ConcurrencyPresenter,
31-
Environment,
32-
Task,
25+
type Environment,
3326
} from "~/presenters/v3/ConcurrencyPresenter.server";
3427
import { requireUserId } from "~/services/session.server";
35-
import { ProjectParamSchema, docsPath, v3BillingPath } from "~/utils/pathBuilder";
28+
import { docsPath, ProjectParamSchema, v3BillingPath } from "~/utils/pathBuilder";
3629
import { useCurrentPlan } from "../_app.orgs.$organizationSlug/route";
37-
import { Feedback } from "~/components/Feedback";
38-
import { Suspense } from "react";
39-
import { Await } from "@remix-run/react";
40-
import { Spinner } from "~/components/primitives/Spinner";
4130

4231
export const loader = async ({ request, params }: LoaderFunctionArgs) => {
4332
const userId = await requireUserId(request);
@@ -61,15 +50,15 @@ export const loader = async ({ request, params }: LoaderFunctionArgs) => {
6150
};
6251

6352
export default function Page() {
64-
const { environments, tasks, limit } = useTypedLoaderData<typeof loader>();
53+
const { environments } = useTypedLoaderData<typeof loader>();
6554

6655
const organization = useOrganization();
6756
const plan = useCurrentPlan();
6857

6958
return (
7059
<PageContainer>
7160
<NavBar>
72-
<PageTitle title="Concurrency" />
61+
<PageTitle title="Concurrency limits" />
7362
<PageAccessories>
7463
<AdminDebugTooltip />
7564
<LinkButton
@@ -125,14 +114,6 @@ export default function Page() {
125114
</TableBody>
126115
</Table>
127116
</div>
128-
<div>
129-
<Header2 spacing>Tasks</Header2>
130-
<Suspense fallback={<Spinner />}>
131-
<Await resolve={tasks} errorElement={<p>Error loading tasks</p>}>
132-
{(tasks) => <TaskTable tasks={tasks} />}
133-
</Await>
134-
</Suspense>
135-
</div>
136117
</div>
137118
</PageBody>
138119
</PageContainer>
@@ -155,70 +136,3 @@ function EnvironmentsTable({ environments }: { environments: Environment[] }) {
155136
</>
156137
);
157138
}
158-
159-
function TaskTable({ tasks }: { tasks: Task[] }) {
160-
const { filterText, setFilterText, filteredItems } = useTextFilter<Task>({
161-
items: tasks,
162-
filter: (task, text) => {
163-
if (task.identifier.toLowerCase().includes(text.toLowerCase())) {
164-
return true;
165-
}
166-
167-
if (task.triggerSource === "SCHEDULED" && "scheduled".includes(text.toLowerCase())) {
168-
return true;
169-
}
170-
171-
return false;
172-
},
173-
});
174-
175-
return (
176-
<>
177-
<div className="h-8">
178-
<Input
179-
placeholder="Search tasks"
180-
variant="small"
181-
icon="search"
182-
fullWidth={true}
183-
value={filterText}
184-
onChange={(e) => setFilterText(e.target.value)}
185-
autoFocus
186-
/>
187-
</div>
188-
<Table>
189-
<TableHeader>
190-
<TableRow>
191-
<TableHeaderCell>Task ID</TableHeaderCell>
192-
<TableHeaderCell alignment="right">Queued</TableHeaderCell>
193-
<TableHeaderCell alignment="right">Running</TableHeaderCell>
194-
</TableRow>
195-
</TableHeader>
196-
<TableBody>
197-
{filteredItems.length > 0 ? (
198-
filteredItems.map((task) => (
199-
<TableRow key={task.identifier}>
200-
<TableCell>
201-
<div className="flex items-center gap-2">
202-
<SimpleTooltip
203-
button={<TaskTriggerSourceIcon source={task.triggerSource} />}
204-
content={taskTriggerSourceDescription(task.triggerSource)}
205-
/>
206-
<span>{task.identifier}</span>
207-
</div>
208-
</TableCell>
209-
<TableCell alignment="right">{task.queued}</TableCell>
210-
<TableCell alignment="right">{task.concurrency}</TableCell>
211-
</TableRow>
212-
))
213-
) : (
214-
<TableBlankRow colSpan={3}>
215-
<Paragraph variant="small" className="flex items-center justify-center">
216-
{tasks.length > 0 ? "No tasks match your filters" : "No tasks"}
217-
</Paragraph>
218-
</TableBlankRow>
219-
)}
220-
</TableBody>
221-
</Table>
222-
</>
223-
);
224-
}

0 commit comments

Comments
 (0)