Browse Source

Merge branch 'dev-vj-notes' of rav.triplestart.com:jmudaka/stagfe2 into dev-josh-notes

= 3 years ago
parent
commit
af038b4857

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

@@ -25,6 +25,21 @@ class FDBPGController extends Controller
         return view('app.fdb-pg.fdb-med-suggest', compact('matches'));
         return view('app.fdb-pg.fdb-med-suggest', compact('matches'));
     }
     }
 
 
+    // 1.1 medication suggest (json response)
+    public function medSuggestJSON(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 as text FROM rminmid1_med_name WHERE med_status_cd = '0' AND med_name ILIKE :term ORDER BY med_name",
+            ['term' => '%' . $term . '%']
+        );
+        return json_encode([
+            "success" => true,
+            "data" => $matches
+        ]);
+    }
+
     // 2. routed meds from men name
     // 2. routed meds from men name
     public function routedMeds(Request $request)
     public function routedMeds(Request $request)
     {
     {

+ 1 - 1
config/app.php

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

+ 7 - 0
public/css/style.css

@@ -1998,4 +1998,11 @@ body.in-iframe .main-row > .sidebar {
 }
 }
 .spot-highlight {
 .spot-highlight {
     background: aliceblue !important;
     background: aliceblue !important;
+}
+.on-click-menu [menu] {
+    position: absolute;
+    display: none;
+    top: 100%;
+    right: 0;
+    z-index: 1;
 }
 }

+ 180 - 0
public/js/stag-suggest.js

@@ -0,0 +1,180 @@
+(function () {
+    window.initStagSuggest = 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) {
+            let term = elem.val();
+            if (!!term && lastTerm !== term) {
+                let ep = $(elem).attr('stag-suggest-ep');
+                $.get(ep + '?term=' + $.trim(term), function (_data) {
+
+                    /*
+                    expected return format:
+                    {
+                        success: true,
+                        data: [
+                            {
+                                x: ...,
+                                y: ...,
+                                text: ...    // "text" key is "mandatory"
+                            },
+                            {
+                                x: ...,
+                                y: ...,
+                                text: ...    // "text" key is "mandatory"
+                            },
+                            ...
+                        ]
+                    }
+                     */
+
+                    suggestionsOuter.empty();
+                    if(!hasResponseError(_data) && _data.data && _data.data.length) {
+                        for (let i = 0; i < _data.data.length; i++) {
+                            let item = $('<a native href="#" class="d-block suggest-item stag-suggest text-nowrap"/>');
+                            for(let x in _data.data[i]) {
+                                if(_data.data[i].hasOwnProperty(x) && x !== 'text') {
+                                    item.attr('data-' + x, _data.data[i][x]);
+                                }
+                            }
+                            item.data('suggest-data', _data.data[i]);
+                            item.html(_data.data[i].text);
+                            suggestionsOuter.append(item);
+                        }
+                    }
+                    else {
+                        suggestionsOuter.html('<span class="d-block no-suggest-items">No matches!</span>');
+                    }
+
+                    suggestionsOuter.removeClass('d-none');
+                }, 'json');
+                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');
+            }
+        }
+
+        $('[stag-suggest]:not([stag-suggest-initialized])').each(function () {
+            let elem = $(this);
+            elem.next('.stag-suggestions-container').remove();
+            $('<div class="stag-suggestions-container position-relative">' +
+                '<div class="suggestions-outer stag-suggestions position-absolute d-none"></div>' +
+                '</div>').insertAfter(elem);
+
+            elem
+                .off('keydown.stag-suggest')
+                .on('keydown.stag-suggest', function (e) {
+                    suggestionsOuter = $(this).next('.stag-suggestions-container').find('>.suggestions-outer');
+                    return handleKeydown($(this), e);
+                })
+                .off('keypress.stag-suggest')
+                .on('keypress.stag-suggest', function (e) {
+                    suggestionsOuter = $(this).next('.stag-suggestions-container').find('>.suggestions-outer');
+                    return handleKeypress($(this), e);
+                });
+
+            $(this).attr('stag-suggest-initialized', 1);
+        });
+
+        // on auto-suggest selection
+        $(document).off('click', '.suggest-item.stag-suggest');
+        $(document).on('click', '.suggest-item.stag-suggest', function () {
+
+            $('.suggestions-outer.stag-suggestions').addClass('d-none');
+
+            let data = $(this).data('suggest-data'),
+                label = $.trim($(this).text());
+
+            // set value
+            let input = $(this).closest('.position-relative').prev('[stag-suggest]');
+            input.val(label);
+            input.data('suggest-data', data);
+            for(let x in data) {
+                if(data.hasOwnProperty(x)) {
+                    input.attr('data-' + x, data[x]);
+                }
+            }
+            input.trigger('input');
+            input.trigger('change');
+
+            input.trigger('stag-suggest-selected', [input, data]);
+
+            return false;
+        });
+
+    }
+    addMCInitializer('stag-suggest', window.initStagSuggest);
+})();

