Explorar el Código

absence_report - aggiunto filtro per utente

ferrari hace 1 mes
padre
commit
384514ec48

+ 53 - 4
app/Http/Livewire/AbsenceReport.php

@@ -10,10 +10,13 @@ class AbsenceReport extends Component
 
     public $records;
     public $record_assenze;
+    public $original_record_assenze;
 
     public $fiscalStartMonth = 9;
     public $year;
 
+    public $search;
+
     public function mount()
     {
         setlocale(LC_ALL, 'it_IT');
@@ -81,13 +84,20 @@ class AbsenceReport extends Component
                 }
 
                 $this->record_assenze[$course->id] = [
-                    'course' => $course,
+                    'course' => [
+                        'id' => $course->id,
+                        'name' => $course->getDetailsName(),
+                    ],
                     'members' => [],
                 ];
 
                 foreach ($course_members as $course_member) {
                     $this->record_assenze[$course->id]['members'][$course_member->id] = [
-                        'member' => $course_member->member,
+                        'member' => [
+                            'id' => $course_member->member->id,
+                            'first_name' => $course_member->member->first_name,
+                            'last_name' => $course_member->member->last_name,
+                        ],
                         'count'  => 0,
                         'dates'  => [],
                     ];
@@ -155,19 +165,23 @@ class AbsenceReport extends Component
                             return $b['count'] <=> $a['count'];
                         }
 
-                        $last = strcmp($a['member']->last_name, $b['member']->last_name);
+                        $last = strcmp($a['member']['last_name'], $b['member']['last_name']);
                         if ($last !== 0) {
                             return $last;
                         }
 
-                        return strcmp($a['member']->first_name, $b['member']->first_name);
+                        return strcmp($a['member']['first_name'], $b['member']['first_name']);
                     });
                     $this->record_assenze[$course->id]['members'] = $members;
                 }
             }
+
+            usort($this->record_assenze, fn($a, $b) => $a['course']['name'] <=> $b['course']['name']);
         } catch (\Throwable $e) {
             dd($e->getMessage());
         }
+
+        $this->original_record_assenze = $this->record_assenze;
     }
 
     public function render()
@@ -239,6 +253,41 @@ class AbsenceReport extends Component
         return view('livewire.absence_report');
     }
 
+    public function applySearch()
+    {
+        $this->search = trim($this->search);
+        $this->filter();
+    }
+
+    public function resetSearch()
+    {
+        $this->search = '';
+        $this->record_assenze = $this->original_record_assenze;
+    }
+
+    protected function filter()
+    {
+        $this->record_assenze = $this->original_record_assenze;
+
+        if ($this->search === '') return;
+
+        $needle = mb_strtolower($this->search);
+
+        foreach ($this->record_assenze as $courseId => $courseData) {
+            $courseData['members'] = array_values(array_filter($courseData['members'], function ($m) use ($needle) {
+                $full  = mb_strtolower((trim($m['member']['last_name']) ?? '') . ' ' . (trim($m['member']['first_name']) ?? ''));
+                $full2 = mb_strtolower((trim($m['member']['first_name']) ?? '') . ' ' . (trim($m['member']['last_name']) ?? ''));
+                return str_contains($full, $needle) || str_contains($full2, $needle);
+            }));
+
+            if (empty($courseData['members'])) {
+                unset($this->record_assenze[$courseId]);
+            } else {
+                $this->record_assenze[$courseId] = $courseData;
+            }
+        }
+    }
+
     protected function generateFiscalDateRanges($months, $days, $dayMap, $fromTime, $toTime)
     {
         $limit = now()->endOfDay();

+ 23 - 5
resources/views/livewire/absence_report.blade.php

@@ -1,6 +1,6 @@
 <div class="col card--ui" id="card--dashboard">
 
-    <a class="btn--ui lightGrey" href="/presence_reports"><i class="fa-solid fa-arrow-left"></i></a><br>
+    <a class="btn--ui lightGrey" href="/presence_reports"><i class="fa-solid fa-arrow-left"></i></a>
 
     <header id="title--section" style="display:none !important" class="d-flex align-items-center justify-content-between">
         <div class="title--section_name d-flex align-items-center justify-content-between">
@@ -8,13 +8,31 @@
             <h2 class="primary">Assenze</h2>
         </div>
     </header>
+    
+    <div class="row mb-2">
+        <div class="col">
+            <div class="alert alert-warning text-center" role="alert">Attenzione, se l'utente viene aggiunto manualmente a un corso a cui non è associato, non verrà segnato come presente per il corso a cui è registrato</div>
+        </div>
+    </div>
 
-    <br>
+    <div class="row mb-3">
+        <div class="col-8"></div>
+        <div class="col text-end">
+            <div class="input-group">
+                <input type="text" class="form-control" placeholder="Cerca utente" aria-label="Cerca utente" wire:model.defer="search">
+            </div>
+        </div>
+        <div class="col-auto text-end">
+            <button class="btn--ui" type="button" wire:click="resetSearch()">Reset</button>
+            &nbsp;
+            <button class="btn--ui" type="button" wire:click="applySearch()">Cerca</button>
+        </div>
+    </div>
 
     @foreach ($record_assenze as $record_data)
         <div class="row mb-5">
             <div class="col-12 mb-2">
-                <h3 class="primary">{{$record_data['course']->getDetailsName()}}</h3>
+                <h3 class="primary">{{$record_data['course']['name']}}</h3>
             </div>
             <div class="col-12">
                 <table class="report-table">
@@ -29,8 +47,8 @@
                     <tbody>
                         @foreach($record_data['members'] as $member)
                         <tr @if($loop->index % 2 == 1)style="background-color: rgba(12 97 151 / 0.05);"@endif>
-                            <td>{{$member['member']->last_name}}</td>
-                            <td>{{$member['member']->first_name}}</td>
+                            <td>{{$member['member']['last_name']}}</td>
+                            <td>{{$member['member']['first_name']}}</td>
                             <td>{{$member["count"]}}</td>
                             <td>
                                 @foreach ($member["dates"] as $calendar_date)