Merge pull request #3645 from Infisical/fix/secretInputSelectAllFix

Only select all secret value on edit but no view permissions, and keep the select until user starts writting
This commit is contained in:
carlosmonastyrski
2025-05-22 12:01:20 -03:00
committed by GitHub
4 changed files with 20 additions and 4 deletions

View File

@@ -51,6 +51,7 @@ type Props = Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, "onChange" | "val
isVisible?: boolean;
isReadOnly?: boolean;
isDisabled?: boolean;
canEditButNotView?: boolean;
secretPath?: string;
environment?: string;
containerClassName?: string;
@@ -70,6 +71,7 @@ export const InfisicalSecretInput = forwardRef<HTMLTextAreaElement, Props>(
containerClassName,
secretPath: propSecretPath,
environment: propEnvironment,
canEditButNotView,
...props
},
ref
@@ -273,6 +275,7 @@ export const InfisicalSecretInput = forwardRef<HTMLTextAreaElement, Props>(
<Popover.Trigger asChild>
<SecretInput
{...props}
canEditButNotView={canEditButNotView}
ref={handleRef}
onKeyDown={handleKeyDown}
value={value}

View File

@@ -3,6 +3,7 @@ import { forwardRef, TextareaHTMLAttributes } from "react";
import { twMerge } from "tailwind-merge";
import { useToggle } from "@app/hooks";
import { HIDDEN_SECRET_VALUE } from "@app/pages/secret-manager/SecretDashboardPage/components/SecretListView/SecretItem";
const REGEX = /(\${([a-zA-Z0-9-_.]+)})/g;
const replaceContentWithDot = (str: string) => {
@@ -51,6 +52,7 @@ type Props = TextareaHTMLAttributes<HTMLTextAreaElement> & {
isReadOnly?: boolean;
isDisabled?: boolean;
containerClassName?: string;
canEditButNotView?: boolean;
};
const commonClassName = "font-mono text-sm caret-white border-none outline-none w-full break-all";
@@ -66,6 +68,7 @@ export const SecretInput = forwardRef<HTMLTextAreaElement, Props>(
isDisabled,
isReadOnly,
onFocus,
canEditButNotView,
...props
},
ref
@@ -93,7 +96,15 @@ export const SecretInput = forwardRef<HTMLTextAreaElement, Props>(
onFocus={(evt) => {
onFocus?.(evt);
setIsSecretFocused.on();
evt.currentTarget.select();
if (canEditButNotView && value === HIDDEN_SECRET_VALUE) {
evt.currentTarget.select();
}
}}
onMouseDown={(e) => {
if (canEditButNotView && value === HIDDEN_SECRET_VALUE) {
e.preventDefault();
e.currentTarget.select();
}
}}
disabled={isDisabled}
spellCheck={false}

View File

@@ -232,6 +232,7 @@ export const SecretEditRow = ({
environment={environment}
isImport={isImportedSecret}
defaultValue={secretValueHidden ? "" : undefined}
canEditButNotView={secretValueHidden && !isOverride}
/>
)}
/>

View File

@@ -58,7 +58,7 @@ import {
} from "./SecretListView.utils";
import { CollapsibleSecretImports } from "./CollapsibleSecretImports";
const hiddenValue = "******";
export const HIDDEN_SECRET_VALUE = "******";
type Props = {
secret: SecretV3RawSanitized;
@@ -122,7 +122,7 @@ export const SecretItem = memo(
const getDefaultValue = () => {
if (secret.secretValueHidden) {
return canEditSecretValue ? hiddenValue : "";
return canEditSecretValue ? HIDDEN_SECRET_VALUE : "";
}
return secret.valueOverride || secret.value || "";
};
@@ -366,10 +366,11 @@ export const SecretItem = memo(
isReadOnly={isReadOnly || isRotatedSecret}
key="secret-value"
isVisible={isVisible && !secretValueHidden}
canEditButNotView={secretValueHidden && !isOverriden}
environment={environment}
secretPath={secretPath}
{...field}
defaultValue={secretValueHidden ? hiddenValue : undefined}
defaultValue={secretValueHidden ? HIDDEN_SECRET_VALUE : undefined}
containerClassName="py-1.5 rounded-md transition-all"
/>
)}