mirror of
https://github.com/fleetdm/fleet
synced 2026-05-18 06:28:40 +00:00
relates to #18326 Add ability to add software from the UI. This includes - new button on software page to open add software modal - new add software modal to add software. > Note: still need to do form error validation but will do on another PR - [x] Changes file added for user-visible changes in `changes/`, `orbit/changes/` or `ee/fleetd-chrome/changes`. See [Changes files](https://fleetdm.com/docs/contributing/committing-changes#changes-files) for more information. - [x] Manual QA for all new/changed functionality
109 lines
2.9 KiB
TypeScript
109 lines
2.9 KiB
TypeScript
import React, { useContext, useEffect, useState } from "react";
|
|
|
|
import { APP_CONTEXT_ALL_TEAMS_ID } from "interfaces/team";
|
|
import { getErrorReason } from "interfaces/errors";
|
|
import softwareAPI from "services/entities/software";
|
|
import { NotificationContext } from "context/notification";
|
|
|
|
import Modal from "components/Modal";
|
|
import Button from "components/buttons/Button";
|
|
|
|
import AddSoftwareForm from "../AddSoftwareForm";
|
|
import { IAddSoftwareFormData } from "../AddSoftwareForm/AddSoftwareForm";
|
|
|
|
// 2 minutes
|
|
const UPLOAD_TIMEOUT = 120000;
|
|
|
|
const baseClass = "add-software-modal";
|
|
|
|
interface IAllTeamsMessageProps {
|
|
onExit: () => void;
|
|
}
|
|
|
|
const AllTeamsMessage = ({ onExit }: IAllTeamsMessageProps) => {
|
|
return (
|
|
<>
|
|
<p>
|
|
Please select a team first. Software can't be added when{" "}
|
|
<b>All teams</b> is selected.
|
|
</p>
|
|
<div className="modal-cta-wrap">
|
|
<Button variant="brand" onClick={onExit}>
|
|
Done
|
|
</Button>
|
|
</div>
|
|
</>
|
|
);
|
|
};
|
|
|
|
interface IAddSoftwareModalProps {
|
|
teamId: number;
|
|
onExit: () => void;
|
|
}
|
|
|
|
const AddSoftwareModal = ({ teamId, onExit }: IAddSoftwareModalProps) => {
|
|
const { renderFlash } = useContext(NotificationContext);
|
|
const [isUploading, setIsUploading] = useState(false);
|
|
|
|
useEffect(() => {
|
|
let timeout: NodeJS.Timeout;
|
|
|
|
const beforeUnloadHandler = (e: BeforeUnloadEvent) => {
|
|
e.preventDefault();
|
|
// Included for legacy support, e.g. Chrome/Edge < 119
|
|
e.returnValue = true;
|
|
};
|
|
|
|
// set up event listener to prevent user from leaving page while uploading
|
|
if (isUploading) {
|
|
addEventListener("beforeunload", beforeUnloadHandler);
|
|
timeout = setTimeout(() => {
|
|
removeEventListener("beforeunload", beforeUnloadHandler);
|
|
}, UPLOAD_TIMEOUT);
|
|
} else {
|
|
removeEventListener("beforeunload", beforeUnloadHandler);
|
|
}
|
|
|
|
// clean up event listener and timeout on component unmount
|
|
return () => {
|
|
removeEventListener("beforeunload", beforeUnloadHandler);
|
|
clearTimeout(timeout);
|
|
};
|
|
}, [isUploading]);
|
|
|
|
const onAddSoftware = async (formData: IAddSoftwareFormData) => {
|
|
setIsUploading(true);
|
|
|
|
try {
|
|
await softwareAPI.addSoftwarePackage(formData, teamId);
|
|
renderFlash("success", "Software added successfully!"); // TODO: change message
|
|
} catch (e) {
|
|
renderFlash("error", getErrorReason(e));
|
|
}
|
|
|
|
setIsUploading(false);
|
|
};
|
|
|
|
return (
|
|
<Modal
|
|
title="Add software"
|
|
onExit={onExit}
|
|
width="large"
|
|
className={baseClass}
|
|
>
|
|
<>
|
|
{teamId === APP_CONTEXT_ALL_TEAMS_ID ? (
|
|
<AllTeamsMessage onExit={onExit} />
|
|
) : (
|
|
<AddSoftwareForm
|
|
isUploading={isUploading}
|
|
onCancel={onExit}
|
|
onSubmit={onAddSoftware}
|
|
/>
|
|
)}
|
|
</>
|
|
</Modal>
|
|
);
|
|
};
|
|
|
|
export default AddSoftwareModal;
|