import React, { useState } from "react"; import getInstallScript from "utilities/software_install_scripts"; import Spinner from "components/Spinner"; import Button from "components/buttons/Button"; import FileUploader from "components/FileUploader"; import Graphic from "components/Graphic"; import Editor from "components/Editor"; import AddSoftwareAdvancedOptions from "../AddSoftwareAdvancedOptions"; import { generateFormValidation, getFileDetails } from "./helpers"; const baseClass = "add-software-form"; const UploadingSoftware = () => { return (

Uploading. It may take few minutes to finish.

); }; // TODO: if we reuse this one more time, we should consider moving this // into FileUploader as a default preview. Currently we have this in // AddProfileModal.tsx and here. const FileDetails = ({ details: { name, platform }, }: { details: { name: string; platform: string; }; }) => (
{name}
{platform}
); export interface IAddSoftwareFormData { software: File | null; installScript: string; preInstallCondition?: string; postInstallScript?: string; } export interface IFormValidation { isValid: boolean; software: { isValid: boolean }; preInstallCondition?: { isValid: boolean; message?: string }; postInstallScript?: { isValid: boolean; message?: string }; } interface IAddSoftwareFormProps { isUploading: boolean; onCancel: () => void; onSubmit: (formData: IAddSoftwareFormData) => void; } const AddSoftwareForm = ({ isUploading, onCancel, onSubmit, }: IAddSoftwareFormProps) => { const [showPreInstallCondition, setShowPreInstallCondition] = useState(false); const [showPostInstallScript, setShowPostInstallScript] = useState(false); const [formData, setFormData] = useState({ software: null, installScript: "", preInstallCondition: undefined, postInstallScript: undefined, }); const [formValidation, setFormValidation] = useState({ isValid: false, software: { isValid: false }, }); const onFileUpload = (files: FileList | null) => { if (files && files.length > 0) { const file = files[0]; const newData = { ...formData, software: file, installScript: getInstallScript(file.name), }; setFormData(newData); setFormValidation( generateFormValidation( newData, showPreInstallCondition, showPostInstallScript ) ); } }; const onFormSubmit = (evt: React.FormEvent) => { evt.preventDefault(); onSubmit(formData); }; const onTogglePreInstallConditionCheckbox = (value: boolean) => { const newData = { ...formData, preInstallCondition: undefined }; setShowPreInstallCondition(value); setFormData(newData); setFormValidation( generateFormValidation(newData, value, showPostInstallScript) ); }; const onTogglePostInstallScriptCheckbox = (value: boolean) => { const newData = { ...formData, postInstallScript: undefined }; setShowPostInstallScript(value); setFormData(newData); setFormValidation( generateFormValidation(newData, showPreInstallCondition, value) ); }; const onChangeInstallScript = (value: string) => { setFormData({ ...formData, installScript: value }); }; const onChangePreInstallCondition = (value?: string) => { const newData = { ...formData, preInstallCondition: value }; setFormData(newData); setFormValidation( generateFormValidation( newData, showPreInstallCondition, showPostInstallScript ) ); }; const onChangePostInstallScript = (value?: string) => { const newData = { ...formData, postInstallScript: value }; setFormData(newData); setFormValidation( generateFormValidation( newData, showPreInstallCondition, showPostInstallScript ) ); }; const isSubmitDisabled = !formValidation.isValid; return (
{isUploading ? ( ) : (
) } /> {formData.software && ( For security agents, add the script provided by the vendor.
In custom scripts, you can use the $INSTALLER_PATH variable to point to the installer. } /> )}
)}
); }; export default AddSoftwareForm;