mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-10 14:28:35 +00:00
chore: minor ui improvements
This commit is contained in:
+22
-1
@@ -21,6 +21,7 @@ import {
|
|||||||
faTrash
|
faTrash
|
||||||
} from "@fortawesome/free-solid-svg-icons";
|
} from "@fortawesome/free-solid-svg-icons";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
|
import { AxiosError } from "axios";
|
||||||
import FileSaver from "file-saver";
|
import FileSaver from "file-saver";
|
||||||
import { twMerge } from "tailwind-merge";
|
import { twMerge } from "tailwind-merge";
|
||||||
|
|
||||||
@@ -54,7 +55,7 @@ import {
|
|||||||
import { usePopUp } from "@app/hooks";
|
import { usePopUp } from "@app/hooks";
|
||||||
import { useCreateFolder, useDeleteSecretBatch, useMoveSecrets } from "@app/hooks/api";
|
import { useCreateFolder, useDeleteSecretBatch, useMoveSecrets } from "@app/hooks/api";
|
||||||
import { fetchProjectSecrets } from "@app/hooks/api/secrets/queries";
|
import { fetchProjectSecrets } from "@app/hooks/api/secrets/queries";
|
||||||
import { SecretType, WsTag } from "@app/hooks/api/types";
|
import { ApiErrorTypes, SecretType, TApiErrors, WsTag } from "@app/hooks/api/types";
|
||||||
import { SecretSearchInput } from "@app/pages/secret-manager/OverviewPage/components/SecretSearchInput";
|
import { SecretSearchInput } from "@app/pages/secret-manager/OverviewPage/components/SecretSearchInput";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@@ -152,6 +153,7 @@ export const ActionBar = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const handleSecretDownload = async () => {
|
const handleSecretDownload = async () => {
|
||||||
|
try {
|
||||||
const { secrets: localSecrets, imports: localImportedSecrets } = await fetchProjectSecrets({
|
const { secrets: localSecrets, imports: localImportedSecrets } = await fetchProjectSecrets({
|
||||||
workspaceId,
|
workspaceId,
|
||||||
expandSecretReferences: true,
|
expandSecretReferences: true,
|
||||||
@@ -197,6 +199,25 @@ export const ActionBar = ({
|
|||||||
|
|
||||||
const blob = new Blob([file], { type: "text/plain;charset=utf-8" });
|
const blob = new Blob([file], { type: "text/plain;charset=utf-8" });
|
||||||
FileSaver.saveAs(blob, `${environment}.env`);
|
FileSaver.saveAs(blob, `${environment}.env`);
|
||||||
|
} catch (err) {
|
||||||
|
if (err instanceof AxiosError) {
|
||||||
|
const error = err?.response?.data as TApiErrors;
|
||||||
|
|
||||||
|
if (error?.error === ApiErrorTypes.ForbiddenError && error.message.includes("readValue")) {
|
||||||
|
createNotification({
|
||||||
|
title: "You don't have permission to download secrets",
|
||||||
|
text: "You don't have permission to view one or more of the secrets in the current folder. Please contact your administrator.",
|
||||||
|
type: "error"
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
createNotification({
|
||||||
|
title: "Failed to download secrets",
|
||||||
|
text: "Please try again later.",
|
||||||
|
type: "error"
|
||||||
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleSecretBulkDelete = async () => {
|
const handleSecretBulkDelete = async () => {
|
||||||
|
|||||||
+6
@@ -314,7 +314,12 @@ export const SecretDetailSidebar = ({
|
|||||||
{...field}
|
{...field}
|
||||||
autoFocus={false}
|
autoFocus={false}
|
||||||
/>
|
/>
|
||||||
|
<Tooltip
|
||||||
|
content="You don't have permission to view the secret value."
|
||||||
|
isDisabled={!secret?.secretValueHidden}
|
||||||
|
>
|
||||||
<Button
|
<Button
|
||||||
|
isDisabled={secret?.secretValueHidden}
|
||||||
className="px-2 py-[0.43rem] font-normal"
|
className="px-2 py-[0.43rem] font-normal"
|
||||||
variant="outline_bg"
|
variant="outline_bg"
|
||||||
leftIcon={<FontAwesomeIcon icon={faShare} />}
|
leftIcon={<FontAwesomeIcon icon={faShare} />}
|
||||||
@@ -327,6 +332,7 @@ export const SecretDetailSidebar = ({
|
|||||||
>
|
>
|
||||||
Share
|
Share
|
||||||
</Button>
|
</Button>
|
||||||
|
</Tooltip>
|
||||||
</div>
|
</div>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+2
@@ -307,6 +307,7 @@ export const SecretItem = memo(
|
|||||||
<div key="actions" className="flex h-8 flex-shrink-0 self-start transition-all">
|
<div key="actions" className="flex h-8 flex-shrink-0 self-start transition-all">
|
||||||
<Tooltip content="Copy secret">
|
<Tooltip content="Copy secret">
|
||||||
<IconButton
|
<IconButton
|
||||||
|
isDisabled={secret.secretValueHidden}
|
||||||
ariaLabel="copy-value"
|
ariaLabel="copy-value"
|
||||||
variant="plain"
|
variant="plain"
|
||||||
size="sm"
|
size="sm"
|
||||||
@@ -514,6 +515,7 @@ export const SecretItem = memo(
|
|||||||
)}
|
)}
|
||||||
</ProjectPermissionCan>
|
</ProjectPermissionCan>
|
||||||
<IconButton
|
<IconButton
|
||||||
|
isDisabled={secret.secretValueHidden}
|
||||||
className="w-0 overflow-hidden p-0 group-hover:mr-2 group-hover:w-5 data-[state=open]:w-6"
|
className="w-0 overflow-hidden p-0 group-hover:mr-2 group-hover:w-5 data-[state=open]:w-6"
|
||||||
variant="plain"
|
variant="plain"
|
||||||
size="md"
|
size="md"
|
||||||
|
|||||||
Reference in New Issue
Block a user