From cfdef13283d8b7bc6f8346eeb139b2f6593bb27f Mon Sep 17 00:00:00 2001
From: philipp lang <philipp@aweos.de>
Date: Fri, 20 May 2022 01:18:11 +0200
Subject: [PATCH] Add zuschuss management

---
 app/Contribution/ContributionController.php |  2 +-
 app/Contribution/SolingenData.php           |  6 +-
 resources/js/components/FSwitch.vue         | 81 +++++++++++++++------
 resources/js/views/contribution/VIndex.vue  | 16 +++-
 4 files changed, 77 insertions(+), 28 deletions(-)

diff --git a/app/Contribution/ContributionController.php b/app/Contribution/ContributionController.php
index 89c7a7c4..558203d2 100644
--- a/app/Contribution/ContributionController.php
+++ b/app/Contribution/ContributionController.php
@@ -18,7 +18,7 @@ class ContributionController extends Controller
         session()->put('title', 'Zuschüsse');
 
         return Inertia::render('contribution/VIndex', [
-            'members' => MemberResource::collection(Member::get()),
+            'allMembers' => MemberResource::collection(Member::get()),
         ]);
     }
 
diff --git a/app/Contribution/SolingenData.php b/app/Contribution/SolingenData.php
index cbfbce52..7b2f5c56 100644
--- a/app/Contribution/SolingenData.php
+++ b/app/Contribution/SolingenData.php
@@ -17,8 +17,9 @@ class SolingenData extends Data implements PdfRepository
         public string $eventName,
         public string $dateFrom,
         public string $dateUntil,
+        public array $members,
         public ?string $filename = '',
-        public $type = 'FK',
+        public $type = 'F',
     ) {
     }
 
@@ -28,6 +29,7 @@ class SolingenData extends Data implements PdfRepository
             eventName: $request->eventName,
             dateFrom: $request->dateFrom,
             dateUntil: $request->dateUntil,
+            members: $request->members,
         );
     }
 
@@ -48,7 +50,7 @@ class SolingenData extends Data implements PdfRepository
 
     public function members(): Collection
     {
-        return Member::orderByRaw('lastname, firstname')->get();
+        return Member::whereIn('id', $this->members)->orderByRaw('lastname, firstname')->get();
     }
 
     public function niceEventFrom(): string
diff --git a/resources/js/components/FSwitch.vue b/resources/js/components/FSwitch.vue
index 5d45de8f..2dc13415 100644
--- a/resources/js/components/FSwitch.vue
+++ b/resources/js/components/FSwitch.vue
@@ -1,14 +1,42 @@
 <template>
     <label class="flex flex-col relative field-switch cursor-pointer" :for="id" :class="{[`size-${outerSize}`]: true}">
-        <span v-if="label" class="font-semibold leading-none text-gray-400" :class="{
-            'text-xs': size == 'sm',
-            'text-sm': size === null
-        }">{{ label }}</span>
+        <span
+            v-if="label"
+            class="font-semibold leading-none text-gray-400"
+            :class="{
+                'text-xs': size == 'sm',
+                'text-sm': size === null,
+            }"
+            >{{ label }}</span
+        >
         <div class="relative inner-field mt-1" :class="`h-field-${fieldSize}`">
