diff --git a/forms_pro/forms_pro/doctype/form_field/form_field.json b/forms_pro/forms_pro/doctype/form_field/form_field.json index 350d660..236861a 100644 --- a/forms_pro/forms_pro/doctype/form_field/form_field.json +++ b/forms_pro/forms_pro/doctype/form_field/form_field.json @@ -35,7 +35,7 @@ "fieldtype": "Select", "in_list_view": 1, "label": "Fieldtype", - "options": "Data\nNumber\nEmail\nDate\nDate Time\nDate Range\nTime Picker\nPassword\nSelect\nSwitch\nTextarea\nText Editor\nLink", + "options": "Attach\nData\nNumber\nEmail\nDate\nDate Time\nDate Range\nTime Picker\nPassword\nSelect\nSwitch\nTextarea\nText Editor\nLink", "reqd": 1 }, { @@ -68,7 +68,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2026-01-09 13:23:39.055114", + "modified": "2026-01-09 14:57:39.192268", "modified_by": "Administrator", "module": "Forms Pro", "name": "Form Field", diff --git a/forms_pro/forms_pro/doctype/form_field/form_field.py b/forms_pro/forms_pro/doctype/form_field/form_field.py index f2d832b..12f3caa 100644 --- a/forms_pro/forms_pro/doctype/form_field/form_field.py +++ b/forms_pro/forms_pro/doctype/form_field/form_field.py @@ -18,6 +18,7 @@ class FormField(Document): description: DF.SmallText | None fieldname: DF.Data fieldtype: DF.Literal[ + "Attach", "Data", "Number", "Email", diff --git a/frontend/src/components/builder/FieldRenderer.vue b/frontend/src/components/builder/FieldRenderer.vue index dbc2af0..98f5d66 100644 --- a/frontend/src/components/builder/FieldRenderer.vue +++ b/frontend/src/components/builder/FieldRenderer.vue @@ -180,6 +180,29 @@ onMounted(() => { /> +
+
+ + + +
+ + + {{ fieldData.description }} + +
+import { ErrorMessage, FileUploader, FormControl } from "frappe-ui"; +import { computed, ref } from "vue"; +import { FileImage, FileText } from "lucide-vue-next"; + +const props = defineProps({ + field: { + type: Object, + required: true, + }, +}); + +const emit = defineEmits(["update:value"]); + +const value = defineModel(); + +const inPreview = ref(false); + +type FileType = { + content_hash: string; + creation: string; + docstatus: number; + doctype: string; + file_name: string; + file_size: number; + file_type: string; + file_url: string; + folder: string; + idx: number; + is_attachments_folder: number; + is_folder: number; + is_home_folder: number; + is_private: number; + modified: string; + modified_by: string; + name: string; + owner: string; + uploaded_to_dropbox: number; + uploaded_to_google_drive: number; +}; + +const fileData = ref(null); + +const formatFileSize = (fileSize: number) => { + if (fileSize < 1024) return `${fileSize} B`; + if (fileSize < 1024 * 1024) return `${(fileSize / 1024).toFixed(2)} KB`; + if (fileSize < 1024 * 1024 * 1024) return `${(fileSize / 1024 / 1024).toFixed(2)} MB`; + return `${(fileSize / 1024 / 1024 / 1024).toFixed(2)} GB`; +}; + +const handleChange = (file: FileType) => { + fileData.value = file; + if (file.file_url) { + emit("update:value", file.file_url); + } + inPreview.value = true; +}; + +const handleRemove = () => { + fileData.value = null; + emit("update:value", ""); + inPreview.value = false; +}; + + diff --git a/frontend/src/pages/SubmissionPage.vue b/frontend/src/pages/SubmissionPage.vue index e8db264..ed1819c 100644 --- a/frontend/src/pages/SubmissionPage.vue +++ b/frontend/src/pages/SubmissionPage.vue @@ -12,6 +12,7 @@ const submissionFormStore = useSubmissionForm(); submissionFormStore.initialize(route.params.route as string);