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}}
+
+
+
+ );
+}