11import { 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" ;
46import { AdminDebugTooltip } from "~/components/admin/debugTooltip" ;
57import { EnvironmentLabel } from "~/components/environments/EnvironmentLabel" ;
8+ import { Feedback } from "~/components/Feedback" ;
69import { PageBody , PageContainer } from "~/components/layout/AppLayout" ;
710import { Button , LinkButton } from "~/components/primitives/Buttons" ;
811import { Header2 } from "~/components/primitives/Headers" ;
9- import { Input } from "~/components/primitives/Input" ;
1012import { 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" ;
1314import {
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" ;
2722import { useOrganization } from "~/hooks/useOrganizations" ;
28- import { useTextFilter } from "~/hooks/useTextFilter" ;
2923import {
3024 ConcurrencyPresenter ,
31- Environment ,
32- Task ,
25+ type Environment ,
3326} from "~/presenters/v3/ConcurrencyPresenter.server" ;
3427import { requireUserId } from "~/services/session.server" ;
35- import { ProjectParamSchema , docsPath , v3BillingPath } from "~/utils/pathBuilder" ;
28+ import { docsPath , ProjectParamSchema , v3BillingPath } from "~/utils/pathBuilder" ;
3629import { 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
4231export 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
6352export 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