Samson Mutunga 3 jaren geleden
bovenliggende
commit
5380db0ffa

+ 92 - 3
app/Http/Controllers/StatTreeLineController.php

@@ -4,15 +4,104 @@ namespace App\Http\Controllers;
 
 
 use Illuminate\Http\Request;
+use App\Models\StatTree;
 use App\Models\StatTreeLine;
+use App\Models\Client;
 
 class StatTreeLineController extends Controller
 {
-    public function list(){
+    public function list()
+    {
         $statTreeLines = StatTreeLine::all();
         return view('app.stat-tree-lines.list', compact('statTreeLines'));
     }
-    public function dashboard(StatTreeLine $statTreeLine){
-        return view('app.stat-tree.stat-tree-lines.single', compact('statTreeLine'));
+    public function dashboard(StatTreeLine $statTreeLine)
+    {
+        $result = $this->applyStatTreeLineQueryClauses($statTreeLine);
+        if (!$result) {
+            $response = 'Invalid query or model/table name';
+        } else {
+            $response = [
+                'type' => 'count',
+                'sql' => $result->toSql(),
+                'result' => $result->count()
+            ];
+        }
+
+        return view('app.stat-tree.stat-tree-lines.single', compact('statTreeLine', 'response'));
+    }
+
+    public function refreshTreeCountQueries(Request $request)
+    {
+        $statTreeID = $request->get('statTreeID');
+        if (!$statTreeID) return $this->fail('No specified stat tree!');
+
+        $statTree = StatTree::where('id', $statTreeID)->first();
+        if (!$statTree) return $this->fail('Invalid stat tree!');
+        $lines = $statTree->lines;
+        foreach ($lines as $line) {
+            $query = $this->applyStatTreeLineQueryClauses($line);
+            if ($query) {
+                $line->last_refresh_count = $query->count();
+                $line->save();
+            }
+        }
+
+        return $this->pass();
+    }
+
+    public function refreshCountQuery(Request $request)
+    {
+        $statTreeLineID = $request->get('statTreeLineID');
+        if (!$statTreeLineID) return $this->fail('No specified stat tree line!');
+
+        $statTreeLine = StatTreeLine::where('id', $statTreeLineID)->first();
+        if (!$statTreeLine) return $this->fail('Invalid stat tree line!');
+
+        $query = $this->applyStatTreeLineQueryClauses($statTreeLine);
+        if ($query) {
+            $statTreeLine->last_refresh_count = $query->count();
+            $statTreeLine->save();
+            return $this->pass($statTreeLine->last_refresh_count);
+        }else{
+            return $this->fail('Invalid query or model/table name');
+        }
+    }
+
+    protected function applyStatTreeLineQueryClauses(StatTreeLine $statTreeLine)
+    {
+
+        $model = $statTreeLine->statTree->model;
+        $query = null;
+        if ($model === 'client') {
+            $query = Client::query();
+        }
+
+        if (!$query) return null;
+
+        $clauses = [];
+        foreach ($statTreeLine->lineClauses as $lineClause) {
+            $clauseText = $lineClause->clause->clause_text;
+            $isValid = $this->cleanupClause($clauseText);
+            if ($isValid) {
+                array_push($clauses, $clauseText);
+            }
+        }
+
+        foreach ($clauses as $clause) {
+            $clauseQuery = $clause;
+            $query = $query->whereRaw($clauseQuery);
+        }
+
+        return $query;
+    }
+
+    protected function cleanupClause($clauseText)
+    {
+        //Dont include empty clauses, i.e ()
+        preg_match('#\((.*?)\)#', $clauseText, $match);
+        $content = @$match[1];
+        if (!$content || empty($content)) return null;
+        return $content;
     }
 }

+ 2 - 2
app/Http/Middleware/VerifyCsrfToken.php

@@ -15,8 +15,8 @@ class VerifyCsrfToken extends Middleware
     protected $except = [
         "/process_form_submit",
         "/availability/load",
-        '/practice-management/stat-tree/create',
-        '/practice-management/stat-tree/replace-all-lines',
+        '/practice-management/stat-tree/*',
+        '/practice-management/stat-tree-line/*',
         '/practice-management/clause/replace-all'
     ];
     

+ 8 - 2
resources/views/app/stat-tree/stat-tree-lines/single.blade.php

@@ -20,12 +20,18 @@
                         </div>
                     </div>
                     <div>
-                        <a href="" class="btn btn-sm btn-primary text-white"><i class="fas fa-network-wired"></i> View Tree</a>
+                        <a href="{{ route('practice-management.statTrees.view.dashboard', $statTreeLine->statTree) }}" class="btn btn-sm btn-primary text-white"><i class="fas fa-network-wired"></i> View Tree</a>
                     </div>
                 </div>
             </div>
             <div class="card-body">
-			<?php dump($statTreeLine); ?>
+                <div class="border p-3 mb-3">
+                <span> SELECT COUNT(*) FROM {{ $statTreeLine->statTree->model }} WHERE
+                            @foreach($statTreeLine->lineClauses as $c)
+                            {{ $c->clause->clause_text ?? '' }} @if(!$loop->last) AND @endif
+                            @endforeach</span>
+                </div>
+                <?php dump($response); ?>
             </div>
         </div>
     </div>

+ 69 - 6
resources/views/app/stat-tree/stat-trees/sub/dashboard.blade.php

@@ -1,10 +1,15 @@
 @extends('app.stat-tree.stat-trees.single')
 @section('page')
 
-<div class="row">
+<div id="app" class="row">
     @if(count($statTree->lines))
     <div class="col-12">
-        <h6 class="font-weight-bold">Lines</h6>
+        <div class="d-flex align-items-center justify-content-between mb-2">
+            <h6 class="font-weight-bold">Lines</h6>
+            <div>
+                <a href="#" @click="refreshTreeCountQueries" class="btn btn-sm btn-danger text-white"><i class="fas fa-sync-alt"></i> Refresh Counts</a>
+            </div>
+        </div>
         <div class="table-responsive">
             <table class="table table-condensed border p-0 m-0">
                 <thead class="bg-light">
@@ -13,6 +18,7 @@
                         <th class="border-bottom-0">Clauses</th>
                         <th class="border-bottom-0">Query</th>
                         <th class="border-bottom-0">Count</th>
+                        <th class="border-bottom-0">Actions</th>
                     </tr>
                 </thead>
                 <tbody>
@@ -31,11 +37,14 @@
                         <td>
                             SELECT COUNT(*) FROM {{ $statTree->model }} WHERE
                             @foreach($line->lineClauses as $c)
-                            {{ $c->clause->clause_text }} @if(!$loop->last) AND @endif
+                            {{ $c->clause->clause_text ?? '' }} @if(!$loop->last) AND @endif
                             @endforeach
                         </td>
                         <td>
-                            {{ $line->last_refresh_count }}
+                            <span id="line-{{ $line->id }}">{{ $line->last_refresh_count }}</span>
+                        </td>
+                        <td>
+                            <a href="#" data-id="{{$line->id}}" refresh-line-query>Refresh</a>
                         </td>
                     </tr>
                     @endforeach
@@ -45,7 +54,7 @@
     </div>
     @endif
 
-    <div id="app" class="col-12">
+    <div class="col-12">
         <h6 class="font-weight-bold bg-light p-3 mt-3">Replace Stat Tree Lines</h6>
         <div class="row">
             <div class="col-md-6">
@@ -108,7 +117,9 @@
             columns: [],
             maxColumn: 0,
             jsonStructure: '',
-            isAutoFilled: false
+            isAutoFilled: false,
+            refreshing: false,
+            refreshingLine: false
         },
         delimiters: ['@{{', '}}'],
         methods: {
@@ -180,6 +191,58 @@
                     }
                 }, 'json');
             },
