/* * QQQ - Low-code Application Framework for Engineers. * Copyright (C) 2021-2024. Kingsrook, LLC * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States * contact@kingsrook.com * https://github.com/Kingsrook/ * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ import {AdornmentType} from "@kingsrook/qqq-frontend-core/lib/model/metaData/AdornmentType"; import {QFieldMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QFieldMetaData"; import {QFieldType} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QFieldType"; import {QRecord} from "@kingsrook/qqq-frontend-core/lib/model/QRecord"; import {Button, colors, Icon} from "@mui/material"; import Box from "@mui/material/Box"; import Tooltip from "@mui/material/Tooltip"; import {useFormikContext} from "formik"; import MDTypography from "qqq/components/legacy/MDTypography"; import ValueUtils from "qqq/utils/qqq/ValueUtils"; import React, {useCallback, useState} from "react"; import {useDropzone} from "react-dropzone"; interface FileInputFieldProps { field: any, record?: QRecord, errorMessage?: any } export default function FileInputField({field, record, errorMessage}: FileInputFieldProps): JSX.Element { const [fileName, setFileName] = useState(null as string); const formikProps = useFormikContext(); const fileChanged = (event: React.FormEvent, field: any) => { setFileName(null); if (event.currentTarget.files && event.currentTarget.files[0]) { setFileName(event.currentTarget.files[0].name); } formikProps.setFieldValue(field.name, event.currentTarget.files[0]); }; const onDrop = useCallback((acceptedFiles: any) => { setFileName(null); if (acceptedFiles.length && acceptedFiles[0]) { setFileName(acceptedFiles[0].name); } formikProps.setFieldValue(field.name, acceptedFiles[0]); }, []); const {getRootProps, getInputProps, isDragActive} = useDropzone({onDrop}); const removeFile = (fieldName: string) => { setFileName(null); formikProps.setFieldValue(fieldName, null); record?.values.delete(fieldName); record?.displayValues.delete(fieldName); }; const pseudoField = new QFieldMetaData({name: field.name, type: QFieldType.BLOB}); const fileUploadAdornment = field.fieldMetaData?.getAdornment(AdornmentType.FILE_UPLOAD); const format = fileUploadAdornment?.values?.get("format") ?? "button"; return ( { record && record.values.get(field.name) && Current File: {ValueUtils.getDisplayValue(pseudoField, record, "view")} removeFile(field.name)}>delete } { format == "button" && {fileName} } { format == "dragAndDrop" && <> upload_file Drag and drop a file or Browse files {fileName}  } {errorMessage && {errorMessage}} ); }