-            <input :id="id" type="checkbox" v-model="v" :disabled="disabled" class="invisible absolute" />
-            <span class="relative cursor-pointer flex grow display" :class="{'bg-switch': v === true, 'bg-gray-700': v === false}">
-                <span><svg-sprite class="relative text-gray-400 flex-none" :class="{'w-2 h-2': size === 'sm' || size == 'xs', 'w-4 h-4': size === null}" src="check"></svg-sprite></span>
-                <span><svg-sprite class="relative text-gray-400 flex-none" :class="{'w-2 h-2': size === 'sm' || size == 'xs', 'w-4 h-4': size === null}" src="close"></svg-sprite></span>
+            <input
+                :id="id"
+                type="checkbox"
+                :name="name"
+                :value="value"
+                v-model="v"
+                :disabled="disabled"
+                class="invisible absolute"
+            />
+            <span
+                class="relative cursor-pointer flex grow display"
+                :class="{'bg-switch': v === true, 'bg-gray-700': v === false}"
+            >
+                <span
+                    ><svg-sprite
+                        class="relative text-gray-400 flex-none"
+                        :class="{'w-2 h-2': size === 'sm' || size == 'xs', 'w-4 h-4': size === null}"
+                        src="check"
+                    ></svg-sprite
+                ></span>
+                <span
+                    ><svg-sprite
+                        class="relative text-gray-400 flex-none"
+                        :class="{'w-2 h-2': size === 'sm' || size == 'xs', 'w-4 h-4': size === null}"
+                        src="close"
+                    ></svg-sprite
+                ></span>
                 <var class="absolute overlay bg-gray-400 rounded top-0"></var>
             </span>
         </div>
@@ -19,33 +47,36 @@
 export default {
     model: {
         prop: 'items',
-        event: 'input'
+        event: 'input',
     },
     props: {
         inset: {
             type: Boolean,
-            default: false
+            default: false,
         },
         size: {
             default: null,
-            required: false
+            required: false,
         },
         id: {
-            required: true
+            required: true,
+        },
+        name: {
+            default: '',
         },
         disabled: {
             type: Boolean,
-            default: false
+            default: false,
         },
         value: {
-            default: false
+            default: false,
         },
         label: {
-            default: false
+            default: false,
         },
         items: {
-            default: undefined
-        }
+            default: undefined,
+        },
     },
     computed: {
         v: {
@@ -59,7 +90,7 @@ export default {
                     return;
                 }
 
-                var a = this.items.filter(i => i !== this.value);
+                var a = this.items.filter((i) => i !== this.value);
                 if (v) {
                     a.push(this.value);
                 }
@@ -76,21 +107,23 @@ export default {
                 }
 
                 return this.items.indexOf(this.value) !== -1;
-            }
+            },
         },
         fieldSize() {
             var sizes = ['xxs', 'xs', 'sm', 'md', 'lg'];
 
-            var sizeIndex = sizes.findIndex(s => s === this.size);
+            var sizeIndex = sizes.findIndex((s) => s === this.size);
             return sizes[this.inset ? sizeIndex : sizeIndex - 1];
         },
         outerSize() {
             var sizes = ['xxs', 'xs', 'sm', 'md', 'lg'];
 
-            var sizeIndex = sizes.findIndex(s => s === this.size);
-            if (!this.label || this.inset) { sizeIndex--; }
+            var sizeIndex = sizes.findIndex((s) => s === this.size);
+            if (!this.label || this.inset) {
+                sizeIndex--;
+            }
             return sizes[sizeIndex];
-        }
-    }
+        },
+    },
 };
 </script>
diff --git a/resources/js/views/contribution/VIndex.vue b/resources/js/views/contribution/VIndex.vue
index b88c89eb..6c045dee 100644
--- a/resources/js/views/contribution/VIndex.vue
+++ b/resources/js/views/contribution/VIndex.vue
@@ -17,6 +17,19 @@
             label="Datum bis"
             required
         ></f-text>
+
+        <div class="col-span-2">
+            <f-switch
+                :id="`members-${member.id}`"
+                :key="member.id"
+                :label="`${member.firstname} ${member.lastname}`"
+                v-for="member in allMembers"
+                name="members[]"
+                :value="member.id"
+                v-model="values.members"
+            ></f-switch>
+        </div>
+
         <button
             target="_BLANK"
             type="submit"
@@ -34,6 +47,7 @@ export default {
     data: function () {
         return {
             values: {
+                members: [],
                 event_name: '',
                 dateFrom: '',
                 dateUntil: '',
@@ -41,7 +55,7 @@ export default {
         };
     },
     props: {
-        members: {},
+        allMembers: {},
     },
 };
 </script>