From 381a7f902384b4bd286e3cffec067250f5a02d05 Mon Sep 17 00:00:00 2001
From: philipp lang <philipp@aweos.de>
Date: Fri, 28 Mar 2025 01:16:44 +0100
Subject: [PATCH] --wip-- [skip ci]

---
 docker-compose.yml                           |  2 +
 modules/Contribution/Components/FillList.php | 93 ++++++++++++++++++++
 2 files changed, 95 insertions(+)

diff --git a/docker-compose.yml b/docker-compose.yml
index aa27c717..7defed9a 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -104,6 +104,8 @@ services:
 
     meilisearch:
         image: getmeili/meilisearch:v1.6
+        ports:
+            - "7700:7700"
         volumes:
             - ./data/meilisearch:/meili_data
         env_file:
diff --git a/modules/Contribution/Components/FillList.php b/modules/Contribution/Components/FillList.php
index 625dd14e..95cbf488 100644
--- a/modules/Contribution/Components/FillList.php
+++ b/modules/Contribution/Components/FillList.php
@@ -2,14 +2,107 @@
 
 namespace Modules\Contribution\Components;
 
+use App\Contribution\ContributionFactory;
+use App\Country;
+use Illuminate\Support\Collection;
+use App\Member\Member;
 use Livewire\Component;
 
 class FillList extends Component
 {
+    public string $eventName = '';
+    public Carbon $dateFrom;
+    public Carbon $dateUntil;
+    public int $country;
+    public $members = [];
+
+    public Collection $countries;
+    public string $search = '';
+    public Collection $compilers;
+    public Collection $memberResults;
+
+    public function mount(): void
+    {
+        $this->compilers = app(ContributionFactory::class)->compilerSelect();
+        $this->countries = Country::select('name', 'id')->get()->toBase();
+        $this->clearSearch();
+    }
+
+    /** @todo implement compilation of document */
+    public function submit(): void
+    {
+    }
+
+    public function updatedSearch(): void
+    {
+        $this->memberResults = Member::search($this->search, fn ($engine, $query, $options) => $engine->search($query, [
+            ...$options,
+            'filter' => ['birthday IS NOT NULL', 'address IS NOT EMPTY']
+        ]))->get()->toBase();
+    }
+
+    public function onSubmitFirstMemberResult(): void
+    {
+        if (count($this->memberResults) === 0) {
+            $this->clearSearch();
+            return;
+        }
+
+        $this->onSubmitMemberResult($this->memberResults[0]->id);
+    }
+
+    public function onSubmitMemberResult(int $memberId): void
+    {
+        if (in_array($memberId, $this->members)) {
+            $this->members = array_values(array_filter($this->members, fn ($m) => $m !== $memberId));
+        } else {
+            $this->members[] = $memberId;
+        }
+
+        $this->js('document.querySelector("#search_input").focus()');
+
+        $this->clearSearch();
+    }
+
+    public function clearSearch(): void
+    {
+        $this->search = '';
+        $this->memberResults = collect([]);
+    }
+
     public function render()
     {
         return <<<'HTML'
             <x-page::layout title="Zuschüsse" menu="contribution">
+                <form target="_BLANK" class="max-w-4xl w-full mx-auto gap-6 grid-cols-2 grid p-6">
+                    <x-form::text name="event_name" wire:model="eventName" class="col-span-2" label="Veranstaltungs-Name" required></x-form::text>
+                    <x-form::text name="date_from" wire:model="dateFrom" type="date" label="Datum von" required></x-form::text>
+                    <x-form::text name="date_until" wire:model="dateUntil" type="date" label="Datum bis" required></x-form::text>
+                    <x-form::text name="zipLocation" v-model="values.zipLocation" label="PLZ / Ort" required></x-form::text>
+                    <x-form::select name="country" wire:model="country" :options="$countries" label="Land" required></x-form::select>
+                    <x-form::select name="compiler" wire:model="compiler" :options="$compilers" label="Formular" required></x-form::select>
+
+                    <x-ui::box class="col-span-2" title="Mitglieder finden">
+                        <x-form::text name="search_text" id="search_input" wire:model.live="search" class="col-span-2" label="Suchen …" size="sm" wire:keydown.enter="onSubmitFirstMemberResult"></x-form::text>
+                        <div class="mt-2 grid grid-cols-[repeat(auto-fill,minmax(180px,1fr))] gap-2 col-span-2">
+                            @foreach($memberResults as $member)
+                            <x-form::lever
+                                id="members-{{$member->id}}"
+                                :wire:key="$member->id"
+                                wire:model="members"
+                                :label="$member->fullname"
+                                name="members"
+                                :value="$member->id"
+                                size="sm"
+                                wire:keydown.enter="onSubmitMemberResult({{$member->id}})"
+                            ></x-form::lever>
+                            @endforeach
+                        </div>
+                    </x-ui::box>
+
+
+                    <x-ui::button class="col-span-2" type="submit">Formular erstellen</x-ui::button>
+                </form>
             </x-page::layout>
         HTML;
     }