Pārlūkot izejas kodu

FDB Playground (wip)

Vijayakrishnan 3 gadi atpakaļ
vecāks
revīzija
d5d62b5e34

+ 59 - 0
app/Http/Controllers/FDBPGController.php

@@ -0,0 +1,59 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+
+class FDBPGController extends Controller
+{
+
+    public function index(Request $request)
+    {
+        return view('app.fdb-pg.index');
+    }
+
+    public function medSuggest(Request $request)
+    {
+        $term = $request->input('term') ? trim($request->input('term')) : '';
+        if (empty($term)) return '';
+        $matches = DB::connection('pgsql_fdb')->select(
+            "SELECT med_name_id, med_name FROM rminmid1_med_name WHERE med_status_cd = '0' AND med_name ILIKE :term ORDER BY med_name",
+            ['term' => '%' . $term . '%']
+        );
+        return view('app.fdb-pg.fdb-med-suggest', compact('matches'));
+    }
+
+    public function routedMeds(Request $request)
+    {
+        $medNameID = $request->input('med-name-id') ? trim($request->input('med-name-id')) : '';
+        if (empty($medNameID)) return '';
+        $matches = DB::connection('pgsql_fdb')->select(
+            "SELECT routed_med_id, med_routed_med_id_desc FROM rmirmid1_routed_med WHERE med_status_cd = '0' AND med_name_id = :medNameID ORDER BY med_routed_med_id_desc",
+            ['medNameID' => $medNameID]
+        );
+        return json_encode($matches);
+    }
+
+    public function routedDosages(Request $request)
+    {
+        $routedMedID = $request->input('routed-med-id') ? trim($request->input('routed-med-id')) : '';
+        if (empty($routedMedID)) return '';
+        $matches = DB::connection('pgsql_fdb')->select(
+            "SELECT routed_dosage_form_med_id, med_routed_df_med_id_desc FROM rmidfid1_routed_dose_form_med WHERE med_status_cd = '0' AND routed_med_id = :routedMedID ORDER BY med_routed_df_med_id_desc",
+            ['routedMedID' => $routedMedID]
+        );
+        return json_encode($matches);
+    }
+
+    public function meds(Request $request)
+    {
+        $dosageFormMedId = $request->input('dosage-form-med-id') ? trim($request->input('dosage-form-med-id')) : '';
+        if (empty($dosageFormMedId)) return '';
+        $matches = DB::connection('pgsql_fdb')->select(
+            "SELECT medid, med_medid_desc FROM rmiid1_med WHERE med_status_cd = '0' AND routed_dosage_form_med_id = :dosageFormMedId ORDER BY med_medid_desc",
+            ['dosageFormMedId' => $dosageFormMedId]
+        );
+        return json_encode($matches);
+    }
+}

+ 15 - 0
config/database.php

@@ -78,6 +78,21 @@ return [
             'sslmode' => 'prefer',
         ],
 
