Skip to content

Commit 2c2cb89

Browse files
committed
fix bug where we are setting all jobs to canceled
1 parent 54eed25 commit 2c2cb89

File tree

15 files changed

+1157
-23
lines changed

15 files changed

+1157
-23
lines changed

apps/web/app/routes.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ export default [
3636
":environmentId/resources",
3737
"routes/ws/environments/page.$environmentId.resources.tsx",
3838
),
39+
route(
40+
":environmentId/settings",
41+
"routes/ws/environments/settings/_layout.tsx",
42+
[route("", "routes/ws/environments/settings/general.tsx")],
43+
),
3944
]),
4045

4146
route("resources", "routes/ws/resources.tsx"),

apps/web/app/routes/ws/deployments/_components/CelExpiressionInput.tsx renamed to apps/web/app/routes/ws/_components/CelExpiressionInput.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,12 @@ const CEL_OBJECTS: CELObject[] = [
5959
enabled: true,
6060
documentation: "Target resource for deployment operations",
6161
fields: [
62+
{
63+
label: "name",
64+
type: "string",
65+
documentation: "The name of the resource",
66+
isString: true,
67+
},
6268
{
6369
label: "kind",
6470
type: "string",

apps/web/app/routes/ws/deployments/_components/CreateEnvironmentDialog.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import {
3737
} from "~/components/ui/select";
3838
import { Textarea } from "~/components/ui/textarea";
3939
import { useWorkspace } from "~/components/WorkspaceProvider";
40-
import CelExpressionInput from "./CelExpiressionInput";
40+
import CelExpressionInput from "../../_components/CelExpiressionInput";
4141

4242
// Validation schema for environment creation
4343
const createEnvironmentSchema = z.object({

apps/web/app/routes/ws/deployments/settings/_layout.tsx

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,4 @@
1-
import {
2-
Link,
3-
NavLink,
4-
Outlet,
5-
useLocation,
6-
useNavigate,
7-
useParams,
8-
} from "react-router";
1+
import { Link, NavLink, Outlet, useLocation, useParams } from "react-router";
92

103
import {
114
Breadcrumb,

apps/web/app/routes/ws/environments/page.$environmentId.resources.tsx

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,58 @@
1+
import { useState } from "react";
12
import { Link } from "react-router";
3+
import { useDebounce } from "react-use";
4+
import { toast } from "sonner";
25

6+
import { trpc } from "~/api/trpc";
37
import {
48
Breadcrumb,
59
BreadcrumbItem,
610
BreadcrumbList,
711
BreadcrumbPage,
812
BreadcrumbSeparator,
913
} from "~/components/ui/breadcrumb";
14+
import { Button } from "~/components/ui/button";
1015
import { Separator } from "~/components/ui/separator";
1116
import { SidebarTrigger } from "~/components/ui/sidebar";
1217
import { useWorkspace } from "~/components/WorkspaceProvider";
18+
import CelExpressionInput from "../_components/CelExpiressionInput";
19+
import { ResourceRow } from "../resources/_components/ResourceRow";
1320
import { useEnvironment } from "./_components/EnvironmentProvider";
1421
import { EnvironmentsNavbarTabs } from "./_components/EnvironmentsNavbarTabs";
1522

1623
export default function EnvironmentResources() {
1724
const { workspace } = useWorkspace();
1825
const { environment } = useEnvironment();
26+
27+
const [filter, setFilter] = useState(
28+
environment.resourceSelector?.cel ?? "true",
29+
);
30+
const [filterDebounced, setFilterDebounced] = useState(filter);
31+
useDebounce(
32+
() => {
33+
setFilterDebounced(filter);
34+
},
35+
1_000,
36+
[filter],
37+
);
38+
const resourcesQuery = trpc.resource.list.useQuery({
39+
workspaceId: workspace.id,
40+
selector: { cel: filterDebounced },
41+
limit: 200,
42+
offset: 0,
43+
});
44+
45+
const updateEnvironment = trpc.environment.update.useMutation();
46+
const onResourceSelectorChange = async (filter: string) => {
47+
setFilter(filter);
48+
await updateEnvironment.mutateAsync({
49+
workspaceId: workspace.id,
50+
environmentId: environment.id,
51+
data: { resourceSelectorCel: filter },
52+
});
53+
};
54+
55+
const resources = resourcesQuery.data?.items ?? [];
1956
return (
2057
<>
2158
<header className="flex h-16 shrink-0 items-center justify-between gap-2 border-b pr-4">
@@ -49,6 +86,31 @@ export default function EnvironmentResources() {
4986
</div>
5087
<EnvironmentsNavbarTabs environmentId={environment.id} />
5188
</header>
89+
90+
<div className="flex items-center justify-between gap-2 border-b p-2">
91+
<div className="flex-1 rounded-md border border-input p-0.5">
92+
<CelExpressionInput
93+
height="2.5rem"
94+
value={filter}
95+
onChange={(v) => setFilter(v ?? "true")}
96+
/>
97+
</div>
98+
<Button
99+
className="h-[2.5rem]"
100+
onClick={async () => {
101+
await onResourceSelectorChange(filter);
102+
toast.success(
103+
"Environment resource selector updated successfully.",
104+
);
105+
}}
106+
>
107+
Save
108+
</Button>
109+
</div>
110+
111+
{resources.map((resource) => (
112+
<ResourceRow key={resource.identifier} resource={resource} />
113+
))}
52114
</>
53115
);
54116
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import { Link, NavLink, Outlet, useLocation } from "react-router";
2+
3+
import {
4+
Breadcrumb,
5+
BreadcrumbItem,
6+
BreadcrumbList,
7+
BreadcrumbPage,
8+
BreadcrumbSeparator,
9+
} from "~/components/ui/breadcrumb";
10+
import { buttonVariants } from "~/components/ui/button";
11+
import { Separator } from "~/components/ui/separator";
12+
import { SidebarTrigger } from "~/components/ui/sidebar";
13+
import { useWorkspace } from "~/components/WorkspaceProvider";
14+
import { useEnvironment } from "../_components/EnvironmentProvider";
15+
16+
export default function EnvironmentsSettingsLayout() {
17+
const { workspace } = useWorkspace();
18+
const { environment } = useEnvironment();
19+
const path = useLocation();
20+
const baseUrl = `/${workspace.slug}/environments/${environment.id}/settings`;
21+
22+
const isActive = (pathname: string) => path.pathname.startsWith(pathname);
23+
24+
const defaultLinkStyle = buttonVariants({
25+
variant: "ghost",
26+
className: "w-full justify-start text-muted-foreground",
27+
});
28+
29+
const activeLinkStyle = buttonVariants({
30+
variant: "ghost",
31+
className: "w-full justify-start bg-muted text-primary",
32+
});
33+
34+
return (
35+
<>
36+
<header className="flex h-16 shrink-0 items-center justify-between gap-2 border-b pr-4">
37+
<div className="flex items-center gap-2 px-4">
38+
<SidebarTrigger className="-ml-1" />
39+
<Separator
40+
orientation="vertical"
41+
className="mr-2 data-[orientation=vertical]:h-4"
42+
/>
43+
<Breadcrumb>
44+
<BreadcrumbList>
45+
<BreadcrumbItem>
46+
<BreadcrumbItem>
47+
<Link to={`/${workspace.slug}/environments`}>
48+
Environments
49+
</Link>
50+
</BreadcrumbItem>
51+
<BreadcrumbSeparator />
52+
<BreadcrumbItem>
53+
<Link
54+
to={`/${workspace.slug}/environments/${environment.id}`}
55+
>
56+
{environment.name}
57+
</Link>
58+
</BreadcrumbItem>
59+
<BreadcrumbSeparator />
60+
<BreadcrumbPage>Settings</BreadcrumbPage>
61+
</BreadcrumbItem>
62+
</BreadcrumbList>
63+
</Breadcrumb>
64+
</div>
65+
66+
<div className="flex items-center gap-4">
67+
{/* <DeploymentsNavbarTabs deploymentId={deployment.id} /> */}
68+
</div>
69+
</header>
70+
<div className="container mx-auto flex max-w-6xl gap-8 py-20">
71+
<div className="flex flex-shrink-0 flex-col gap-2">
72+
<NavLink
73+
to={`${baseUrl}`}
74+
className={
75+
isActive(`${baseUrl}`) ? activeLinkStyle : defaultLinkStyle
76+
}
77+
>
78+
General
79+
</NavLink>
80+
<NavLink
81+
to={`${baseUrl}/job-agent`}
82+
className={
83+
isActive(`${baseUrl}/job-agent`)
84+
? activeLinkStyle
85+
: defaultLinkStyle
86+
}
87+
>
88+
Job Agent
89+
</NavLink>
90+
<NavLink
91+
to={`${baseUrl}/hooks`}
92+
className={
93+
isActive(`${baseUrl}/hooks`) ? activeLinkStyle : defaultLinkStyle
94+
}
95+
>
96+
Hooks
97+
</NavLink>
98+
</div>
99+
<div className="flex-grow">
100+
<Outlet />
101+
</div>
102+
</div>
103+
</>
104+
);
105+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default function EnvironmentSettingsGeneral() {
2+
return <div>EnvironmentSettingsGeneral</div>;
3+
}

apps/workspace-engine/pkg/events/handler/redeploy/redeploy.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,4 @@ func HandleReleaseTargetDeploy(ctx context.Context, ws *workspace.Workspace, eve
2626
}
2727

2828
return nil
29-
}
29+
}

apps/workspace-engine/pkg/oapi/oapi.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ func (j *Job) IsInProcessingState() bool {
8181
return j.Status == InProgress || j.Status == ActionRequired || j.Status == Pending
8282
}
8383

84+
func (j *Job) IsInTerminalState() bool {
85+
return j.Status == Cancelled || j.Status == Skipped || j.Status == Successful || j.Status == Failure || j.Status == InvalidJobAgent || j.Status == InvalidIntegration || j.Status == ExternalRunNotFound
86+
}
87+
8488
func (v *Value) GetType() (string, error) {
8589
// Try ReferenceValue - check that required fields are present
8690
if rv, err := v.AsReferenceValue(); err == nil {

apps/workspace-engine/pkg/server/openapi/jobs/jobs.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,4 +98,4 @@ func (s *Jobs) GetJobs(c *gin.Context, workspaceId string, params oapi.GetJobsPa
9898
"limit": limit,
9999
"items": jobsWithRelease,
100100
})
101-
}
101+
}

0 commit comments

Comments
 (0)