From c734d180183e68dc8879c93b327960b9608fa373 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Fri, 12 Jun 2026 16:27:45 +0700 Subject: [PATCH] Refactor ExpenseFormModal and CategoryFormModal to utilize useFormDialog for improved form handling. Replace MediaImageUpload with ImageUploadField for photo uploads, enhancing user experience. Remove unused ImageUploadField component to streamline codebase. --- .../finance/expenses/ExpenseFormModal.vue | 60 ++++++++++--------- .../master/categories/CategoryFormModal.vue | 27 ++++----- .../admin/setting/SystemSection.vue | 2 +- .../image-upload-field}/ImageUploadField.vue | 31 +++++++--- .../components/ui/image-upload-field/index.ts | 1 + resources/js/composables/useFormDialog.ts | 26 ++++++++ 6 files changed, 95 insertions(+), 52 deletions(-) rename resources/js/components/{admin/setting => ui/image-upload-field}/ImageUploadField.vue (70%) create mode 100644 resources/js/components/ui/image-upload-field/index.ts create mode 100644 resources/js/composables/useFormDialog.ts diff --git a/resources/js/components/admin/finance/expenses/ExpenseFormModal.vue b/resources/js/components/admin/finance/expenses/ExpenseFormModal.vue index 123dfa1..f4ad439 100644 --- a/resources/js/components/admin/finance/expenses/ExpenseFormModal.vue +++ b/resources/js/components/admin/finance/expenses/ExpenseFormModal.vue @@ -1,9 +1,8 @@ @@ -130,8 +136,8 @@ function submit() { placeholder="Contoh: Pembelian perlengkapan toko" rows="3" /> - + diff --git a/resources/js/components/admin/master/categories/CategoryFormModal.vue b/resources/js/components/admin/master/categories/CategoryFormModal.vue index 2d75cf3..061eb67 100644 --- a/resources/js/components/admin/master/categories/CategoryFormModal.vue +++ b/resources/js/components/admin/master/categories/CategoryFormModal.vue @@ -1,7 +1,7 @@ diff --git a/resources/js/components/admin/setting/SystemSection.vue b/resources/js/components/admin/setting/SystemSection.vue index 661656b..6a0c4d7 100644 --- a/resources/js/components/admin/setting/SystemSection.vue +++ b/resources/js/components/admin/setting/SystemSection.vue @@ -5,12 +5,12 @@ import { toast } from 'vue-sonner'; import { Button } from '@/components/ui/button'; import { Card, CardContent } from '@/components/ui/card'; import { Field, FieldError, FieldGroup, FieldLabel, FieldSet } from '@/components/ui/field'; +import { ImageUploadField } from '@/components/ui/image-upload-field'; import { Input } from '@/components/ui/input'; import { PhoneNumberInput } from '@/components/ui/phone-number-input'; import { Textarea } from '@/components/ui/textarea'; import { formErrors } from '@/lib/form'; import type { SystemSettingsData } from '@/types/setting'; -import ImageUploadField from './ImageUploadField.vue'; const props = defineProps<{ data: SystemSettingsData; diff --git a/resources/js/components/admin/setting/ImageUploadField.vue b/resources/js/components/ui/image-upload-field/ImageUploadField.vue similarity index 70% rename from resources/js/components/admin/setting/ImageUploadField.vue rename to resources/js/components/ui/image-upload-field/ImageUploadField.vue index f41c3d5..2a143b8 100644 --- a/resources/js/components/admin/setting/ImageUploadField.vue +++ b/resources/js/components/ui/image-upload-field/ImageUploadField.vue @@ -14,6 +14,7 @@ const props = defineProps<{ errors?: string[]; accept?: string; required?: boolean; + previewClass?: string; }>(); const model = defineModel(); @@ -55,20 +56,34 @@ function clearFile() {
-
+
-
- +
diff --git a/resources/js/components/ui/image-upload-field/index.ts b/resources/js/components/ui/image-upload-field/index.ts new file mode 100644 index 0000000..d50e22c --- /dev/null +++ b/resources/js/components/ui/image-upload-field/index.ts @@ -0,0 +1 @@ +export { default as ImageUploadField } from './ImageUploadField.vue'; diff --git a/resources/js/composables/useFormDialog.ts b/resources/js/composables/useFormDialog.ts new file mode 100644 index 0000000..708fd63 --- /dev/null +++ b/resources/js/composables/useFormDialog.ts @@ -0,0 +1,26 @@ +import { watch } from 'vue'; +import type { Ref } from 'vue'; + +interface UseFormDialogOptions { + open: Ref; + source: () => T; + populate: (value: T) => void; + reset: () => void; +} + +export function useFormDialog({ + open, + source, + populate, + reset, +}: UseFormDialogOptions) { + watch(source, populate); + + watch(open, (isOpen) => { + if (isOpen) { + populate(source()); + } else { + reset(); + } + }); +}