+ 2 - 0
resources/views/app/patient/note/segment_script.blade.php

@@ -17,6 +17,7 @@
                 initRTEs(segment);
                 initRTEs(segment);
                 initSegmentMoes(segment);
                 initSegmentMoes(segment);
                 initMoes();
                 initMoes();
+                initStagSuggest();
                 if(window.segmentInitializers) {
                 if(window.segmentInitializers) {
                     let internalName = segment.attr('data-segment-template-name');
                     let internalName = segment.attr('data-segment-template-name');
                     if(window.segmentInitializers.hasOwnProperty(internalName) &&
                     if(window.segmentInitializers.hasOwnProperty(internalName) &&
@@ -169,6 +170,7 @@
             let parent = $('.segments-list');
             let parent = $('.segments-list');
             initRTEs(parent);
             initRTEs(parent);
             initSegmentMoes(parent);
             initSegmentMoes(parent);
+            initStagSuggest();
 
 
             // check and run all segment initializers
             // check and run all segment initializers
             if(window.segmentInitializers) {
             if(window.segmentInitializers) {

+ 102 - 4
resources/views/app/patient/segment-templates/_common_actions/remove-undo.php

@@ -1,8 +1,8 @@
 <?php if ($point->is_removed): ?>
 <?php if ($point->is_removed): ?>
     <?php if ($point->is_removed_due_to_entry_error): ?>
     <?php if ($point->is_removed_due_to_entry_error): ?>
-        <span class="font-weight-bold text-secondary mr-2">Entry error</span>
+        <span class="font-weight-bold text-secondary mr-2 text-nowrap">Entry error</span>
     <?php else: ?>
     <?php else: ?>
-        <span class="font-weight-bold text-secondary mr-2">Removed on intake</span>
+        <span class="font-weight-bold text-secondary mr-2 text-nowrap">Removed on intake</span>
     <?php endif; ?>
     <?php endif; ?>
     <div visit-moe>
     <div visit-moe>
         <form show url="/api/visitPoint/undoMarkRemoved" class="mcp-theme-1">
         <form show url="/api/visitPoint/undoMarkRemoved" class="mcp-theme-1">
@@ -13,7 +13,7 @@
     </div>
     </div>
 <?php else: ?>
 <?php else: ?>
     <?php if($point->added_in_note_id === $note->id): ?>
     <?php if($point->added_in_note_id === $note->id): ?>
-        <span class="font-weight-bold text-success mr-2">* Added on intake</span>
+        <span class="font-weight-bold text-success mx-2 text-nowrap">* Added on intake</span>
     <?php endif; ?>
     <?php endif; ?>
     <div visit-moe>
     <div visit-moe>
         <a start show href="#">Remove</a>
         <a start show href="#">Remove</a>
@@ -52,4 +52,102 @@
             </div>
             </div>
         </form>
         </form>
     </div>
     </div>
-<?php endif; ?>
+<?php endif; ?>
+
+<!-- additional actions -->
+<div class="ml-2 position-relative on-click-menu">
+    <span class="d-block btn btn-sm btn-default px-1 py-0 border font-weight-bold text-secondary align-middle">&hellip;</span>
+    <div menu class="bg-white border">
+
+        <!-- if removed -->
+            <!-- ACT: update removal reason memo -->
+            <!-- if entry error -->
+                <!-- ACT: mark as not entry error-->
+            <!-- if not entry error-->
+                <!-- ACT: mark as entry error-->
+        <!-- if not removed -->
+            <!-- ACT: update addition reason memo -->
+            <!-- ACT: mark added during visit -->
+
+        <?php if ($point->is_removed): ?>
+            <div class="border-bottom">
+                <div visit-moe>
+                    <a start show href="#" class="px-2 py-1 d-block text-nowrap">Update removal reason</a>
+                    <form url="/api/visitPoint/updateRemovalReasonMemo" class="mcp-theme-1">
+                        <input type="hidden" name="uid" value="<?= $point->uid ?>">
+                        <input type="hidden" name="segmentUid" value="<?= $segment->uid ?>">
+                        <p class="mb-2"><b>Update Removal Reason</b></p>
+                        <div class="mb-2">
+                            <label class="text-sm text-secondary mb-1">Removal Reason</label>
+                            <textarea name="removalReasonMemo" class="form-control form-control-sm" rows="2"></textarea>
+                        </div>
+                        <div>
+                            <button submit class="btn btn-sm btn-primary mr-2">Submit</button>
+                            <button cancel class="btn btn-sm btn-default border">Cancel</button>
+                        </div>
+                    </form>
+                </div>
+            </div>
+            <?php if ($point->is_removed_due_to_entry_error): ?>
+                <div class="border-bottom">
+                    <div visit-moe>
+                        <form show url="/api/visitPoint/setIsRemovedDueToEntryErrorToFalse" class="mcp-theme-1">
+                            <input type="hidden" name="uid" value="<?= $point->uid ?>">
+                            <input type="hidden" name="segmentUid" value="<?= $segment->uid ?>">
+                            <a submit href="#" class="text-nowrap px-2 py-1 d-block">Mark as not entry error</a>
+                        </form>
+                    </div>
+                </div>
+            <?php else: ?>
+                <div class="border-bottom">
+                    <div visit-moe>
+                        <form show url="/api/visitPoint/setIsRemovedDueToEntryErrorToTrue" class="mcp-theme-1">
+                            <input type="hidden" name="uid" value="<?= $point->uid ?>">
+                            <input type="hidden" name="segmentUid" value="<?= $segment->uid ?>">
+                            <a submit href="#" class="text-nowrap px-2 py-1 d-block">Mark as entry error</a>
+                        </form>
+                    </div>
+                </div>
+            <?php endif; ?>
+        <?php else: ?>
+            <div class="border-bottom">
+                <div visit-moe>
+                    <a start show href="#" class="px-2 py-1 d-block text-nowrap">Update addition reason</a>
+                    <form url="/api/visitPoint/updateAdditionReasonMemo" class="mcp-theme-1">
+                        <input type="hidden" name="uid" value="<?= $point->uid ?>">
+                        <input type="hidden" name="segmentUid" value="<?= $segment->uid ?>">
+                        <p class="mb-2"><b>Update Addition Reason</b></p>
+                        <div class="mb-2">
+                            <label class="text-sm text-secondary mb-1">Addition Reason</label>
+                            <textarea name="additionReasonMemo" class="form-control form-control-sm" rows="2"></textarea>
+                        </div>
+                        <div>
+                            <button submit class="btn btn-sm btn-primary mr-2">Submit</button>
+                            <button cancel class="btn btn-sm btn-default border">Cancel</button>
+                        </div>
+                    </form>
+                </div>
+            </div>
+            <div class="border-bottom">
+                <div visit-moe>
+                    <a start show href="#" class="px-2 py-1 d-block text-nowrap">Mark as added during visit</a>
+                    <form url="/api/visitPoint/markAddedDuringVisit" class="mcp-theme-1">
+                        <input type="hidden" name="uid" value="<?= $point->uid ?>">
+                        <input type="hidden" name="segmentUid" value="<?= $segment->uid ?>">
+                        <p class="mb-2"><b>Mark as added during visit</b></p>
+                        <div class="mb-2">
+                            <label class="text-sm text-secondary mb-1">Addition Reason</label>
+                            <textarea name="additionReasonMemo" class="form-control form-control-sm" rows="2"></textarea>
+                        </div>
+                        <div>
+                            <button submit class="btn btn-sm btn-primary mr-2">Submit</button>
+                            <button cancel class="btn btn-sm btn-default border">Cancel</button>
+                        </div>
+                    </form>
+                </div>
+            </div>
+        <?php endif; ?>
+
+
+    </div>
+</div>

+ 123 - 10
resources/views/app/patient/segment-templates/intake_medications/edit.blade.php

@@ -29,9 +29,9 @@ $medications = Point::getIntakePointsOfCategory($patient, 'MEDICATION', $note);
                         <div class="d-flex align-items-baseline">
                         <div class="d-flex align-items-baseline">
                             <div class="<?= $medication->is_removed ? 'strike-through' : '' ?>">
                             <div class="<?= $medication->is_removed ? 'strike-through' : '' ?>">
                                 <b><?= !!@($medication->data->name) ? @($medication->data->name) : '-' ?></b>
                                 <b><?= !!@($medication->data->name) ? @($medication->data->name) : '-' ?></b>
-                                <?= !!@($medication->data->dose) ? '/&nbsp;' . @($medication->data->dose) : '' ?>
                                 <?= !!@($medication->data->route) ? '/&nbsp;' . @($medication->data->route) : '' ?>
                                 <?= !!@($medication->data->route) ? '/&nbsp;' . @($medication->data->route) : '' ?>
-                                <?= !!@($medication->data->frequency) ? '/&nbsp;' . @($medication->data->frequency) : '' ?>
+                                <?= !!@($medication->data->dose) ? '/&nbsp;' . @($medication->data->dose) : '' ?>
+                                <?= !!@($medication->data->strength) ? '/&nbsp;' . @($medication->data->strength) : '' ?>
                             </div>
                             </div>
 
 
                             <!-- common actions -->
                             <!-- common actions -->
@@ -61,30 +61,49 @@ $medications = Point::getIntakePointsOfCategory($patient, 'MEDICATION', $note);
         </table>
         </table>
     </div>
     </div>
 
 
-    <div visit-moe class="mt-1">
+    <div visit-moe large class="mt-1">
         <a href="#" start show class="btn btn-sm btn btn-outline-primary">+ Add medication patient is ALREADY taking, prior to this visit</a>
         <a href="#" start show class="btn btn-sm btn btn-outline-primary">+ Add medication patient is ALREADY taking, prior to this visit</a>
         <form url="/api/visitPoint/addTopLevelOnIntake" class="mcp-theme-1">
         <form url="/api/visitPoint/addTopLevelOnIntake" class="mcp-theme-1">
             <input type="hidden" name="segmentUid" value="<?= $segment->uid ?>">
             <input type="hidden" name="segmentUid" value="<?= $segment->uid ?>">
             <input type="hidden" name="category" value="MEDICATION">
             <input type="hidden" name="category" value="MEDICATION">
             <input type="hidden" name="data">
             <input type="hidden" name="data">
 
 
+            <input type="hidden" data-name="medNameId">
+            <input type="hidden" data-name="route">
+            <input type="hidden" data-name="dose">
+            <input type="hidden" data-name="strength">
+            <input type="hidden" data-name="medId">
+
             <p class="mb-2"><b>Add Medication (on intake)</b></p>
             <p class="mb-2"><b>Add Medication (on intake)</b></p>
 
 
             <div class="mb-2">
             <div class="mb-2">
                 <label class="text-sm text-secondary mb-1">Name</label>
                 <label class="text-sm text-secondary mb-1">Name</label>
-                <input type="text" data-name="name" class="form-control form-control-sm">
+                <input type="text"
+                       data-name="name"
+                       class="form-control form-control-sm"
+                       stag-suggest
+                       stag-suggest-ep="/fdb-med-suggest/json">
             </div>
             </div>
             <div class="mb-2">
             <div class="mb-2">
-                <label class="text-sm text-secondary mb-1">Dose</label>
-                <input type="text" data-name="dose" class="form-control form-control-sm">
+                <label class="text-sm text-secondary mb-1">Route</label>
+                <select data-name="routedMedId"
+                        class="form-control form-control-sm"
+                        disabled>
+                </select>
             </div>
             </div>
             <div class="mb-2">
             <div class="mb-2">
-                <label class="text-sm text-secondary mb-1">Route</label>
-                <input type="text" data-name="route" class="form-control form-control-sm">
+                <label class="text-sm text-secondary mb-1">Dosage</label>
+                <select data-name="routedDosageFormMedId"
+                        class="form-control form-control-sm"
+                        disabled>
+                </select>
             </div>
             </div>
             <div class="mb-2">
             <div class="mb-2">
-                <label class="text-sm text-secondary mb-1">Frequency</label>
-                <input type="text" data-name="frequency" class="form-control form-control-sm">
+                <label class="text-sm text-secondary mb-1">Strength</label>
+                <select data-name="gcnSeqno"
+                        class="form-control form-control-sm"
+                        disabled>
+                </select>
             </div>
             </div>
             <div class="mb-2">
             <div class="mb-2">
                 <label class="text-sm text-secondary mb-1">Description</label>
                 <label class="text-sm text-secondary mb-1">Description</label>
@@ -99,3 +118,97 @@ $medications = Point::getIntakePointsOfCategory($patient, 'MEDICATION', $note);
     </div>
     </div>
 </div>
 </div>
 
 
+
+<script>
+    window.segmentInitializers.<?= $segment->segmentTemplate->internal_name ?> = function() {
+        // any JS can come here
+        // will be run on page-load as well as whenever this segment is refreshed
+
+        $('input[stag-suggest][data-name="name"]')
+            .off('stag-suggest-selected')
+            .on('stag-suggest-selected', (_e, _input, _data) => {
+
+                // _input is the textbox
+                // _data is {med_name_id: "50567", text: "Children's Tylenol"}
+
+                let medNameID = _data.med_name_id;
+                $('input[data-name="medNameId"]').val(medNameID);
+
+                let routeSelect = $('[data-name="routedMedId"]').empty().prop('disabled', true);
+                let dosageSelect = $('[data-name="routedDosageFormMedId"]').empty().prop('disabled', true);
+                let strengthSelect = $('[data-name="gcnSeqno"]').empty().prop('disabled', true);
+
+                $.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>')
+                    }
+                    routeSelect.prop('disabled', false);
+                    if(_data.length === 1) {
+                        routeSelect.val(_data[0].routed_med_id).trigger('change');
+                    }
+                }, 'json');
+            });
+
+        // on route selection
+        $(document).off('change', '[data-name="routedMedId"]');
+        $(document).on('change', '[data-name="routedMedId"]', function () {
+
+            // clear
+            let dosageSelect = $('[data-name="routedDosageFormMedId"]').empty().prop('disabled', true);
+            let strengthSelect = $('[data-name="gcnSeqno"]').empty().prop('disabled', true);
+            let routedMedID = $(this).val();
+            $('input[data-name="route"]').val($(this).find('option:selected').text());
+
+            $.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>')
+                }
+                dosageSelect.prop('disabled', false);
+                if(_data.length === 1) {
+                    dosageSelect.val(_data[0].routed_dosage_form_med_id).trigger('change');
+                }
+            }, 'json');
+        });
+
+        // on dosage selection
+        $(document).off('change', '[data-name="routedDosageFormMedId"]');
+        $(document).on('change', '[data-name="routedDosageFormMedId"]', function () {
+
+            // clear
+            let strengthSelect = $('[data-name="gcnSeqno"]').empty().prop('disabled', true);
+            let dosageFormMedID = $(this).val();
+            $('input[data-name="dose"]').val($(this).find('option:selected').text());
+
+            $.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 data-medid="' + _data[i].medid + '" value="' + _data[i].gcn_seqno + '">' + _data[i].med_medid_desc + '</option>')
+                }
+                strengthSelect.prop('disabled', false);
+                if(_data.length === 1) {
+                    strengthSelect.val(_data[0].gcn_seqno).trigger('change');
+                    $('input[data-name="description"]').focus();
+                }
+            }, 'json');
+        });
+
+        // on strength (medid) selection
+        $(document).off('change', '[data-name="gcnSeqno"]');
+        $(document).on('change', '[data-name="gcnSeqno"]', function () {
+
+            $('input[data-name="medId"]').val($(this).find('option:selected').attr('data-medid'));
+            $('input[data-name="strength"]').val($(this).find('option:selected').text());
+
+        });
+
+    };
+</script>
+

