Vijayakrishnan преди 3 години
родител
ревизия
4e74528964

+ 54 - 0
app/Http/Controllers/StatTreeLineController.php

@@ -36,6 +36,60 @@ class StatTreeLineController extends Controller
         return view('app.stat-tree.stat-tree-lines.single', compact('statTreeLine', 'response'));
     }
 
+    public function reportColumns(Request $request, StatTreeLine $line)
+    {
+        return view('app.stat-tree.stat-tree-lines.report-columns', compact('line'));
+    }
+
+    public function columnSuggest(Request $request) {
+        $term = $request->input('term') ? trim($request->input('term')) : '';
+        if (empty($term)) return '';
+        $table = $request->input('table') ? trim($request->input('table')) : '';
+        if (empty($table)) return '';
+        $table = strtolower($table);
+
+        $tables = [];
+        $columns = [];
+
+        // if single-term without spaces, single table
+        if(strpos($table, ' ') === FALSE) {
+            $tables[] = $table;
+        }
+        else {
+            $table = explode(" ", $table);
+            $tables[] = $table[0];
+            for ($i = 1; $i < count($table); $i++) {
+                if($table[$i] == 'join' && $i < count($table) - 1) {
+                    $tables[] = $table[$i+1];
+                    $i++;
+                }
+            }
+        }
+
+        for ($i = 0; $i < count($tables); $i++) {
+            $cols = DB::getSchemaBuilder()->getColumnListing($tables[$i]);
+            sort($cols);
+            $matches = array_filter($cols, function($_x) use ($term) {
+                return strpos($_x, $term) !== FALSE;
+            });
+            $matches = array_map(function($_x) use ($tables, $i) {
+                return [
+                    "text" => $tables[$i] . '.' . $_x,
+                    "label" => sanitize_state_name($_x)
+                ];
+            }, $matches);
+            $columns = array_merge($columns, $matches);
+        }
+
+        $columns = array_values($columns);
+        $columns = json_decode(json_encode($columns));
+        // dd($matches);
+        return json_encode([
+            "success" => true,
+            "data" => $columns
+        ]);
+    }
+
     public function refreshTreeCountQueries(Request $request)
     {
         $statTreeID = $request->get('statTreeID');

+ 40 - 0
app/Http/Controllers/StatTreeLineReportColumnController.php

@@ -0,0 +1,40 @@
+<?php
+
+namespace App\Http\Controllers;
+
+
+use App\Models\Clause;
+use App\Models\StatTreeLineClause;
+use App\Models\StatTreeLineReportColumn;
+use Illuminate\Http\Request;
+use App\Models\StatTree;
+use App\Models\StatTreeLine;
+use App\Models\Client;
+use App\Models\Pro;
+use Illuminate\Support\Facades\DB;
+use Ramsey\Uuid\Uuid;
+
+class StatTreeLineReportColumnController extends Controller
+{
+
+    // eps
+    public function create(Request $request) {
+        $column = new StatTreeLineReportColumn();
+        $nextId = DB::select("select nextval('stat_tree_line_report_column_id_seq')");
+        $column->id = $nextId[0]->nextval;
+        $column->uid = Uuid::uuid4();
+        $column->stat_tree_line_id = $request->input('statTreeLineId');
+        $column->label = $request->input('label');
+        $column->display_key = $request->input('displayKey');
+        $positionIndex = DB::select("select max(position_index) from stat_tree_line_report_column where stat_tree_line_id = {$column->stat_tree_line_id}");
+        $column->position_index = is_numeric($positionIndex[0]->max) ? $positionIndex[0]->max + 1 : 1;
+        $column->save();
+        return $this->pass();
+    }
+    public function remove(Request $request) {
+        $column = StatTreeLineReportColumn::where('uid', $request->input('uid'))->first();
+        if(!$column) return $this->fail('Column not found!');
+        DB::select("delete from stat_tree_line_report_column where id = {$column->id}");
+        return $this->pass();
+    }
+}

+ 9 - 0
app/Models/StatTreeLine.php

@@ -10,6 +10,11 @@ class StatTreeLine extends Model
     protected $table = 'stat_tree_line';
     public $timestamps = false;
 
+    public function getRouteKeyName()
+    {
+        return 'uid';
+    }
+
     public function lineClauses(){
         return $this->hasMany(StatTreeLineClause::class, 'stat_tree_line_id', 'id');
     }
@@ -23,6 +28,10 @@ class StatTreeLine extends Model
         return $this->hasMany(StatTreeLine::class, 'parent_stat_tree_line_id', 'id')
             ->orderBy('tree_order_position_index');
     }