+        'pgsql_fdb' => [
+            'driver' => 'pgsql',
+            'url' => env('DATABASE_URL'),
+            'host' => env('DB_HOST', '127.0.0.1'),
+            'port' => env('DB_PORT', '5432'),
+            'database' => env('DB_DATABASE_FDB', 'forge'),
+            'username' => env('DB_USERNAME_FDB', 'forge'),
+            'password' => env('DB_PASSWORD_FDB', ''),
+            'charset' => 'utf8',
+            'prefix' => '',
+            'prefix_indexes' => true,
+            'schema' => 'public',
+            'sslmode' => 'prefer',
+        ],
+
         'sqlsrv' => [
             'driver' => 'sqlsrv',
             'url' => env('DATABASE_URL'),

+ 12 - 0
resources/views/app/fdb-pg/fdb-med-suggest.blade.php

@@ -0,0 +1,12 @@
+@if(!count($matches))
+    <span class="d-block no-suggest-items">No matched!</span>
+@endif
+<?php $activeSet = false; ?>
+@foreach($matches as $match)
+    <a native class="d-block suggest-item fdb-suggest text-nowrap {{ $activeSet ? '' : 'active'  }}" href="#"
+       data-med-name-id="{{$match->med_name_id}}">
+        {{$match->med_name}}
+    </a>
+    <?php $activeSet = true; ?>
+@endforeach
+

+ 249 - 0
resources/views/app/fdb-pg/index.blade.php

@@ -0,0 +1,249 @@
+@extends ('layouts/template')
+
+@section('content')
+
+    <div class="p-3 mcp-theme-1" id="fdb-pg">
+        <div class="card">
+
+            <div class="card-header px-3 py-2 d-flex align-items-center">
+                <strong class="mr-4">
+                    FDB Playground
+                </strong>
+            </div>
+            <div class="card-body px-3 py-4">
+                <div class="row">
+                    <div class="col-4 min-width-300px">
+                        <div class="mb-3 d-flex align-items-center">
+                            <label class="m-0 width-100px">Search</label>
+                            <div class="flex-grow-1">
+                                <input type="text" class="form-control form-control-sm min-width-unset"
+                                       fdb-med-suggest-search fdb-suggest-group="1">
+                            </div>
+                        </div>
+                        <div class="mb-3 d-flex align-items-center">
+                            <label class="m-0 width-100px">Route</label>
+                            <div class="flex-grow-1">
+                                <select class="form-control form-control-sm min-width-unset"
+                                       fdb-med-suggest-route fdb-suggest-group="1"
+                                       disabled>
+                                </select>
+                            </div>
+                        </div>
+                        <div class="mb-3 d-flex align-items-center">
+                            <label class="m-0 width-100px">Dosage</label>
+                            <div class="flex-grow-1">
+                                <select class="form-control form-control-sm min-width-unset"
+                                        fdb-med-suggest-dosage fdb-suggest-group="1"
+                                        disabled>
+                                </select>
+                            </div>
+                        </div>
+                        <div class="mb-3 d-flex align-items-center">
+                            <label class="m-0 width-100px">Strength</label>
+                            <div class="flex-grow-1">
+                                <select class="form-control form-control-sm min-width-unset"
+                                        fdb-med-suggest-strength fdb-suggest-group="1"
+                                        disabled>
+                                </select>
+                            </div>
+                        </div>
+                        <div>More...</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <script>
+        (function() {
+
+            let suggestionsOuter = null;
+
+            const debounce = (func, wait) => {
+                let timeout;
+                return function executedFunction(...args) {
+                    const later = () => {
+                        clearTimeout(timeout);
+                        func(...args);
+                    };
+                    clearTimeout(timeout);
+                    timeout = setTimeout(later, wait);
+                };
+            };
+
+            var lastTerm = '';
+            var returnedFunction = debounce(function (elem) {
+                var term = elem.val();
+                if (!!term && lastTerm !== term) {
+                    $.get('/fdb-med-suggest?term=' + $.trim(term), function (_data) {
+                        suggestionsOuter.html(_data).removeClass('d-none');
+                    });
+                    lastTerm = term;
+                } else {
+                    suggestionsOuter.addClass('d-none');
+                }
+            }, 250);
+
+            function handleKeydown(elem, e) {
+                let term = $.trim(elem.val());
+                let activeItem = suggestionsOuter.find('.suggest-item.active');
+                switch (e.which) {
+                    case 27:
+                        suggestionsOuter.addClass('d-none');
+                        return false;
+                    case 38:
+                        if (activeItem.prev().length) {
+                            activeItem.prev()
+                                .addClass('active')
+                                .siblings().removeClass('active');
+                            activeItem = suggestionsOuter.find('.suggest-item.active');
+                            if (activeItem.length) {
+                                activeItem[0].scrollIntoView();
+                            }
+                        }
+                        return false;
+                    case 40:
+                        if (activeItem.next().length) {
+                            activeItem.next()
+                                .addClass('active')
+                                .siblings().removeClass('active');
+                            activeItem = suggestionsOuter.find('.suggest-item.active');
+                            if (activeItem.length) {
+                                activeItem[0].scrollIntoView();
+                            }
+                        }
+                        return false;
+                    case 13:
+                        if (activeItem.length) {
+                            activeItem.first().click();
+                        }
+                        return false;
+                    default:
+                        if (!!term) {
+                            suggestionsOuter
+                                .html('<span class="d-block no-suggest-items">Searching...</span>')
+                                .removeClass('d-none');
+                            returnedFunction(elem);
+                        } else {
+                            suggestionsOuter.addClass('d-none');
+                        }
+                        break;
+                }
+            }
+
+            function handleKeypress(elem, e) {
+                var term = $.trim(elem.val());
+                if (!!term) {
+                    suggestionsOuter
+                        .html('<span class="d-block no-suggest-items">Searching...</span>')
+                        .removeClass('d-none');
+                    returnedFunction(elem);
+                } else {
+                    suggestionsOuter.addClass('d-none');
+                }
+            }
+
+            addMCInitializer('fdb-pg', function() {
+
+                $('[fdb-med-suggest-search]:not([fdb-suggest-initialized])').each(function() {
+                    let elem = $(this);
+                    elem.next('.fdb-suggestions-container').remove();
+                    $('<div class="fdb-suggestions-container position-relative" fdb-suggest-group="' + elem.attr('fdb-suggest-group') + '">' +
+                        '<div class="suggestions-outer fdb-suggestions position-absolute d-none"></div>' +
+                        '</div>').insertAfter(elem);
+
+                    elem
+                        .off('keydown.fdb-suggest')
+                        .on('keydown.fdb-suggest', function (e) {
+                            suggestionsOuter = $(this).next('.fdb-suggestions-container').find('>.suggestions-outer');
+                            return handleKeydown($(this), e);
+                        })
+                        .off('keypress.fdb-suggest')
+                        .on('keypress.fdb-suggest', function (e) {
+                            suggestionsOuter = $(this).next('.fdb-suggestions-container').find('>.suggestions-outer');
+                            return handleKeypress($(this), e);
+                        });
+
+                    $(this).attr('fdb-suggest-initialized', 1);
+                });
+
+                // on auto-suggest selection
+                $(document).off('click', '.suggest-item.fdb-suggest[data-med-name-id]');
+                $(document).on('click', '.suggest-item.fdb-suggest[data-med-name-id]', function () {
+
+                    $('.suggestions-outer.fdb-suggestions').addClass('d-none');
+
+                    let medNameID = $(this).attr('data-med-name-id'),
+                        label = $.trim($(this).text()),
+                        group = $(this).closest('.fdb-suggestions-container').attr('fdb-suggest-group');
+
+                    // set value
+                    let input = $(this).closest('.position-relative').prev('[fdb-med-suggest-search]');
+                    input.val(label);
+                    input.attr('data-med-name-id', medNameID);
+                    input.trigger('input');
+                    input.trigger('change');
+
+                    $(document).trigger('fdb-med-changed', [group]);
+
+                    return false;
+                });
+
+                // med changed, update routes
+                $(document).off('fdb-med-changed');
+                $(document).on('fdb-med-changed', function(e, group) {
+                    let routeSelect = $('[fdb-med-suggest-route][fdb-suggest-group='+group+']').empty().prop('disabled', true);
+                    let dosageSelect = $('[fdb-med-suggest-dosage][fdb-suggest-group='+group+']').empty().prop('disabled', true);
+                    let strengthSelect = $('[fdb-med-suggest-strength][fdb-suggest-group='+group+']').empty().prop('disabled', true);
+                    let medNameID = $('[fdb-med-suggest-search][fdb-suggest-group='+group+']').attr('data-med-name-id');
+                    $.get('/fdb-routed-meds?med-name-id=' + medNameID, _data => {
+                        routeSelect
+                            .empty()
+                            .append('<option value="">-- select --</option>');
+                        for (let i = 0; i < _data.length; i++) {
+                            routeSelect.append('<option value="' + _data[i].routed_med_id + '">' + _data[i].med_routed_med_id_desc + '</option>')
+                        }
+                    }, 'json');
+                    routeSelect.prop('disabled', false);
+                });
+
+                // on route selection
+                $(document).off('change', '[fdb-med-suggest-route]');
+                $(document).on('change', '[fdb-med-suggest-route]', function () {
+                    let group = $(this).attr('fdb-suggest-group');
+                    let dosageSelect = $('[fdb-med-suggest-dosage][fdb-suggest-group='+group+']').empty().prop('disabled', true);
+                    let strengthSelect = $('[fdb-med-suggest-strength][fdb-suggest-group='+group+']').empty().prop('disabled', true);
+                    let routedMedID = $('[fdb-med-suggest-route][fdb-suggest-group='+$(this).attr('fdb-suggest-group')+']').val();
+                    $.get('/fdb-routed-dosages?routed-med-id=' + routedMedID, _data => {
+                        dosageSelect
+                            .empty()
+                            .append('<option value="">-- select --</option>');
+                        for (let i = 0; i < _data.length; i++) {
+                            dosageSelect.append('<option value="' + _data[i].routed_dosage_form_med_id + '">' + _data[i].med_routed_df_med_id_desc + '</option>')
+                        }
+                    }, 'json');
+                    dosageSelect.prop('disabled', false);
+                });
+
+                // on dosage selection
+                $(document).off('change', '[fdb-med-suggest-dosage]');
+                $(document).on('change', '[fdb-med-suggest-dosage]', function () {
+                    let group = $(this).attr('fdb-suggest-group');
+                    let strengthSelect = $('[fdb-med-suggest-strength][fdb-suggest-group='+group+']').empty().prop('disabled', true);
+                    let dosageFormMedID = $('[fdb-med-suggest-dosage][fdb-suggest-group='+$(this).attr('fdb-suggest-group')+']').val();
+                    $.get('/fdb-meds?dosage-form-med-id=' + dosageFormMedID, _data => {
+                        strengthSelect
+                            .empty()
+                            .append('<option value="">-- select --</option>');
+                        for (let i = 0; i < _data.length; i++) {
+                            strengthSelect.append('<option value="' + _data[i].medid + '">' + _data[i].med_medid_desc + '</option>')
+                        }
+                    }, 'json');
+                    strengthSelect.prop('disabled', false);
+                });
+
+            }, '#fdb-pg');
+        }).call(window);
+    </script>
+
+@endsection

+ 7 - 0
routes/web.php

@@ -321,6 +321,13 @@ Route::middleware('pro.auth')->group(function () {
     Route::post("/back_to_admin_pro", 'HomeController@backToAdminPro')->name('back-to-admin-pro');
 
     Route::get('/remote-monitoring-measurements/{careMonth}', 'PracticeManagementController@remoteMonitoringMeasurements')->name('remote-monitoring-measurements');
+
+    // fdb playground
+    Route::get('/fdb-pg', 'FDBPGController@index')->name('fdb-pg');
+    Route::get('/fdb-med-suggest', 'FDBPGController@medSuggest');
+    Route::get('/fdb-routed-meds', 'FDBPGController@routedMeds');
+    Route::get('/fdb-routed-dosages', 'FDBPGController@routedDosages');
+    Route::get('/fdb-meds', 'FDBPGController@meds');
 });
 
 Route::post("/process_form_submit", 'NoteController@processFormSubmit')->name('process_form_submit');