From 939c982c40f605a4cacd34c2894bf9effb181fcc Mon Sep 17 00:00:00 2001
From: Julian Krauser <jkrauser209@gmail.com>
Date: Wed, 30 Apr 2025 10:43:11 +0200
Subject: [PATCH] image upload and keep if not changed

---
 .../management/setting/ClubImageSetting.vue      | 16 ++++++++++------
 src/stores/admin/management/setting.ts           |  8 ++++++--
 2 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/src/components/admin/management/setting/ClubImageSetting.vue b/src/components/admin/management/setting/ClubImageSetting.vue
index 1a1d675..adc4630 100644
--- a/src/components/admin/management/setting/ClubImageSetting.vue
+++ b/src/components/admin/management/setting/ClubImageSetting.vue
@@ -12,14 +12,14 @@
         >
           Kein eigenes Icon ausgewählt
         </div>
-        <img ref="icon_img" class="hidden w-full h-20 object-contain" />
+        <img ref="icon_img" class="hidden w-full h-10 object-contain" />
         <XMarkIcon
           v-if="enableEdit && (icon != '' || overwriteIcon)"
           class="h-5 w-5 cursor-pointer"
           @click="resetImage('icon')"
         />
       </div>
-      <input class="hidden!" type="file" ref="icon" accept="image/*" @change="previewImage('icon')" />
+      <input class="hidden!" type="file" ref="icon" accept="image/png" @change="previewImage('icon')" />
     </div>
     <div class="w-full">
       <p>Vereins-Logo</p>
@@ -33,14 +33,14 @@
         >
           Kein eigenes Logo ausgewählt
         </div>
-        <img ref="logo_img" class="hidden w-full h-20 object-contain" />
+        <img ref="logo_img" class="hidden w-full h-10 object-contain" />
         <XMarkIcon
           v-if="enableEdit && (logo != '' || overwriteLogo)"
           class="h-5 w-5 cursor-pointer"
           @click="resetImage('logo')"
         />
       </div>
-      <input class="hidden!" type="file" ref="logo" accept="image/*" @change="previewImage('logo')" />
+      <input class="hidden!" type="file" ref="logo" accept="image/png" @change="previewImage('logo')" />
     </div>
   </BaseSetting>
 </template>
@@ -135,11 +135,15 @@ export default defineComponent({
       return this.uploadImage([
         {
           key: "club.icon",
-          value: (this.$refs.icon as HTMLInputElement).files?.[0],
+          value:
+            (this.$refs.icon as HTMLInputElement).files?.[0] ??
+            (this.icon != "" && !this.overwriteIcon ? "keep" : undefined),
         },
         {
           key: "club.logo",
-          value: (this.$refs.logo as HTMLInputElement).files?.[0],
+          value:
+            (this.$refs.logo as HTMLInputElement).files?.[0] ??
+            (this.logo != "" && !this.overwriteLogo ? "keep" : undefined),
         },
       ]);
     },
diff --git a/src/stores/admin/management/setting.ts b/src/stores/admin/management/setting.ts
index 98bd8a8..da8b455 100644
--- a/src/stores/admin/management/setting.ts
+++ b/src/stores/admin/management/setting.ts
@@ -74,10 +74,14 @@ export const useSettingStore = defineStore("setting", {
         return res;
       });
     },
-    async uploadImage(data: { key: "club.logo" | "club.icon"; value?: File }[]): Promise<AxiosResponse<any, any>> {
+    async uploadImage(
+      data: { key: "club.logo" | "club.icon"; value?: File | "keep" }[]
+    ): Promise<AxiosResponse<any, any>> {
       const formData = new FormData();
       for (let entry of data) {
-        if (entry.value) formData.append(entry.key, entry.value);
+        if (entry.value) {
+          formData.append(typeof entry.value == "string" ? entry.key : entry.key.split(".")[1], entry.value);
+        }
       }
       return await http
         .put("/admin/setting/images", formData, {