diff --git a/frontend/src/lib/fn/string.ts b/frontend/src/lib/fn/string.ts index 6b2842701..a733308b7 100644 --- a/frontend/src/lib/fn/string.ts +++ b/frontend/src/lib/fn/string.ts @@ -8,6 +8,11 @@ export const formatReservedPaths = (secretPath: string) => { return secretPath; }; +export const parsePathFromReplicatedPath = (secretPath: string) => { + const i = secretPath.indexOf(ReservedFolders.SecretReplication); + return secretPath.slice(0, i); +}; + export const camelCaseToSpaces = (input: string) => { return input.replace(/([a-z])([A-Z])/g, "$1 $2"); }; diff --git a/frontend/src/pages/secret-manager/SecretApprovalsPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx b/frontend/src/pages/secret-manager/SecretApprovalsPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx index 1de35b528..ca0e598a2 100644 --- a/frontend/src/pages/secret-manager/SecretApprovalsPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx +++ b/frontend/src/pages/secret-manager/SecretApprovalsPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx @@ -224,8 +224,7 @@ export const SecretApprovalRequest = () => { createdAt, reviewers, status, - committerUser, - isReplicated: isReplication + committerUser } = secretApproval; const isReviewed = reviewers.some( ({ status: reviewStatus, userId }) => @@ -244,13 +243,15 @@ export const SecretApprovalRequest = () => { >
- {generateCommitText(commits)} + {secretApproval.isReplicated + ? `${commits.length} secret pending import` + : generateCommitText(commits)} #{secretApproval.slug}
Opened {formatDistance(new Date(createdAt), new Date())} ago by{" "} {committerUser?.firstName || ""} {committerUser?.lastName || ""} ( - {committerUser?.email}){isReplication && " via replication"} + {committerUser?.email}) {!isReviewed && status === "open" && " - Review required"} diff --git a/frontend/src/pages/secret-manager/SecretApprovalsPage/components/SecretApprovalRequest/components/SecretApprovalRequestChangeItem.tsx b/frontend/src/pages/secret-manager/SecretApprovalsPage/components/SecretApprovalRequest/components/SecretApprovalRequestChangeItem.tsx index 43a729bd8..806cda25d 100644 --- a/frontend/src/pages/secret-manager/SecretApprovalsPage/components/SecretApprovalRequest/components/SecretApprovalRequestChangeItem.tsx +++ b/frontend/src/pages/secret-manager/SecretApprovalsPage/components/SecretApprovalRequest/components/SecretApprovalRequestChangeItem.tsx @@ -12,7 +12,7 @@ import { } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { Tag, Tooltip } from "@app/components/v2"; +import { SecretInput, Tag, Tooltip } from "@app/components/v2"; import { CommitType, SecretV3Raw, TSecretApprovalSecChange, WsTag } from "@app/hooks/api/types"; export type Props = { @@ -86,10 +86,10 @@ export const SecretApprovalRequestChangeItem = ({ {op === CommitType.UPDATE || op === CommitType.DELETE ? (
- Legacy Secret + Previous Secret
- Deprecated + Previous
@@ -104,27 +104,22 @@ export const SecretApprovalRequestChangeItem = ({ Rotated Secret value will not be affected ) : ( -
setIsOldSecretValueVisible(!isOldSecretValueVisible)} - className="relative flex max-w-[100vh] flex-row items-center justify-between rounded-md border border-mineshaft-500 bg-mineshaft-900 px-2" - > +
+
setIsOldSecretValueVisible(!isOldSecretValueVisible)} > - {isOldSecretValueVisible - ? secretVersion?.secretValue || "EMPTY" - : secretVersion?.secretValue - ? secretVersion?.secretValue?.split("").map(() => "•") - : "EMPTY"}{" "} +
- {secretVersion?.secretValue && ( -
- -
- )}
)}
@@ -191,8 +186,7 @@ export const SecretApprovalRequestChangeItem = ({
) : (
- {" "} - Secret not existent in the previous version. + Secret did not exist in the previous version.
)} {op === CommitType.UPDATE || op === CommitType.CREATE ? ( @@ -216,27 +210,22 @@ export const SecretApprovalRequestChangeItem = ({ Rotated Secret value will not be affected ) : ( -
setIsNewSecretValueVisible(!isNewSecretValueVisible)} - className="relative flex max-w-[100vh] flex-row items-center justify-between rounded-md border border-mineshaft-500 bg-mineshaft-900 px-2" - > +
+
setIsNewSecretValueVisible(!isNewSecretValueVisible)} > - {isNewSecretValueVisible - ? newVersion?.secretValue || "EMPTY" - : newVersion?.secretValue - ? newVersion?.secretValue?.split("").map(() => "•") - : "EMPTY"}{" "} +
- {newVersion?.secretValue && ( -
- -
- )}
)}
@@ -302,7 +291,7 @@ export const SecretApprovalRequestChangeItem = ({ ) : (
{" "} - Secret not existent in the new version. + Secret did not exist in the previous version.
)}
diff --git a/frontend/src/pages/secret-manager/SecretApprovalsPage/components/SecretApprovalRequest/components/SecretApprovalRequestChanges.tsx b/frontend/src/pages/secret-manager/SecretApprovalsPage/components/SecretApprovalRequest/components/SecretApprovalRequestChanges.tsx index 218365ae9..940d11fdb 100644 --- a/frontend/src/pages/secret-manager/SecretApprovalsPage/components/SecretApprovalRequest/components/SecretApprovalRequestChanges.tsx +++ b/frontend/src/pages/secret-manager/SecretApprovalsPage/components/SecretApprovalRequest/components/SecretApprovalRequestChanges.tsx @@ -30,19 +30,24 @@ import { TextArea, Tooltip } from "@app/components/v2"; -import { useUser } from "@app/context"; +import { useUser, useWorkspace } from "@app/context"; import { usePopUp } from "@app/hooks"; import { useGetSecretApprovalRequestDetails, + useGetSecretImports, useUpdateSecretApprovalReviewStatus } from "@app/hooks/api"; import { ApprovalStatus, CommitType } from "@app/hooks/api/types"; -import { formatReservedPaths } from "@app/lib/fn/string"; +import { formatReservedPaths, parsePathFromReplicatedPath } from "@app/lib/fn/string"; import { SecretApprovalRequestAction } from "./SecretApprovalRequestAction"; import { SecretApprovalRequestChangeItem } from "./SecretApprovalRequestChangeItem"; -export const generateCommitText = (commits: { op: CommitType }[] = []) => { +export const generateCommitText = (commits: { op: CommitType }[] = [], isReplicated = false) => { + if (isReplicated) { + return {commits.length} secret pending import; + } + const score: Record = {}; commits.forEach(({ op }) => { score[op] = (score?.[op] || 0) + 1; @@ -74,7 +79,6 @@ export const generateCommitText = (commits: { op: CommitType }[] = []) => { deleted ); - return text; }; @@ -105,6 +109,7 @@ export const SecretApprovalRequestChanges = ({ workspaceId }: Props) => { const { user: userSession } = useUser(); + const { currentWorkspace } = useWorkspace(); const { data: secretApprovalRequestDetails, isSuccess: isSecretApprovalRequestSuccess, @@ -112,6 +117,20 @@ export const SecretApprovalRequestChanges = ({ } = useGetSecretApprovalRequestDetails({ id: approvalRequestId }); + const approvalSecretPath = parsePathFromReplicatedPath( + secretApprovalRequestDetails?.secretPath || "" + ); + const { data: secretImports } = useGetSecretImports({ + environment: secretApprovalRequestDetails?.environment || "", + projectId: currentWorkspace.id, + path: approvalSecretPath + }); + + const replicatedImport = secretApprovalRequestDetails?.isReplicated + ? secretImports?.find( + (el) => secretApprovalRequestDetails?.secretPath?.includes(el.id) && el.isReplication + ) + : undefined; const { mutateAsync: updateSecretApprovalRequestStatus, @@ -226,34 +245,16 @@ export const SecretApprovalRequestChanges = ({ : secretApprovalRequestDetails.status} -
-
- {generateCommitText(secretApprovalRequestDetails.commits)} - {secretApprovalRequestDetails.isReplicated && ( - (replication) +
+
+ {generateCommitText( + secretApprovalRequestDetails.commits, + secretApprovalRequestDetails.isReplicated )}
-
-

- {secretApprovalRequestDetails?.committerUser?.firstName || ""} - {secretApprovalRequestDetails?.committerUser?.lastName || ""} ( - {secretApprovalRequestDetails?.committerUser?.email}) wants to change{" "} - {secretApprovalRequestDetails.commits.length} secret values in -

-

- {secretApprovalRequestDetails.environment} -

-
-

- -

-

- {formatReservedPaths(secretApprovalRequestDetails.secretPath)} -

-
+
+ By {secretApprovalRequestDetails?.committerUser?.firstName} ( + {secretApprovalRequestDetails?.committerUser?.email})
{!hasMerged && @@ -367,10 +368,87 @@ export const SecretApprovalRequestChanges = ({ )}
+
+
+ {secretApprovalRequestDetails.isReplicated ? ( +
+ A secret import in +

+ {secretApprovalRequestDetails?.environment} +

+
+

+ +

+ +

+ {approvalSecretPath} +

+
+
+ has pending changes to be accepted from its source at{" "} +

+ {replicatedImport?.importEnv?.slug} +

+
+

+ +

+ +

+ {replicatedImport?.importPath} +

+
+
+ . Approving these changes will add them to that import. +
+ ) : ( +
+

Secret(s) in

+

+ {secretApprovalRequestDetails?.environment} +

+
+

+ +

+ +

+ {formatReservedPaths(secretApprovalRequestDetails.secretPath)} +

+
+
+

+ have pending changes. Approving these changes will add them to that environment + and path. +

+
+ )} +
+
{secretApprovalRequestDetails.commits.map( ({ op, secretVersion, secret, ...newVersion }, index) => (