diff --git a/changes/22446-scripts-modal b/changes/22446-scripts-modal new file mode 100644 index 0000000000..1e06aea931 --- /dev/null +++ b/changes/22446-scripts-modal @@ -0,0 +1 @@ +- Users can view scripts in the UI (from both the scripts page and host details page) without downloading them diff --git a/frontend/components/ActionsDropdown/ActionsDropdown.tsx b/frontend/components/ActionsDropdown/ActionsDropdown.tsx index 4e731250c9..0ac7c2d61c 100644 --- a/frontend/components/ActionsDropdown/ActionsDropdown.tsx +++ b/frontend/components/ActionsDropdown/ActionsDropdown.tsx @@ -25,6 +25,7 @@ interface IActionsDropdownProps { isSearchable?: boolean; className?: string; menuAlign?: "right" | "left" | "default"; + menuPlacement?: "top" | "bottom" | "auto"; } const getOptionBackgroundColor = (state: any) => { @@ -113,6 +114,7 @@ const ActionsDropdown = ({ isSearchable = false, className, menuAlign = "default", + menuPlacement = "bottom", }: IActionsDropdownProps): JSX.Element => { const dropdownClassnames = classnames(baseClass, className); @@ -178,7 +180,7 @@ const ActionsDropdown = ({ borderRadius: "4px", zIndex: 6, border: 0, - marginTop: 0, + margin: 0, width: "auto", minWidth: "100%", position: "absolute", @@ -239,6 +241,7 @@ const ActionsDropdown = ({ className={dropdownClassnames} classNamePrefix={`${baseClass}-select`} isOptionDisabled={(option) => !!option.disabled} + menuPlacement={menuPlacement} /> ); diff --git a/frontend/components/ActivityDetails/InstallDetails/SoftwareInstallDetails/_styles.scss b/frontend/components/ActivityDetails/InstallDetails/SoftwareInstallDetails/_styles.scss index 8cdc2ef600..d9da1ab248 100644 --- a/frontend/components/ActivityDetails/InstallDetails/SoftwareInstallDetails/_styles.scss +++ b/frontend/components/ActivityDetails/InstallDetails/SoftwareInstallDetails/_styles.scss @@ -1,7 +1,4 @@ .software-install-details { - .modal__content { - margin-top: $pad-xlarge; - } &__status-message { display: flex; align-items: center; diff --git a/frontend/components/ListItem/ListItem.tsx b/frontend/components/ListItem/ListItem.tsx index 8b120bff33..24f90d2b56 100644 --- a/frontend/components/ListItem/ListItem.tsx +++ b/frontend/components/ListItem/ListItem.tsx @@ -27,7 +27,7 @@ export type ISupportedGraphicNames = Extract< interface IListItemProps { /** The grahpic you want to display for this list item. */ graphic: ISupportedGraphicNames; - title: string; + title: string | JSX.Element; details: React.ReactNode; /** A collection of React Nodes that will render as list item actions. Can be * used to render buttons, links, etc. diff --git a/frontend/components/Modal/Modal.tsx b/frontend/components/Modal/Modal.tsx index 8342002ac3..d3947370a2 100644 --- a/frontend/components/Modal/Modal.tsx +++ b/frontend/components/Modal/Modal.tsx @@ -37,6 +37,7 @@ export interface IModalProps { * */ disableClosingModal?: boolean; className?: string; + actionsFooter?: JSX.Element; } const Modal = ({ @@ -50,6 +51,7 @@ const Modal = ({ isContentDisabled = false, disableClosingModal = false, className, + actionsFooter, }: IModalProps): JSX.Element => { useEffect(() => { const closeWithEscapeKey = (e: KeyboardEvent) => { @@ -119,13 +121,15 @@ const Modal = ({ )} -
diff --git a/frontend/pages/ManageControlsPage/Scripts/components/ScriptDetailsModal/ScriptDetailsModal.tsx b/frontend/pages/ManageControlsPage/Scripts/components/ScriptDetailsModal/ScriptDetailsModal.tsx
new file mode 100644
index 0000000000..bdbbd086c9
--- /dev/null
+++ b/frontend/pages/ManageControlsPage/Scripts/components/ScriptDetailsModal/ScriptDetailsModal.tsx
@@ -0,0 +1,254 @@
+import React, { useCallback, useContext } from "react";
+import { format } from "date-fns";
+import { useQuery } from "react-query";
+import FileSaver from "file-saver";
+
+import { AppContext } from "context/app";
+import { NotificationContext } from "context/notification";
+import scriptAPI from "services/entities/scripts";
+import { IHostScript } from "interfaces/script";
+import { getErrorReason } from "interfaces/errors";
+
+import Modal from "components/Modal";
+import Button from "components/buttons/Button";
+import Spinner from "components/Spinner";
+import Icon from "components/Icon";
+import Textarea from "components/Textarea";
+import CustomLink from "components/CustomLink";
+import DataError from "components/DataError";
+import paths from "router/paths";
+import ActionsDropdown from "components/ActionsDropdown";
+import { generateActionDropdownOptions } from "pages/hosts/details/HostDetailsPage/modals/RunScriptModal/ScriptsTableConfig";
+
+const baseClass = "script-details-modal";
+
+type PartialOrFullHostScript =
+ | Pick
+ To run the script across multiple hosts, add a policy automation on
+ the