+    public function reportColumns(){
+        return $this->hasMany(StatTreeLineReportColumn::class, 'stat_tree_line_id', 'id')
+            ->orderBy('position_index');
+    }
     public function displayLabel() {
         $lastStatTreeLineClause = StatTreeLineClause::where('stat_tree_line_id', $this->id)
             ->orderBy('position_index', 'DESC')

+ 18 - 0
app/Models/StatTreeLineReportColumn.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class StatTreeLineReportColumn extends Model
+{
+    protected $table = 'stat_tree_line_report_column';
+    public $timestamps = false;
+
+    public function getRouteKeyName()
+    {
+        return 'uid';
+    }
+
+}

+ 1 - 1
config/app.php

@@ -65,7 +65,7 @@ return [
 
     'hrm2_url' => env('HRM2_URL'),
 
-    'asset_version' => 41,
+    'asset_version' => 42,
 
     'temp_dir' => env('TEMP_DIR'),
 

+ 2 - 2
js-dev/stag-suggest.js

@@ -18,11 +18,11 @@
         var lastTerm = '';
         var returnedFunction = debounce(function (elem) {
             let term = elem.val();
-            let ep = $(elem).attr('stag-suggest-ep');
+            let ep = $(elem).attr('stag-suggest-ep'), extra = $(elem).attr('stag-suggest-extra')
             if(!!ep) { // remote lookup
                 if (!!term) {
 
-                    $.get(ep + '?term=' + $.trim(term), function (_data) {
+                    $.get(ep + '?term=' + $.trim(term) + (!!extra ? '&' + extra : ''), function (_data) {
 
                         /*
                         expected return format:

+ 5 - 0
public/css/style.css

@@ -682,6 +682,11 @@ input.search_field, textarea.search_field {
     top: auto;
     right: auto;
 }
+[stag-suggest-left]~.stag-suggestions-container .suggestions-outer {
+    left: 0;
+    right: auto;
+    min-width: 100%;
+}
 .suggestions-outer .suggest-item, .suggestions-outer .no-suggest-items {
     padding: 0.25rem 0.5rem;
     text-decoration: none;

+ 46 - 0
resources/views/app/stat-tree/stat-tree-lines/report-columns.blade.php

@@ -0,0 +1,46 @@
+<div class="mb-2 d-flex align-items-baseline">
+    <span class="text-secondary mr-1">Node:</span>
+    <span>{{$line->displayLabel()}}</span>
+</div>
+<div class="mb-2 d-flex align-items-baseline">
+    <span class="text-secondary mr-1 text-nowrap">Quick Add:</span>
+    <div class="flex-grow-1 position-relative">
+        <input type="text"
+               name="column"
+               data-line-id="{{$line->id}}"
+               class="form-control form-control-sm"
+               placeholder="Column name"
+               stag-suggest stag-suggest-left
+               stag-suggest-ep="/column-suggest"
+               stag-suggest-extra="table={{$line->statTree->model}}"
+               autocomplete="donotdoit">
+    </div>
+</div>
+<table class="table table-sm table-bordered table-striped">
+    <thead>
+    <tr>
+        <th class="border-bottom-0">#</th>
+        <th class="border-bottom-0">Label</th>
+        <th class="border-bottom-0">Column</th>
+        <th class="border-bottom-0 width-40px"></th>
+    </tr>
+    </thead>
+    <tbody>
+        @if(!count($line->reportColumns))
+            <tr>
+                <td colspan="3">Nothing yet!</td>
+            </tr>
+        @else
+            @foreach($line->reportColumns as $column)
+                <tr>
+                    <td>{{$column->position_index}}</td>
+                    <td>{{$column->label}}</td>
+                    <td>{{$column->display_key}}</td>
+                    <td>
+                        <a href="#" class="remove-column" data-uid="{{$column->uid}}"><i class="fa fa-trash-alt text-danger on-hover-opaque"></i></a>
+                    </td>
+                </tr>
+            @endforeach
+        @endif
+    </tbody>
+</table>

+ 63 - 3
resources/views/app/stat-tree/stat-trees/sub/edit.blade.php

@@ -14,6 +14,7 @@
                 <div class="d-flex align-items-baseline mb-2">
                     <h6 class="font-weight-bold m-0">Report Columns</h6>
                 </div>
+                <div id="report-column"></div>
             </div>
         </div>
 
@@ -31,7 +32,7 @@
                         form.find('input[name="label"]').val(label);
                     });
 
-                let treePayload = '';
+                let treePayload = '', dirty = false;
 
                 function getNodes(_ul, _indent, _lines) {
                     _ul.find('>li').each(function() {
@@ -80,6 +81,7 @@
                 }
 
                 function setDirty() {
+                    dirty = true;
                     $('.if-changed').removeClass('d-none');
                 }
 
@@ -91,14 +93,53 @@
                     }, function (response) {
                         if(!hasResponseError(response)) {
                             toastr.success('Stat tree saved!');
+                            fastReload();
                         }
                     }, 'json');
                 }
 
+                function onSelected(_e, _data) {
+                    let selected = $('#stat-tree-view-{{$statTree->id}}>ul').jstree('get_selected', false);
+                    if(selected && selected.length) {
+                        selected = $('#' + selected[0]);
+                    }
+                    if(!selected || !selected.length) return;
+                    selected = selected.find('>a.jstree-anchor>.stat-tree-line').first();
+                    if(!selected.is('[data-line-uid]')) {
+                        $('#report-column').text('Node not saved yet!');
+                        return;
+                    }
+
+                    let rptColumn = $('#report-column');
+                    rptColumn.text('Loading...');
+
+                    $.get('/practice-management/stat-tree-lines/report-columns/' + selected.attr('data-line-uid'), _data => {
+                        rptColumn.html(_data);
+
+                        initStagSuggest();
+                        rptColumn.find('input[stag-suggest][name="column"]')
+                            .off('stag-suggest-selected')
+                            .on('stag-suggest-selected', (_e, _input, _data) => {
+                                $.post("{{ route('practice-management.api.statTreeLineReportColumn.create') }}", {
+                                    _token: '{{csrf_token()}}',
+                                    statTreeLineId: $(_input).attr('data-line-id'),
+                                    label: _data.label,
+                                    displayKey: _data.text,
+                                }, function (response) {
+                                    if(!hasResponseError(response)) {
+                                        onSelected()
+                                    }
+                                }, 'json');
+                                return false;
+                            });
+                    });
+                }
+
                 $('#stat-tree-view-{{$statTree->id}}')
                     //.on('changed.jstree', setDirty)
                     .on('move_node.jstree', setDirty)
                     .on('copy_node.jstree', setDirty)
+                    .on('select_node.jstree', onSelected)
                     .jstree({
                         "core": {
                             "check_callback": true,
@@ -112,12 +153,12 @@
                             show_at_node: false,
                             items: function ($node) {
                                 return {
-                                    "cols": {
+                                    /*"cols": {
                                         "label": "<span class='text-sm'>Report Columns</span>",
                                         "action": function (obj) {
 
                                         },
-                                    },
+                                    },*/
                                     "remove": {
                                         "label": "<span class='text-sm'>Remove</span>",
                                         "action": function (obj) {
@@ -185,6 +226,11 @@
                 $('#refresh-counts')
                     .off('click')
                     .on('click', function() {
+                        if(dirty) {
+                            if(!window.confirm('Changes to the tree will be lost! Continue?')) {
+                                return false;
+                            }
+                        }
                         showMask();
                         $.post("{{ route('practice-management.api.statTree.refreshTreeCountQueries') }}", {
                             statTreeID: "{{ $statTree->id }}"
@@ -196,6 +242,20 @@
                         return false;
                     });
 
+                $(document)
+                    .off('click', '.remove-column')
+                    .on('click', '.remove-column', function() {
+                        $.post("{{ route('practice-management.api.statTreeLineReportColumn.remove') }}", {
+                            _token: '{{csrf_token()}}',
+                            uid: $(this).attr('data-uid')
+                        }, function (response) {
+                            if(!hasResponseError(response)) {
+                                onSelected()
+                            }
+                        }, 'json');
+                        return false;
+                    });
+
                 initMoes();
             }
             addMCInitializer('stat-tree-edit-page', init, '#statTreeEdit')

+ 1 - 1
resources/views/app/stat-tree/tree-edit-v2.blade.php

@@ -4,7 +4,7 @@ if (!function_exists('renderStatTreeLineNodeEdit')) {
     {
         ?>
         <li class="jstree-open">
-        <div class="d-inline-flex align-items-baseline stat-tree-line" data-line-id="{{$line->id}}">
+        <div class="d-inline-flex align-items-baseline stat-tree-line" data-line-id="{{$line->id}}" data-line-uid="{{$line->uid}}">
             <span>{{$line->displayLabel()}}</span>
             <span class="ml-2 text-secondary">({{(is_null($line->last_refresh_count) ? '-' : $line->last_refresh_count)}})</span>
         </div>

+ 11 - 0
routes/web.php

@@ -319,6 +319,7 @@ Route::middleware('pro.auth')->group(function () {
             Route::name('view.')->prefix('view/{statTree}')->group(function () {
                 Route::get('', 'StatTreeController@dashboard2')->name('dashboard');
                 Route::get('edit', 'StatTreeController@edit')->name('edit');
+
                 Route::get('old', 'StatTreeController@dashboard')->name('dashboard2');
             });
         });
@@ -327,6 +328,7 @@ Route::middleware('pro.auth')->group(function () {
             Route::name('view.')->prefix('view/{statTreeLine}')->group(function () {
                 Route::get('', 'StatTreeLineController@dashboard')->name('dashboard');
             });
+            Route::get('report-columns/{line}', 'StatTreeLineController@reportColumns')->name('report-columns');
         });
 
 
@@ -357,6 +359,12 @@ Route::middleware('pro.auth')->group(function () {
                 Route::post('create', 'StatTreeLineController@create')->name('create');
                 Route::post('remove', 'StatTreeLineController@remove')->name('remove');
             });
+
+            //Stat Tree Line Report Column
+            Route::name('statTreeLineReportColumn.')->prefix('stat-tree-line-report-column/')->group(function () {
+                Route::post('create', 'StatTreeLineReportColumnController@create')->name('create');
+                Route::post('remove', 'StatTreeLineReportColumnController@remove')->name('remove');
+            });
         });
 
     });
@@ -525,6 +533,9 @@ Route::middleware('pro.auth')->group(function () {
     // Patient suggest
     Route::get('/patients-suggest', 'HomeController@patientsSuggest');
 
+    // column suggest
+    Route::get('/column-suggest', 'StatTreeLineController@columnSuggest');
+
     // Pharmacy suggest
     Route::get('/pharmacy-suggest', 'HomeController@pharmacySuggest');