From ef3cdd11ac65fca4f8393cc3f7aa0653cdaf08d0 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 3 Jul 2024 20:13:16 +0530 Subject: [PATCH] feat: ui changes for secret approval group --- .../src/hooks/api/secretApproval/mutation.tsx | 8 +-- .../src/hooks/api/secretApproval/types.ts | 6 +- .../hooks/api/secretApprovalRequest/types.ts | 34 ++++++++-- .../SecretApprovalPolicyList.tsx | 21 +++++-- .../components/SecretApprovalPolicyRow.tsx | 16 ++--- .../components/SecretPolicyForm.tsx | 38 ++++++----- .../SecretApprovalRequest.tsx | 38 +++++------ .../SecretApprovalRequestAction.tsx | 2 +- .../SecretApprovalRequestChanges.tsx | 63 +++++++++---------- 9 files changed, 124 insertions(+), 102 deletions(-) diff --git a/frontend/src/hooks/api/secretApproval/mutation.tsx b/frontend/src/hooks/api/secretApproval/mutation.tsx index e0a8df95da..991111ef99 100644 --- a/frontend/src/hooks/api/secretApproval/mutation.tsx +++ b/frontend/src/hooks/api/secretApproval/mutation.tsx @@ -9,12 +9,12 @@ export const useCreateSecretApprovalPolicy = () => { const queryClient = useQueryClient(); return useMutation<{}, {}, TCreateSecretPolicyDTO>({ - mutationFn: async ({ environment, workspaceId, approvals, approvers, secretPath, name }) => { + mutationFn: async ({ environment, workspaceId, approvals, approverUserIds, secretPath, name }) => { const { data } = await apiRequest.post("/api/v1/secret-approvals", { environment, workspaceId, approvals, - approvers, + approverUserIds, secretPath, name }); @@ -30,10 +30,10 @@ export const useUpdateSecretApprovalPolicy = () => { const queryClient = useQueryClient(); return useMutation<{}, {}, TUpdateSecretPolicyDTO>({ - mutationFn: async ({ id, approvers, approvals, secretPath, name }) => { + mutationFn: async ({ id, approverUserIds, approvals, secretPath, name }) => { const { data } = await apiRequest.patch(`/api/v1/secret-approvals/${id}`, { approvals, - approvers, + approverUserIds, secretPath, name }); diff --git a/frontend/src/hooks/api/secretApproval/types.ts b/frontend/src/hooks/api/secretApproval/types.ts index 38e8d7ee8e..f3b8639f70 100644 --- a/frontend/src/hooks/api/secretApproval/types.ts +++ b/frontend/src/hooks/api/secretApproval/types.ts @@ -7,8 +7,8 @@ export type TSecretApprovalPolicy = { envId: string; environment: WorkspaceEnv; secretPath?: string; - approvers: string[]; approvals: number; + userApprovers: { userId: string }[]; }; export type TGetSecretApprovalPoliciesDTO = { @@ -26,14 +26,14 @@ export type TCreateSecretPolicyDTO = { name?: string; environment: string; secretPath?: string | null; - approvers?: string[]; + approverUserIds?: string[]; approvals?: number; }; export type TUpdateSecretPolicyDTO = { id: string; name?: string; - approvers?: string[]; + approverUserIds?: string[]; secretPath?: string | null; approvals?: number; // for invalidating list diff --git a/frontend/src/hooks/api/secretApprovalRequest/types.ts b/frontend/src/hooks/api/secretApprovalRequest/types.ts index 8c2ba69636..f039cc815e 100644 --- a/frontend/src/hooks/api/secretApprovalRequest/types.ts +++ b/frontend/src/hooks/api/secretApprovalRequest/types.ts @@ -47,10 +47,14 @@ export type TSecretApprovalRequest = { isReplicated?: boolean; slug: string; createdAt: string; - committerId: string; + committerUserId: string; reviewers: { - member: string; + userId: string; status: ApprovalStatus; + email: string; + firstName: string; + lastName: string; + username: string; }[]; workspace: string; environment: string; @@ -58,8 +62,30 @@ export type TSecretApprovalRequest = { secretPath: string; hasMerged: boolean; status: "open" | "close"; - policy: TSecretApprovalPolicy; - statusChangeBy: string; + policy: Omit & { + approvers: { + userId: string; + email: string; + firstName: string; + lastName: string; + username: string; + }[]; + }; + statusChangedByUserId: string; + statusChangedByUser?: { + userId: string; + email: string; + firstName: string; + lastName: string; + username: string; + }; + committerUser: { + userId: string; + email: string; + firstName: string; + lastName: string; + username: string; + }; conflicts: Array<{ secretId: string; op: CommitType.UPDATE }>; commits: ({ // if there is no secret means it was creation diff --git a/frontend/src/views/SecretApprovalPage/components/SecretApprovalPolicyList/SecretApprovalPolicyList.tsx b/frontend/src/views/SecretApprovalPage/components/SecretApprovalPolicyList/SecretApprovalPolicyList.tsx index d3a36988c1..f377f44e96 100644 --- a/frontend/src/views/SecretApprovalPage/components/SecretApprovalPolicyList/SecretApprovalPolicyList.tsx +++ b/frontend/src/views/SecretApprovalPage/components/SecretApprovalPolicyList/SecretApprovalPolicyList.tsx @@ -7,6 +7,8 @@ import { Button, DeleteActionModal, EmptyState, + Modal, + ModalContent, Table, TableContainer, TableSkeleton, @@ -145,13 +147,20 @@ export const SecretApprovalPolicyList = ({ workspaceId }: Props) => { - handlePopUpToggle("secretPolicyForm", isOpen)} - members={members} - editValues={popUp.secretPolicyForm.data as TSecretApprovalPolicy} - /> + onOpenChange={(isOpen) => handlePopUpToggle("secretPolicyForm", isOpen)} + > + + handlePopUpToggle("secretPolicyForm", isOpen)} + members={members} + editValues={popUp.secretPolicyForm.data as TSecretApprovalPolicy} + /> + + { @@ -60,7 +60,7 @@ export const SecretApprovalPolicyRow = ({ } ); } else { - setSelectedApprovers(policy.approvers); + setSelectedApprovers(policy.userApprovers.map(({ userId }) => userId)); } }} > @@ -73,7 +73,9 @@ export const SecretApprovalPolicyRow = ({ > @@ -84,17 +86,17 @@ export const SecretApprovalPolicyRow = ({ Select members that are allowed to approve changes - {members?.map(({ id, user }) => { - const isChecked = selectedApprovers.includes(id); + {members?.map(({ user }) => { + const isChecked = selectedApprovers.includes(user.id); return ( { evt.preventDefault(); setSelectedApprovers((state) => - isChecked ? state.filter((el) => el !== id) : [...state, id] + isChecked ? state.filter((el) => el !== user.id) : [...state, user.id] ); }} - key={`create-policy-members-${id}`} + key={`create-policy-members-${user.id}`} iconPos="right" icon={isChecked && } > diff --git a/frontend/src/views/SecretApprovalPage/components/SecretApprovalPolicyList/components/SecretPolicyForm.tsx b/frontend/src/views/SecretApprovalPage/components/SecretApprovalPolicyList/components/SecretPolicyForm.tsx index db59761c11..b0db2affd5 100644 --- a/frontend/src/views/SecretApprovalPage/components/SecretApprovalPolicyList/components/SecretPolicyForm.tsx +++ b/frontend/src/views/SecretApprovalPage/components/SecretApprovalPolicyList/components/SecretPolicyForm.tsx @@ -1,4 +1,3 @@ -import { useEffect } from "react"; import { Controller, useForm } from "react-hook-form"; import { faCheckCircle } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; @@ -15,8 +14,6 @@ import { DropdownMenuTrigger, FormControl, Input, - Modal, - ModalContent, Select, SelectItem } from "@app/components/v2"; @@ -40,9 +37,9 @@ const formSchema = z name: z.string().optional(), secretPath: z.string().optional().nullable(), approvals: z.number().min(1), - approvers: z.string().array().min(1) + approverUserIds: z.string().array().min(1) }) - .refine((data) => data.approvals <= data.approvers.length, { + .refine((data) => data.approvals <= data.approverUserIds.length, { path: ["approvals"], message: "The number of approvals should be lower than the number of approvers." }); @@ -50,7 +47,6 @@ const formSchema = z type TFormSchema = z.infer; export const SecretPolicyForm = ({ - isOpen, onToggle, members = [], workspaceId, @@ -59,20 +55,22 @@ export const SecretPolicyForm = ({ const { control, handleSubmit, - reset, watch, formState: { isSubmitting } } = useForm({ resolver: zodResolver(formSchema), - values: editValues ? { ...editValues, environment: editValues.environment.slug } : undefined + values: editValues + ? { + ...editValues, + approverUserIds: editValues.userApprovers.map(({ userId }) => userId), + environment: editValues.environment.slug + } + : undefined }); const { currentWorkspace } = useWorkspace(); const selectedEnvironment = watch("environment"); const environments = currentWorkspace?.environments || []; - useEffect(() => { - if (!isOpen) reset({}); - }, [isOpen]); const isEditMode = Boolean(editValues); @@ -131,8 +129,6 @@ export const SecretPolicyForm = ({ }; return ( - -