Fleet UI: Created consistent UI for the copy button of an input field (#29056)

This commit is contained in:
RachelElysia
2025-05-13 10:24:32 -04:00
committed by GitHub
parent e134691da3
commit 175f110f86
12 changed files with 10 additions and 69 deletions
+1
View File
@@ -0,0 +1 @@
Fleet UI: Created consistent UI for the copy button of an input field
@@ -42,7 +42,6 @@ const AndroidPanel = ({ enrollSecret }: IAndroidPanelProps) => {
<InputField
label="Send this to your end users:"
enableCopy
copyButtonPosition="inside"
readOnly
inputWrapperClass
name="enroll-link"
@@ -45,7 +45,6 @@ const IosIpadosPanel = ({ enrollSecret }: IosIpadosPanelProps) => {
<InputField
label="Send this to your end users:"
enableCopy
copyButtonPosition="inside"
readOnly
inputWrapperClass
name="enroll-link"
@@ -315,7 +315,6 @@ const PlatformWrapper = ({
inputWrapperClass={`${baseClass}__installer-input ${baseClass}__chromeos-extension-id`}
name="Extension ID"
enableCopy
copyButtonPosition="inside"
label="Extension ID"
value={CHROME_OS_INFO.extensionId}
/>
@@ -324,7 +323,6 @@ const PlatformWrapper = ({
inputWrapperClass={`${baseClass}__installer-input ${baseClass}__chromeos-url`}
name="Installation URL"
enableCopy
copyButtonPosition="inside"
label="Installation URL"
value={CHROME_OS_INFO.installationUrl}
/>
@@ -333,7 +331,6 @@ const PlatformWrapper = ({
inputWrapperClass={`${baseClass}__installer-input ${baseClass}__chromeos-policy-for-extension`}
name="Policy for extension"
enableCopy
copyButtonPosition="inside"
label="Policy for extension"
type="textarea"
value={CHROME_OS_INFO.policyForExtension}
@@ -360,7 +357,6 @@ const PlatformWrapper = ({
inputWrapperClass={`${baseClass}__installer-input ${baseClass}__installer-input-${packageType}`}
name="installer"
enableCopy
copyButtonPosition="inside"
label={renderLabel(packageType)}
type="textarea"
value={renderInstallerString(packageType)}
@@ -455,7 +451,6 @@ const PlatformWrapper = ({
inputWrapperClass={`${baseClass}__run-osquery-input`}
name="run-osquery"
enableCopy
copyButtonPosition="inside"
label={renderLabel("plain-osquery")}
type="text"
value="osqueryd --flagfile=flagfile.txt --verbose"
@@ -499,7 +494,6 @@ const PlatformWrapper = ({
inputWrapperClass={`${baseClass}__installer-input ${baseClass}__installer-input-${packageType}`}
name="installer"
enableCopy
copyButtonPosition="inside"
label={renderLabel(packageType)}
type="textarea"
value={renderInstallerString(packageType)}
@@ -45,7 +45,6 @@ class InputField extends Component {
/** Use in conjunction with type "password" and enableCopy to see eye icon to view */
enableShowSecret: PropTypes.bool,
enableCopy: PropTypes.bool,
copyButtonPosition: PropTypes.oneOf(["inside", "outside"]),
ignore1password: PropTypes.bool,
};
@@ -66,7 +65,6 @@ class InputField extends Component {
helpText: "",
enableCopy: false,
enableShowSecret: false,
copyButtonPosition: "outside",
ignore1password: false,
};
@@ -124,7 +122,7 @@ class InputField extends Component {
};
renderCopyButton = () => {
const { value, copyButtonPosition } = this.props;
const { value } = this.props;
const copyValue = (e) => {
e.preventDefault();
@@ -136,28 +134,11 @@ class InputField extends Component {
});
};
const copyButtonValue =
copyButtonPosition === "outside" ? (
<>
<Icon name="copy" />
<span>Copy</span>
</>
) : (
<Icon name="copy" />
);
const wrapperClasses = classnames(
`${baseClass}__copy-wrapper`,
copyButtonPosition === "outside"
? `${baseClass}__copy-wrapper-outside`
: `${baseClass}__copy-wrapper-inside`
);
const copyButtonValue = <Icon name="copy" />;
const wrapperClasses = classnames(`${baseClass}__copy-wrapper`);
const copiedConfirmationClasses = classnames(
`${baseClass}__copied-confirmation`,
copyButtonPosition === "outside"
? `${baseClass}__copied-confirmation-outside`
: `${baseClass}__copied-confirmation-inside`
`${baseClass}__copied-confirmation`
);
return (
@@ -165,11 +146,7 @@ class InputField extends Component {
{this.state.copied && (
<span className={copiedConfirmationClasses}>Copied!</span>
)}
<Button
variant={copyButtonPosition === "outside" ? "text-icon" : "icon"}
onClick={copyValue}
iconStroke
>
<Button variant={"icon"} onClick={copyValue} iconStroke>
{copyButtonValue}
</Button>
{this.props.enableShowSecret && this.renderShowSecretButton()}
@@ -195,7 +172,6 @@ class InputField extends Component {
ignore1password,
enableCopy,
enableShowSecret,
copyButtonPosition,
} = this.props;
const { onInputChange } = this;
@@ -228,8 +204,6 @@ class InputField extends Component {
const inputContainerClasses = classnames(`${baseClass}__input-container`, {
"copy-enabled": enableCopy,
"copy-outside": enableCopy && copyButtonPosition === "outside",
"copy-inside": enableCopy && copyButtonPosition === "inside",
});
if (type === "textarea") {
@@ -36,10 +36,6 @@ export default {
enableCopy: {
control: "boolean",
},
copyButtonPosition: {
control: "radio",
options: ["inside", "outside"],
},
enableShowSecret: {
control: "boolean",
},
@@ -110,10 +106,9 @@ WithCopyEnabled.args = {
value: "This text can be copied",
};
export const WithCopyEnabledInsideInput = Template.bind({});
WithCopyEnabledInsideInput.args = {
export const WithCopyEnabledInput = Template.bind({});
WithCopyEnabledInput.args = {
...WithCopyEnabled.args,
copyButtonPosition: "inside",
};
export const WithTooltip = Template.bind({});
@@ -113,7 +113,6 @@ export const WithCopyButton: Story = {
label: "Input with Copy Button",
value: "Click to copy this text",
enableCopy: true,
copyButtonPosition: "outside",
},
};
@@ -107,7 +107,7 @@ describe("InputField Component", () => {
/>
);
expect(screen.getByRole("button", { name: /copy/i })).toBeInTheDocument();
expect(screen.getByTestId("copy-icon")).toBeInTheDocument();
});
test("calls onBlur when input loses focus", async () => {
@@ -101,14 +101,6 @@
display: flex;
align-items: center;
position: relative;
}
&__copy-wrapper-outside {
position: relative;
gap: $pad-medium;
}
&__copy-wrapper-inside {
position: absolute;
top: 0;
right: 0;
@@ -117,15 +109,7 @@
}
&__input-container.copy-enabled {
&.copy-outside {
display: flex;
align-items: center;
gap: $pad-small;
}
&.copy-inside {
position: relative;
}
position: relative;
}
&__copied-confirmation {
@@ -30,7 +30,6 @@ const InputFieldHiddenContent = ({
name={name}
enableShowSecret
enableCopy
copyButtonPosition="inside"
type={"password"}
value={value}
helpText={helpText}
@@ -358,7 +358,6 @@ const Calendars = (): JSX.Element => {
inputWrapperClass={`${baseClass}__oauth-scopes`}
name="oauth-scopes"
enableCopy
copyButtonPosition="inside"
type="textarea"
value={OAUTH_SCOPES}
/>
@@ -49,7 +49,6 @@ const AutoEnrollMdmModal = ({
</div>
<InputField
enableCopy
copyButtonPosition="inside"
readOnly
inputWrapperClass
name="profiles-renew-command"
@@ -90,7 +89,6 @@ const AutoEnrollMdmModal = ({
</div>
<InputField
enableCopy
copyButtonPosition="inside"
readOnly
inputWrapperClass
name="profiles-renew-command"