Explorar o código

Stat tree edit - view data - pagination and sorting

Vijayakrishnan %!s(int64=3) %!d(string=hai) anos
pai
achega
056f0acad1

+ 25 - 4
app/Http/Controllers/StatTreeLineController.php

@@ -10,6 +10,7 @@ use App\Models\StatTree;
 use App\Models\StatTreeLine;
 use App\Models\Client;
 use App\Models\Pro;
+use Illuminate\Pagination\LengthAwarePaginator;
 use Illuminate\Support\Facades\DB;
 use Ramsey\Uuid\Uuid;
 
@@ -86,9 +87,11 @@ class StatTreeLineController extends Controller
     }
 
     public function viewData(Request $request, StatTreeLine $line) {
+        $total = 0;
         $rows = [];
         $columns = [];
         $selectColumns = [];
+        $paginator = null;
         foreach ($line->reportColumns as $reportColumn) {
             $columns[] = [
                 "label" => $reportColumn->label,
@@ -98,9 +101,13 @@ class StatTreeLineController extends Controller
             $selectColumns[] = "{$reportColumn->display_key} as v_{$reportColumn->id}";
         }
         if(count($line->reportColumns)) {
-            $rows = $this->queryStatTreeLineData($line, $selectColumns);
+            $result = $this->queryStatTreeLineData($line, $selectColumns, $request);
+            $total = $result[0];
+            $rows = $result[1];
+            $paginator = new LengthAwarePaginator($rows, $total, $request->input('per_page') ?: 20, $request->input('page') ?: 1);
+            $paginator->setPath(route('practice-management.statTreeLines.view-data', compact('line')));
         }
-        return view('app.stat-tree.stat-tree-lines.view-data', compact('line', 'rows', 'columns'));
+        return view('app.stat-tree.stat-tree-lines.view-data', compact('line', 'total', 'rows', 'columns', 'paginator'));
     }
 
     public function refreshCountQuery(Request $request)
@@ -150,7 +157,7 @@ class StatTreeLineController extends Controller
         return DB::select($query);
     }
 
-    protected function queryStatTreeLineData(StatTreeLine $statTreeLine, $selectColumns)
+    protected function queryStatTreeLineData(StatTreeLine $statTreeLine, $selectColumns, Request $request)
     {
 
         $model = $statTreeLine->statTree->model;
@@ -188,10 +195,24 @@ class StatTreeLineController extends Controller
             $clauses[] = str_replace('@PRO_ID', $statTreeLine->statTree->pro->id, $statTreeLine->statTree->pro_scope_clause);
         }
 
-        $query = 'SELECT ' . implode(", ", $selectColumns) . ' FROM '.$model.' WHERE '. implode(" AND ", $clauses);
+        $result = null;
 
+        // get count for paginator
         try {
+            $query = 'SELECT COUNT(*) FROM '.$model.' WHERE '. implode(" AND ", $clauses);
             $result = DB::select($query);
+            $total = $result[0]->count;
+
+            $page = $request->input('page') ?: 1;
+            $perPage = $request->input('per_page') ?: 20;
+            $offset = ($page - 1) * $perPage;
+            $sort = '';
+            if($request->input('sort_by') && $request->input('sort_by')) {
+                $sort = "ORDER BY " . $request->input('sort_by') . " " . $request->input('sort_dir') . " NULLS LAST";
+            }
+            $query = 'SELECT ' . implode(", ", $selectColumns) . ' FROM '.$model.' WHERE '. implode(" AND ", $clauses) . " {$sort} OFFSET {$offset} LIMIT {$perPage}";
+            $result = DB::select($query);
+            $result = [$total, $result];
         }
         catch (\Exception $ex) {
             $result = 'error';

+ 9 - 0
resources/views/app/stat-tree/_sort_header.blade.php

@@ -0,0 +1,9 @@
+<b class="{{request()->input('sort_by') === $key ? 'text-primary' : 'text-secondary'}}">{{$label}}</b>
+<span class="ml-2 d-inline-flex align-items-baseline">
+    <a href="{{ $route }}?{{queryLineExcept(['sort_by', 'sort_dir', 'page'])}}&sort_by={{$key}}&sort_dir=DESC" class="ml-1">
+        <i class="fa fa-arrow-up {{request()->input('sort_by') === $key && request()->input('sort_dir') === 'DESC' ? '' : 'on-hover-opaque text-secondary'}}"></i>
+    </a>
+    <a href="{{ $route }}?{{queryLineExcept(['sort_by', 'sort_dir', 'page'])}}&sort_by={{$key}}&sort_dir=ASC" class="ml-2">
+        <i class="fa fa-arrow-down {{request()->input('sort_by') === $key && request()->input('sort_dir') === 'ASC' ? '' : 'on-hover-opaque text-secondary'}}"></i>
+    </a>
+</span>

+ 4 - 1
resources/views/app/stat-tree/stat-tree-lines/view-data.blade.php

@@ -20,7 +20,9 @@
                 <thead>
                 <tr>
                     @foreach($columns as $column)
-                    <th class="border-bottom-0 text-left">{{$column['label']}}</th>
+                    <th class="border-bottom-0 text-left">
+                        @include('app.stat-tree._sort_header', ['route' => route('practice-management.statTreeLines.view-data', compact('line')), 'label' => $column['label'], 'key' => $column['as']])
+                    </th>
                     @endforeach
                 </tr>
                 </thead>
@@ -34,6 +36,7 @@
                 @endforeach
                 </tbody>
             </table>
+            {!! $paginator->withQueryString()->links() !!}
         @endif
     @endif
 </div>