+ 17 - 0
resources/views/layouts/template.blade.php

@@ -319,6 +319,22 @@
                     return false;
                     return false;
                 });
                 });
 
 
+            $(document)
+                .off('click.on-click-menu', '.on-click-menu>span')
+                .on('click.on-click-menu', '.on-click-menu>span', function() {
+                    $(this).parent().find('[menu]').first().show();
+                    return false;
+                });
+
+            $('body')
+                .off('mousedown.on-click-menu-outside-click')
+                .on('mousedown.on-click-menu-outside-click', function (e) {
+                    if ($(e.target).closest('.on-click-menu').length) {
+                        return;
+                    }
+                    $('.on-click-menu [menu]').hide();
+                });
+
             function onQueryChange() {
             function onQueryChange() {
                 returnedFunction();
                 returnedFunction();
             }
             }
@@ -332,6 +348,7 @@
     </script>
     </script>
     <script src="/js/click-to-copy.js?v={{config('app.asset_version')}}"></script>
     <script src="/js/click-to-copy.js?v={{config('app.asset_version')}}"></script>
     <script src="/js/stag-popup.js?v={{config('app.asset_version')}}"></script>
     <script src="/js/stag-popup.js?v={{config('app.asset_version')}}"></script>
+    <script src="/js/stag-suggest.js?v={{config('app.asset_version')}}"></script>
     <script src="/js/option-list.js?v={{config('app.asset_version')}}"></script>
     <script src="/js/option-list.js?v={{config('app.asset_version')}}"></script>
     <script src="/js/show-on-click.js?v={{config('app.asset_version')}}"></script>
     <script src="/js/show-on-click.js?v={{config('app.asset_version')}}"></script>
     @include('app/pdf/viewer')
     @include('app/pdf/viewer')

+ 1 - 0
routes/web.php

@@ -384,6 +384,7 @@ Route::middleware('pro.auth')->group(function () {
     // fdb playground
     // fdb playground
     Route::get('/fdb-pg-rx', 'FDBPGController@rx')->name('fdb-pg-rx');
     Route::get('/fdb-pg-rx', 'FDBPGController@rx')->name('fdb-pg-rx');
     Route::get('/fdb-med-suggest', 'FDBPGController@medSuggest');
     Route::get('/fdb-med-suggest', 'FDBPGController@medSuggest');
+    Route::get('/fdb-med-suggest/json', 'FDBPGController@medSuggestJSON');
     Route::get('/fdb-routed-meds', 'FDBPGController@routedMeds');
     Route::get('/fdb-routed-meds', 'FDBPGController@routedMeds');
     Route::get('/fdb-routed-dosages', 'FDBPGController@routedDosages');
     Route::get('/fdb-routed-dosages', 'FDBPGController@routedDosages');
     Route::get('/fdb-meds', 'FDBPGController@meds');
     Route::get('/fdb-meds', 'FDBPGController@meds');