diff --git a/apps/webservice/src/app/[workspaceSlug]/_components/environment-policy-drawer/DeploymentControl.tsx b/apps/webservice/src/app/[workspaceSlug]/_components/environment-policy-drawer/DeploymentControl.tsx
index 537918115..9cb69dd9e 100644
--- a/apps/webservice/src/app/[workspaceSlug]/_components/environment-policy-drawer/DeploymentControl.tsx
+++ b/apps/webservice/src/app/[workspaceSlug]/_components/environment-policy-drawer/DeploymentControl.tsx
@@ -1,8 +1,6 @@
import type * as SCHEMA from "@ctrlplane/db/schema";
-import type { VersionCheck } from "@ctrlplane/validators/environment-policies";
import React from "react";
import _ from "lodash";
-import { validRange } from "semver";
import { z } from "zod";
import { Button } from "@ctrlplane/ui/button";
@@ -18,99 +16,41 @@ import {
} from "@ctrlplane/ui/form";
import { Input } from "@ctrlplane/ui/input";
import { RadioGroup, RadioGroupItem } from "@ctrlplane/ui/radio-group";
-import {
- isFilterCheck,
- isNoneCheck,
- isRegexCheck,
- isSemverCheck,
-} from "@ctrlplane/validators/environment-policies";
import {
defaultCondition,
- isValidReleaseCondition,
+ isEmptyCondition,
releaseCondition,
} from "@ctrlplane/validators/releases";
import { api } from "~/trpc/react";
import { ReleaseConditionRender } from "../release-condition/ReleaseConditionRender";
-const isValidRegex = (str: string) => {
- try {
- new RegExp(str);
- return true;
- } catch {
- return false;
- }
-};
-
-const filterSchema = z
- .object({
- evaluateWith: z.literal("regex"),
- evaluate: z.string().refine(isValidRegex, {
- message: "Invalid regex pattern",
- }),
- })
- .or(
- z.object({
- evaluateWith: z.literal("none"),
- evaluate: z.null(),
- }),
- )
- .or(
- z.object({
- evaluateWith: z.literal("semver"),
- evaluate: z
- .string()
- .refine((s) => validRange(s) !== null, "Invalid semver range"),
- }),
- )
- .or(
- z.object({
- evaluateWith: z.literal("filter"),
- evaluate: releaseCondition.refine(isValidReleaseCondition, {
- message: "Invalid release condition",
- }),
- }),
- );
-
-const schema = z
- .object({
- concurrencyType: z.enum(["all", "some"]),
- concurrencyLimit: z.number().min(1, "Must be a positive number"),
- })
- .and(filterSchema);
+const schema = z.object({
+ concurrencyType: z.enum(["all", "some"]),
+ concurrencyLimit: z.number().min(1, "Must be a positive number"),
+ releaseFilter: releaseCondition.nullable(),
+});
export const DeploymentControl: React.FC<{
environmentPolicy: SCHEMA.EnvironmentPolicy;
}> = ({ environmentPolicy }) => {
- const check: VersionCheck = { ...environmentPolicy };
- const defaultValues = _.merge(
- {},
- environmentPolicy,
- isFilterCheck(check) && { evaluate: check.evaluate },
- isNoneCheck(check) && { evaluate: check.evaluate },
- isSemverCheck(check) && { evaluate: check.evaluate },
- isRegexCheck(check) && { evaluate: check.evaluate },
- );
- const form = useForm({ schema, defaultValues });
- const { evaluateWith, evaluate } = form.watch();
+ const form = useForm({ schema, defaultValues: environmentPolicy });
const updatePolicy = api.environment.policy.update.useMutation();
const utils = api.useUtils();
const { id, systemId } = environmentPolicy;
- const onSubmit = form.handleSubmit((data) =>
+ const onSubmit = form.handleSubmit((data) => {
+ const releaseFilter =
+ data.releaseFilter != null && isEmptyCondition(data.releaseFilter)
+ ? null
+ : data.releaseFilter;
updatePolicy
- .mutateAsync({ id, data })
+ .mutateAsync({ id, data: { ...data, releaseFilter } })
.then(() => form.reset(data))
.then(() => utils.environment.policy.byId.invalidate(id))
- .then(() => utils.environment.policy.bySystemId.invalidate(systemId)),
- );
-
- const onEvaluateChange = (v: string) => {
- if (v === "none") form.setValue("evaluate", null);
- if (v === "filter") form.setValue("evaluate", defaultCondition);
- if (v === "regex" || v === "semver") form.setValue("evaluate", "");
- };
+ .then(() => utils.environment.policy.bySystemId.invalidate(systemId));
+ });
const { concurrencyLimit } = form.watch();
@@ -178,112 +118,27 @@ export const DeploymentControl: React.FC<{
)}
/>
-
+ />