diff --git a/frontend/components/ActivityDetails/InstallDetails/AppInstallDetails/AppInstallDetails.tsx b/frontend/components/ActivityDetails/InstallDetails/AppInstallDetails/AppInstallDetails.tsx
index f6ed1a97be..54e0f1b8ad 100644
--- a/frontend/components/ActivityDetails/InstallDetails/AppInstallDetails/AppInstallDetails.tsx
+++ b/frontend/components/ActivityDetails/InstallDetails/AppInstallDetails/AppInstallDetails.tsx
@@ -1,3 +1,5 @@
+// Used on: Dashboard > activity, Host details > past activity
+
import React from "react";
import { useQuery } from "react-query";
@@ -115,16 +117,17 @@ export const AppInstallDetails = ({
{showCommandPayload && (
- Request payload:
-
)}
{showCommandResponse && (
- The response from {formattedHost}:
-
diff --git a/frontend/components/ActivityDetails/InstallDetails/AppInstallDetails/_styles.scss b/frontend/components/ActivityDetails/InstallDetails/AppInstallDetails/_styles.scss
index ae9deeeef6..889aa6b93b 100644
--- a/frontend/components/ActivityDetails/InstallDetails/AppInstallDetails/_styles.scss
+++ b/frontend/components/ActivityDetails/InstallDetails/AppInstallDetails/_styles.scss
@@ -10,20 +10,7 @@
gap: $pad-small;
margin: 0;
.icon {
- padding-top: 3px;
align-self: flex-start;
}
}
- &__script-output {
- padding-top: $pad-xlarge;
- .textarea {
- margin-top: $pad-medium;
- overflow-wrap: break-word;
- }
- }
-
- &__output-textarea {
- max-height: 300px;
- overflow-y: auto;
- }
}
diff --git a/frontend/components/ActivityDetails/InstallDetails/SoftwareInstallDetails/SoftwareInstallDetails.tsx b/frontend/components/ActivityDetails/InstallDetails/SoftwareInstallDetails/SoftwareInstallDetails.tsx
index 91d13ad1ed..d7b5599bc3 100644
--- a/frontend/components/ActivityDetails/InstallDetails/SoftwareInstallDetails/SoftwareInstallDetails.tsx
+++ b/frontend/components/ActivityDetails/InstallDetails/SoftwareInstallDetails/SoftwareInstallDetails.tsx
@@ -1,3 +1,5 @@
+// Used on: Dashboard > activity, Host details > past activity
+
import React from "react";
import { useQuery } from "react-query";
import { formatDistanceToNow } from "date-fns";
@@ -79,8 +81,10 @@ const Output = ({
}) => {
return (
- {SOFTWARE_INSTALL_OUTPUT_DISPLAY_LABELS[displayKey]}:
-
+
{result[displayKey]}
@@ -126,24 +130,22 @@ export const SoftwareInstallDetails = ({
return (
<>
-
-
- {result.status !== "pending_install" && (
- <>
- {result.pre_install_query_output && (
-
- )}
- {result.output && }
- {result.post_install_script_output && (
-
- )}
- >
- )}
-
+
+ {result.status !== "pending_install" && (
+ <>
+ {result.pre_install_query_output && (
+
+ )}
+ {result.output && }
+ {result.post_install_script_output && (
+
+ )}
+ >
+ )}
>
);
};
diff --git a/frontend/components/ActivityDetails/InstallDetails/SoftwareInstallDetails/_styles.scss b/frontend/components/ActivityDetails/InstallDetails/SoftwareInstallDetails/_styles.scss
index 3468eeca9c..fd8bd2507d 100644
--- a/frontend/components/ActivityDetails/InstallDetails/SoftwareInstallDetails/_styles.scss
+++ b/frontend/components/ActivityDetails/InstallDetails/SoftwareInstallDetails/_styles.scss
@@ -1,21 +1,19 @@
.software-install-details {
overflow-wrap: anywhere; // Prevent long software name overflow
+ &__modal-content {
+ display: flex;
+ flex-direction: column;
+ gap: $pad-medium;
+ }
+
&__status-message {
display: flex;
align-items: center;
gap: $pad-small;
margin: 0;
.icon {
- padding-top: 3px;
align-self: flex-start;
}
}
- &__script-output {
- padding-top: $pad-xlarge;
- .textarea {
- margin-top: $pad-medium;
- overflow-wrap: break-word;
- }
- }
}
diff --git a/frontend/components/ActivityDetails/InstallDetails/SoftwareUninstallDetailsModal/SoftwareUninstallDetailsModal.tsx b/frontend/components/ActivityDetails/InstallDetails/SoftwareUninstallDetailsModal/SoftwareUninstallDetailsModal.tsx
index e0838b0717..3278fd208a 100644
--- a/frontend/components/ActivityDetails/InstallDetails/SoftwareUninstallDetailsModal/SoftwareUninstallDetailsModal.tsx
+++ b/frontend/components/ActivityDetails/InstallDetails/SoftwareUninstallDetailsModal/SoftwareUninstallDetailsModal.tsx
@@ -1,3 +1,5 @@
+// Used on: Dashboard > activity, Host details > past activity
+
import Button from "components/buttons/Button";
import DataError from "components/DataError";
import Icon from "components/Icon";
@@ -127,15 +129,13 @@ const SoftwareUninstallDetailsModal = ({
{!isPendingStatus(status) && scriptResult && (
<>
- Uninstall script content:
-
+
{scriptResult.script_contents}
- Uninstall script output:
-
+
{scriptResult.output}
diff --git a/frontend/components/ActivityDetails/InstallDetails/SoftwareUninstallDetailsModal/_styles.scss b/frontend/components/ActivityDetails/InstallDetails/SoftwareUninstallDetailsModal/_styles.scss
index ca0ad4a2c1..f1e96caadc 100644
--- a/frontend/components/ActivityDetails/InstallDetails/SoftwareUninstallDetailsModal/_styles.scss
+++ b/frontend/components/ActivityDetails/InstallDetails/SoftwareUninstallDetailsModal/_styles.scss
@@ -13,11 +13,4 @@
align-self: flex-start;
}
}
- &__script-output {
- .textarea {
- margin-top: $pad-medium;
- overflow-wrap: break-word;
- font-family: "SourceCodePro", $monospace;
- }
- }
}
diff --git a/frontend/components/Textarea/Textarea.stories.tsx b/frontend/components/Textarea/Textarea.stories.tsx
new file mode 100644
index 0000000000..4ba4e0df56
--- /dev/null
+++ b/frontend/components/Textarea/Textarea.stories.tsx
@@ -0,0 +1,24 @@
+import { Meta, StoryObj } from "@storybook/react";
+import Textarea from ".";
+import "../../index.scss";
+
+const meta: Meta = {
+ component: Textarea,
+ title: "Components/Textarea",
+ args: {
+ children: "Default textarea content",
+ },
+};
+
+export default meta;
+
+type Story = StoryObj;
+
+export const ExampleWithLabelAndCodeVariant: Story = {
+ args: {
+ variant: "code",
+ label: "Textarea label:",
+ children:
+ "const example = 'This is code styled text';\n// With line breaks preserved.\n\n Text with\r\ncarriage returns\r\nconverted to\nline breaks",
+ },
+};
diff --git a/frontend/components/Textarea/Textarea.tsx b/frontend/components/Textarea/Textarea.tsx
index 5a068bd624..88b2f1d544 100644
--- a/frontend/components/Textarea/Textarea.tsx
+++ b/frontend/components/Textarea/Textarea.tsx
@@ -6,10 +6,13 @@ const baseClass = "textarea";
interface ITextareaProps {
children: React.ReactNode;
className?: string;
+ label?: React.ReactNode;
+ /** code - code font, max height 300px */
+ variant?: "code" | "default";
}
// A textarea component that encapsulates common styles and functionality.
-const Textarea = ({ children, className }: ITextareaProps) => {
+const Textarea = ({ children, className, label, variant }: ITextareaProps) => {
// this is to preserve line breaks when we encounter a carriage return character.
// We could not find a way to preserve line breaks in the CSS alone for this
// character.
@@ -17,8 +20,17 @@ const Textarea = ({ children, className }: ITextareaProps) => {
children = children.replace(/\r/g, "\n");
}
- const classNames = classnames(baseClass, className);
- return {children}
;
+ const wrapperClasses = classnames(`${baseClass}-wrapper`, className);
+ const textareaClasses = classnames(baseClass, {
+ [`${baseClass}--code`]: variant === "code",
+ });
+
+ return (
+
+ {label &&
{label}
}
+
{children}
+
+ );
};
export default Textarea;
diff --git a/frontend/components/Textarea/_styles.scss b/frontend/components/Textarea/_styles.scss
index b8725ca4e1..f3f77394ce 100644
--- a/frontend/components/Textarea/_styles.scss
+++ b/frontend/components/Textarea/_styles.scss
@@ -4,4 +4,17 @@
border: 1px solid $ui-fleet-black-10;
background-color: $ui-off-white;
white-space: pre-wrap;
+
+ &-wrapper {
+ display: flex;
+ flex-direction: column;
+ gap: $pad-medium;
+ }
+
+ &--code {
+ overflow-wrap: break-word;
+ overflow-y: auto;
+ font-family: "SourceCodePro", $monospace;
+ max-height: 300px;
+ }
}
diff --git a/frontend/pages/ManageControlsPage/Scripts/components/ScriptDetailsModal/ScriptDetailsModal.tsx b/frontend/pages/ManageControlsPage/Scripts/components/ScriptDetailsModal/ScriptDetailsModal.tsx
index 77bcd3f554..fa088ca0b6 100644
--- a/frontend/pages/ManageControlsPage/Scripts/components/ScriptDetailsModal/ScriptDetailsModal.tsx
+++ b/frontend/pages/ManageControlsPage/Scripts/components/ScriptDetailsModal/ScriptDetailsModal.tsx
@@ -268,8 +268,7 @@ const ScriptDetailsModal = ({
className={`${baseClass}__script-content modal-scrollable-content`}
ref={topDivRef}
>
- Script content:
-
+
{scriptContent}
{runScriptHelpText && (