+            refreshTreeCountQueries: function(evt) {
+                evt.preventDefault();
+                var self = this;
+                if (self.refreshing) return;
+
+                self.refreshing = true;
+                $.post("{{ route('practice-management.api.statTree.refreshTreeCountQueries') }}", {
+                    statTreeID: "{{ $statTree->id }}"
+                }, function(response) {
+                    self.refreshing = false;
+                    if (response.success) {
+                        location.href = "{{ route('practice-management.statTrees.view.dashboard', $statTree) }}";
+                    } else {
+                        toastr.error(response.message);
+                    }
+                }, 'json');
+            },
+            initRefreshLineQuery: function() {
+                var self = this;
+                
+                $('[refresh-line-query]').click(function() {
+                    var element = $(this);
+                    var id = element.data('id');
+                    if (self.refreshingLine) return;
+                    self.refreshingLine = true;
+                    element.html('<i class="fas fa-circle-notch fa-spin"></i> Refreshing...');
+                    $.post("{{ route('practice-management.api.statTreeLine.refreshCountQuery') }}", {
+                        statTreeLineID: id
+                    }, function(response) {
+                        self.refreshingLine = false;
+                        if (response.success) {
+                            $('#line-' + id).text(response.data);
+                            toastr.success('Updated value: ' + response.data);
+                        } else {
+                            toastr.error(reasponse.message);
+                        }
+                        element.html('Refresh');
+                    }, 'json');
+                });
+            },
+            init: function() {
+                this.initRefreshLineQuery();
+            }
+        },
+        mounted: function() {
+            this.init();
+        },
+        updated: function(){
+            var self = this;
+            self.$nextTick(function(){
+                
+            });
         },
         watch: {
             maxColumn(maxColumn) {

+ 5 - 3
routes/web.php

@@ -164,13 +164,13 @@ Route::middleware('pro.auth')->group(function () {
         });
         Route::name('statTrees.')->prefix('stat-trees')->group(function () {
             Route::get('', 'StatTreeController@list')->name('list');
-            Route::get('create', 'StatTreeController@createPage')->name('createPage');
+            Route::get('create', 'StatTreeController@createPage')->name('createPage');            
             Route::name('view.')->prefix('view/{statTree}')->group(function () {
                 Route::get('', 'StatTreeController@dashboard')->name('dashboard');
             });
         });
         Route::name('statTreeLines.')->prefix('stat-tree-lines/')->group(function () {
-            Route::get('', 'StatTreeLineController@list')->name('list');
+            Route::get('', 'StatTreeLineController@list')->name('list');            
             Route::name('view.')->prefix('view/{statTreeLine}')->group(function () {
                 Route::get('', 'StatTreeLineController@dashboard')->name('dashboard');
             });
@@ -191,11 +191,13 @@ Route::middleware('pro.auth')->group(function () {
                 Route::post('update-basic', 'StatTreeController@updateBasic')->name('updateBasic');
                 Route::post('refresh-count', 'StatTreeController@refreshCount')->name('refreshCount');
                 Route::post('replace-all-lines', 'StatTreeController@replaceAllLines')->name('replaceAllLines');
+                Route::post('refresh-tree-count-queries', 'StatTreeLineController@refreshTreeCountQueries')->name('refreshTreeCountQueries');              
             });
         
             //Stat Tree Line
             Route::name('statTreeLine.')->prefix('stat-tree-line/')->group(function () {
-                Route::post('replace-all-report-columns', 'StatTreeLineController@replaceAllReportColumns')->name('replaceAllReportColumns');
+                Route::post('replace-all-report-columns', 'StatTreeLineController@replaceAllReportColumns')->name('replaceAllReportColumns'); 
+                Route::post('refresh-count-query', 'StatTreeLineController@refreshCountQuery')->name('refreshCountQuery');                
             });
         });