diff --git a/src/qqq/components/forms/DynamicForm.tsx b/src/qqq/components/forms/DynamicForm.tsx index 241d414..5a66314 100644 --- a/src/qqq/components/forms/DynamicForm.tsx +++ b/src/qqq/components/forms/DynamicForm.tsx @@ -19,21 +19,16 @@ * along with this program. If not, see . */ -import {QFieldMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QFieldMetaData"; -import {QFieldType} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QFieldType"; +import {AdornmentType} from "@kingsrook/qqq-frontend-core/lib/model/metaData/AdornmentType"; import {QRecord} from "@kingsrook/qqq-frontend-core/lib/model/QRecord"; -import {colors, Icon} from "@mui/material"; import Box from "@mui/material/Box"; -import Button from "@mui/material/Button"; import Grid from "@mui/material/Grid"; -import Tooltip from "@mui/material/Tooltip"; -import {useFormikContext} from "formik"; import QDynamicFormField from "qqq/components/forms/DynamicFormField"; import DynamicSelect from "qqq/components/forms/DynamicSelect"; +import FileInputField from "qqq/components/forms/FileInputField"; import MDTypography from "qqq/components/legacy/MDTypography"; import HelpContent from "qqq/components/misc/HelpContent"; -import ValueUtils from "qqq/utils/qqq/ValueUtils"; -import React, {useState} from "react"; +import React from "react"; interface Props { @@ -50,28 +45,6 @@ function QDynamicForm({formData, formLabel, bulkEditMode, bulkEditSwitchChangeHa { const {formFields, values, errors, touched} = formData; - const formikProps = useFormikContext(); - const [fileName, setFileName] = useState(null as string); - - 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 removeFile = (fieldName: string) => - { - setFileName(null); - formikProps.setFieldValue(fieldName, null); - record?.values.delete(fieldName) - record?.displayValues.delete(fieldName) - }; - const bulkEditSwitchChanged = (name: string, value: boolean) => { bulkEditSwitchChangeHandler(name, value); @@ -82,11 +55,6 @@ function QDynamicForm({formData, formLabel, bulkEditMode, bulkEditSwitchChangeHa {formLabel} - {/* TODO - help text - - Mandatory information - - */} @@ -113,52 +81,34 @@ function QDynamicForm({formData, formLabel, bulkEditMode, bulkEditSwitchChangeHa const labelElement = ; + let itemXS = 12; + let itemSM = 6; + + ///////////// + // files!! // + ///////////// if (field.type === "file") { - const pseudoField = new QFieldMetaData({name: fieldName, type: QFieldType.BLOB}); - return ( - - - {labelElement} - { - record && record.values.get(fieldName) && - Current File: - - {ValueUtils.getDisplayValue(pseudoField, record, "view")} - - removeFile(fieldName)}>delete - - - - } - - - - {fileName} - - + const fileUploadAdornment = field.fieldMetaData?.getAdornment(AdornmentType.FILE_UPLOAD); + const width = fileUploadAdornment?.values?.get("width") ?? "half"; - - - {errors[fieldName] && You must select a file to proceed} - - - + if(width == "full") + { + itemSM = 12; + } + + return ( + + {labelElement} + ); } - // possible values!! - if (field.possibleValueProps) + /////////////////////// + // possible values!! // + /////////////////////// + else if (field.possibleValueProps) { const otherValuesMap = field.possibleValueProps.otherValues ?? new Map(); Object.keys(values).forEach((key) => @@ -167,7 +117,7 @@ function QDynamicForm({formData, formLabel, bulkEditMode, bulkEditSwitchChangeHa }) return ( - + {labelElement} + {labelElement} . + */ + + +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}} + + + + ); +}