Browse Source

Merge branch 'dev' of rav.triplestart.com:jmudaka/stagfe2 into dev

Josh 4 years ago
parent
commit
74ec4829a2
24 changed files with 1734 additions and 104 deletions
  1. 62 0
      app/Http/Controllers/PatientController.php
  2. 23 1
      public/css/style.css
  3. 249 0
      resources/views/app/patient/action-items-equipment-single.blade.php
  4. 13 0
      resources/views/app/patient/action-items-equipment.blade.php
  5. 386 0
      resources/views/app/patient/action-items-erx-single.blade.php
  6. 13 0
      resources/views/app/patient/action-items-erx.blade.php
  7. 269 0
      resources/views/app/patient/action-items-imaging-single.blade.php
  8. 13 0
      resources/views/app/patient/action-items-imaging.blade.php
  9. 269 0
      resources/views/app/patient/action-items-lab-single.blade.php
  10. 13 0
      resources/views/app/patient/action-items-lab.blade.php
  11. 13 0
      resources/views/app/patient/action-items-other.blade.php
  12. 45 14
      resources/views/app/patient/partials/equipment.blade.php
  13. 79 26
      resources/views/app/patient/partials/erx.blade.php
  14. 45 13
      resources/views/app/patient/partials/imaging.blade.php
  15. 44 12
      resources/views/app/patient/partials/lab.blade.php
  16. 4 3
      resources/views/app/patient/partials/other.blade.php
  17. 3 13
      resources/views/app/patient/partials/ticket_action_links.blade.php
  18. 84 0
      resources/views/app/patient/partials/ticket_vue_collab_card.blade.php
  19. 33 0
      resources/views/app/patient/partials/ticket_vue_collab_column.blade.php
  20. 2 1
      resources/views/app/patient/partials/ticket_vue_data.blade.php
  21. 23 12
      resources/views/app/patient/partials/ticket_vue_methods.blade.php
  22. 31 5
      resources/views/layouts/patient.blade.php
  23. 8 4
      resources/views/layouts/template.blade.php
  24. 10 0
      routes/web.php

+ 62 - 0
app/Http/Controllers/PatientController.php

@@ -14,6 +14,7 @@ use App\Models\NoteTemplate;
 use App\Models\Pro;
 use App\Models\Program;
 use App\Models\SectionTemplate;
+use App\Models\Ticket;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\File;
 
@@ -43,6 +44,67 @@ class PatientController extends Controller
         return view('app.patient.action-items', compact('patient', 'facilities'));
     }
 
+    public function actionItemsErx(Request $request, Client $patient, $filter = 'open')
+    {
+        $allPros = Pro::all();
+        $facilities = Facility::where('is_active', true)->get();
+        return view('app.patient.action-items-erx', compact('patient', 'facilities', 'filter', 'allPros'));
+    }
+
+    public function actionItemsLab(Request $request, Client $patient, $filter = 'open')
+    {
+        $allPros = Pro::all();
+        $facilities = Facility::where('is_active', true)->get();
+        return view('app.patient.action-items-lab', compact('patient', 'facilities', 'filter', 'allPros'));
+    }
+
+    public function actionItemsImaging(Request $request, Client $patient, $filter = 'open')
+    {
+        $allPros = Pro::all();
+        $facilities = Facility::where('is_active', true)->get();
+        return view('app.patient.action-items-imaging', compact('patient', 'facilities', 'filter', 'allPros'));
+    }
+
+    public function actionItemsEquipment(Request $request, Client $patient, $filter = 'open')
+    {
+        $allPros = Pro::all();
+        $facilities = Facility::where('is_active', true)->get();
+        return view('app.patient.action-items-equipment', compact('patient', 'facilities', 'filter', 'allPros'));
+    }
+
+    public function actionItemsOther(Request $request, Client $patient, $filter = 'open')
+    {
+        $allPros = Pro::all();
+        $facilities = Facility::where('is_active', true)->get();
+        return view('app.patient.action-items-other', compact('patient', 'facilities', 'filter', 'allPros'));
+    }
+
+    public function actionItemsErxSingle(Request $request, Client $patient, Ticket $ticket) {
+        $allPros = Pro::all();
+        $facilities = Facility::where('is_active', true)->get();
+        return view('app.patient.action-items-erx-single', compact('patient', 'facilities', 'allPros', 'ticket'));
+    }
+    public function actionItemsLabSingle(Request $request, Client $patient, Ticket $ticket) {
+        $allPros = Pro::all();
+        $facilities = Facility::where('is_active', true)->get();
+        return view('app.patient.action-items-lab-single', compact('patient', 'facilities', 'allPros', 'ticket'));
+    }
+    public function actionItemsImagingSingle(Request $request, Client $patient, Ticket $ticket) {
+        $allPros = Pro::all();
+        $facilities = Facility::where('is_active', true)->get();
+        return view('app.patient.action-items-imaging-single', compact('patient', 'facilities', 'allPros', 'ticket'));
+    }
+    public function actionItemsEquipmentSingle(Request $request, Client $patient, Ticket $ticket) {
+        $allPros = Pro::all();
+        $facilities = Facility::where('is_active', true)->get();
+        return view('app.patient.action-items-equipment-single', compact('patient', 'facilities', 'allPros', 'ticket'));
+    }
+    public function actionItemsOtherSingle(Request $request, Client $patient, Ticket $ticket) {
+        $allPros = Pro::all();
+        $facilities = Facility::where('is_active', true)->get();
+        return view('app.patient.action-items-other-single', compact('patient', 'facilities', 'allPros', 'ticket'));
+    }
+
     public function intake(Request $request, Client $patient )
     {
         $files = File::allFiles(resource_path('views/app/intake-templates'));

+ 23 - 1
public/css/style.css

@@ -58,6 +58,24 @@
 .sidebar .nav-item {
     margin-right: 0;
 }
+.sidebar .nav-item .nav-child-list {
+    list-style: none;
+}
+.sidebar .nav-item .nav-child-list .nav-item .nav-link {
+    padding-left: 2.75rem;
+}
+.sidebar .if-not-collapsed, .sidebar .if-collapsed {
+    display: none;
+}
+.sidebar .nav-item.nav-child-collapsed .if-collapsed {
+    display: block;
+}
+.sidebar .nav-item:not(.nav-child-collapsed) .if-not-collapsed {
+    display: block;
+}
+.sidebar .nav-item.nav-child-collapsed .nav-child-list {
+    display: none;
+}
 .navbar-dark .nav-item .nav-link {
   color: #fff;
 }
@@ -151,7 +169,11 @@ body.stag_rhs_collapsed .app-right-panel {
 .mcp-theme-1 .nav-link:hover {
     background: #e3e3e394;
 }
+.mcp-theme-1 .nav-link {
+    border-top: 1px solid transparent;
+}
 .mcp-theme-1 .nav-link.active {
+    border-top: 1px solid #f8f9fa;
     background: #e2e2e2;
 }
 .mcp-theme-1 .text-sm {
@@ -405,7 +427,7 @@ input.search_field, textarea.search_field {
         top: 55px;
         z-index: 8;
         height: calc(100% - 55px);
-        overflow-y: auto;
+        overflow-y: overlay;
     }
     .main-row {
         padding-left: 180px;

+ 249 - 0
resources/views/app/patient/action-items-equipment-single.blade.php

@@ -0,0 +1,249 @@
+@extends ('layouts.patient')
+<?php
+/** @var \App\Models\Client $patient */
+?>
+@section('inner-content')
+
+    <div class="mb-3">
+
+        <div id="equipmentSingleApp" v-cloak>
+            <div class="d-flex align-items-center pb-2">
+                <h4 class="font-weight-bold m-0 font-size-14"><i class="fa fa-prescription mr-2"></i>Equipment Ticket
+                    <span v-if="!item.is_open" class="text-secondary font-weight-bold opacity-60">(Closed)</span>
+                </h4>
+                <span class="mx-3 text-secondary">|</span>
+                <a class="c-pointer" v-if="item.is_open" v-on:click.prevent="closeItem(item)">Close</a>
+                <a class="c-pointer" v-if="!item.is_open" v-on:click.prevent="openItem(item)">Re-open</a>
+                <span class="mx-3 text-secondary">|</span>
+                <a class="py-0 font-weight-normal c-pointer" v-on:click.prevent="showPopup('equipment-popup', item)">Edit</a>
+            </div>
+
+            <div class="row mt-2 mb-3">
+                <div class="col-6 pr-0">
+                    <div class="card bg-light mb-3">
+                        <div class="card-body">
+                            <div class="d-flex align-items-start flex-nowrap mb-2">
+                                <span class="width-100px text-secondary text-sm">Created</span>
+                                <span class="font-weight-bold">@{{ item.created_at }}</span>
+                            </div>
+                            <div class="d-flex align-items-start flex-nowrap mb-2">
+                                <span class="width-100px text-secondary text-sm">Items</span>
+                                <span class="font-weight-bold" v-html="item.items && Array.isArray(item.items) ? item.items.join(', ') : '-'"></span>
+                            </div>
+                            <div class="d-flex align-items-start flex-nowrap mb-2">
+                                <span class="width-100px text-secondary text-sm">Purpose</span>
+                                <span class="font-weight-bold">@{{ item.purpose }}</span>
+                            </div>
+                            <div class="d-flex align-items-start flex-nowrap">
+                                <span class="width-100px text-secondary text-sm">Memo</span>
+                                <span class="font-weight-bold">@{{ item.memo ? item.memo : '-' }}</span>
+                            </div>
+                        </div>
+                    </div>
+                    @include('app.patient.partials.ticket_action_links')
+                </div>
+                <div class="col-6">
+                    @include('app.patient.partials.ticket_vue_collab_card')
+                </div>
+            </div>
+
+            <div class="stag-popup stag-popup-sm mcp-theme-1" stag-popup-key="equipment-popup">
+                <form method="POST" action="">
+                    <h3 class="stag-popup-title mb-2">
+                        <span>@{{ popupMode === 'add' ? 'Add Equipment' : 'Edit Equipment' }}</span>
+                        <a href="#" class="ml-auto text-secondary"
+                           onclick="return closeStagPopup()"><i class="fa fa-times-circle"></i></a>
+                    </h3>
+                    <div class="mb-2">
+                        <div class="d-flex align-items-center mb-1">
+                            <label class="text-sm text-secondary mb-0">Items</label>
+                            <span class="text-sm mx-2 text-secondary">|</span>
+                            <a href="#" class="text-sm" v-on:click.prevent="popupItem.items.push('')">Add</a>
+                        </div>
+                        <div class="d-flex align-items-center mb-2" v-for="(item, itemIndex) in popupItem.items">
+                            <div class="position-relative flex-grow-1">
+                                <input required type="text" data-option-list v-model="popupItem.items[itemIndex]" class="form-control form-control-sm">
+                                <div class="data-option-list">
+                                    <div>Weight Scale</div>
+                                    <div>Pulse Ox</div>
+                                    <div>Temperature Gun</div>
+                                </div>
+                            </div>
+                            <a v-if="popupItem.items.length > 1" class="ml-2 text-danger" href="#" v-on:click.prevent="popupItem.items.splice(itemIndex, 1)">
+                                <i class="fa fa-trash-alt"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="mb-2">
+                        <label class="text-sm text-secondary mb-1">Purpose</label>
+                        <input type="text" v-model="popupItem.purpose" class="form-control form-control-sm">
+                    </div>
+                    <div class="mb-2">
+                        <label class="text-sm text-secondary mb-1">Memo</label>
+                        <input type="text" v-model="popupItem.memo" class="form-control form-control-sm">
+                    </div>
+                    <div class="d-flex align-items-center justify-content-center mt-3">
+                        <button type="button" class="btn btn-sm btn-primary mr-2" v-on:click.prevent="savePopupItem()">Submit</button>
+                        <button type="button" class="btn btn-sm btn-default border" onclick="return closeStagPopup()">Cancel</button>
+                    </div>
+                </form>
+            </div>
+            @include('app.patient.partials.ticket_update_pro_form',['ticketType'=>'equipment'])
+        </div>
+        <script>
+            (function() {
+                <?php
+                $item = json_decode($ticket->data);
+                $item->uid = $ticket->uid;
+                $item->is_open = $ticket->is_open;
+                $item->assigned_pro_id = $ticket->assigned_pro_id;
+                $item->manager_pro_id = $ticket->manager_pro_id;
+                $item->ordering_pro_id = $ticket->ordering_pro_id;
+                $item->initiating_pro_id = $ticket->initiating_pro_id;
+                $item->has_assigned_pro_signed = $ticket->has_assigned_pro_signed;
+                $item->has_manager_pro_signed = $ticket->has_manager_pro_signed;
+                $item->has_ordering_pro_signed = $ticket->has_ordering_pro_signed;
+                $item->has_initiating_pro_signed = $ticket->has_initiating_pro_signed;
+                $item->is_entry_error = $ticket->is_entry_error;
+                $item->created_at = friendly_date_time($ticket->created_at);
+                $items[] = $item;
+                ?>
+                function init() {
+                    let items = [];
+                    let equipmentSingleApp = new Vue({
+                        el: '#equipmentSingleApp',
+                        delimiters: ['@{{', '}}'],
+                        data: {
+                            popupMode: 'add',
+                            item: {!! json_encode($item) !!},
+                            popupItem: {
+                                uid: '',
+                                is_open: true,
+                                medication: '',
+                                strength: '',
+                                amount: '',
+                                route: '',
+                                frequency: '',
+                                dispense: '',
+                                refills: '',
+                                purpose: '',
+                                pharmacyName: '',
+                                pharmacyCity: '',
+                                pharmacyState: '',
+                                pharmacyAddressMemo: '',
+                                pharmacyPhone: '',
+                                pharmacyFax: '',
+                            },
+                            @include('app.patient.partials.ticket_vue_data')
+                        },
+                        methods: {
+                            showPopup: function(_name, _item) {
+                                closeStagPopup();
+                                this.popupMode = _item ? 'edit' : 'add';
+                                this.popupItem = _item ? JSON.parse(JSON.stringify(_item)) : {
+                                    uid: '',
+                                    is_open: true,
+                                    medication: '',
+                                    strength: '',
+                                    amount: '',
+                                    route: '',
+                                    frequency: '',
+                                    dispense: '',
+                                    refills: '',
+                                    purpose: '',
+                                    pharmacy: '',
+                                    pharmacyName: '',
+                                    pharmacyCity: '',
+                                    pharmacyState: '',
+                                    pharmacyAddressMemo: '',
+                                    pharmacyPhone: '',
+                                    pharmacyFax: '',
+                                };
+                                showStagPopup('equipment-popup');
+                            },
+                            savePopupItem: function() {
+                                let form = $('#equipmentSingleApp form').first();
+                                if(!form[0].checkValidity()) {
+                                    form[0].reportValidity();
+                                    return false;
+                                }
+
+                                showMask();
+                                let payload = {};
+                                if(this.popupMode === 'add') {
+                                    payload.clientUid = '{{ $patient->uid }}';
+                                    payload.category = 'equipment';
+                                    payload.assignedProUid = '{{ $pro->uid  }}';
+                                    payload.managerProUid = '{{ $pro->uid  }}';
+                                    payload.orderingProUid = '{{ $pro->uid  }}';
+                                    payload.initiatingProUid = '{{ $pro->uid  }}';
+                                    payload.data = JSON.stringify(this.popupItem);
+                                }
+                                else {
+                                    payload.uid = this.popupItem.uid;
+                                    payload.newData = JSON.stringify(this.popupItem);
+                                }
+
+                                $.post(
+                                    '/api/ticket/' + (this.popupMode === 'add' ? 'create' : 'updateData'),
+                                    payload,
+                                    function(_data) {
+                                        console.log(_data);
+                                        fastReload();
+                                    },
+                                    'json');
+
+                                return false;
+                            },
+                            closeItem: function(_item) {
+                                showMask();
+                                $.post('/api/ticket/close', {
+                                    uid: _item.uid
+                                }, function(_data) {
+                                    fastReload();
+                                });
+                            },
+                            openItem: function(_item) {
+                                showMask();
+                                $.post('/api/ticket/open', {
+                                    uid: _item.uid
+                                }, function(_data) {
+                                    fastReload();
+                                });
+                            },
+                            initICDAutoSuggest: function() {
+                                let self = this;
+                                $('#equipmentSingleApp input[type="text"][data-field="icd"]:not([ac-initialized])').each(function() {
+                                    var elem = this,
+                                        dynID = 'icd-' + Math.ceil(Math.random() * 1000000),
+                                        vueIndex = $(this).attr('data-index');
+                                    $(elem).attr('id', dynID);
+                                    new window.Def.Autocompleter.Search(dynID,
+                                        'https://clinicaltables.nlm.nih.gov/api/icd10cm/v3/search?sf=code,name&ef=name', {
+                                            tableFormat: true,
+                                            valueCols: [0],
+                                            colHeaders: ['Code', 'Name'],
+                                        }
+                                    );
+                                    window.Def.Autocompleter.Event.observeListSelections(dynID, function() {
+                                        let autocomp = elem.autocomp, acData = autocomp.getSelectedItemData();
+                                        self.popupItem.icds[vueIndex] = acData[0].code;
+                                        return false;
+                                    });
+                                    $(elem).attr('ac-initialized', 1);
+                                });
+                            },
+                            @include('app.patient.partials.ticket_vue_methods',['ticketType'=>'equipment'])
+                        },
+                        mounted: function () {
+                            initFastLoad($('#equipmentSingleApp'));
+                        }
+                    })
+                }
+                addMCInitializer('equipment-single', init, '#equipmentSingleApp');
+            })();
+        </script>
+
+    </div>
+
+@endsection

+ 13 - 0
resources/views/app/patient/action-items-equipment.blade.php

@@ -0,0 +1,13 @@
+@extends ('layouts.patient')
+<?php
+/** @var \App\Models\Client $patient */
+?>
+@section('inner-content')
+
+    <div class="mb-3">
+
+    @include('app/patient/partials/equipment')
+
+    </div>
+
+@endsection

+ 386 - 0
resources/views/app/patient/action-items-erx-single.blade.php

@@ -0,0 +1,386 @@
+@extends ('layouts.patient')
+<?php
+/** @var \App\Models\Client $patient */
+?>
+@section('inner-content')
+
+    <div class="mb-3">
+
+        <div id="erxSingleApp" v-cloak>
+            <div class="d-flex align-items-center pb-2">
+                <h4 class="font-weight-bold m-0 font-size-14"><i class="fa fa-prescription mr-2"></i>ERx Ticket
+                    <span v-if="!item.is_open" class="text-secondary font-weight-bold opacity-60">(Closed)</span>
+                </h4>
+                <span class="mx-3 text-secondary">|</span>
+                <a class="c-pointer" v-if="item.is_open" v-on:click.prevent="closeItem(item)">Close</a>
+                <a class="c-pointer" v-if="!item.is_open" v-on:click.prevent="openItem(item)">Re-open</a>
+                <span class="mx-3 text-secondary">|</span>
+                <a class="py-0 font-weight-normal c-pointer" v-on:click.prevent="showPopup('erx-popup', item)">Edit</a>
+            </div>
+
+            <div class="row mt-2 mb-3">
+                <div class="col-6 pr-0">
+                    <div class="card bg-light mb-3">
+                        <div class="card-body">
+                            <div class="d-flex align-items-start flex-nowrap mb-2">
+                                <span class="width-100px text-secondary text-sm">Created</span>
+                                <span class="font-weight-bold">@{{ item.created_at }}</span>
+                            </div>
+                            <div class="d-flex align-items-start flex-nowrap mb-2">
+                                <span class="width-100px text-secondary text-sm">Medication</span>
+                                <span class="font-weight-bold">@{{ item.medication ? item.medication : '-' }}</span>
+                            </div>
+                            <div class="d-flex align-items-start flex-nowrap mb-2">
+                                <span class="width-100px text-secondary text-sm">Strength</span>
+                                <span class="font-weight-bold">@{{ item.strength ? item.strength : '-' }}</span>
+                            </div>
+                            <div class="d-flex align-items-start flex-nowrap mb-2">
+                                <span class="width-100px text-secondary text-sm">Amount</span>
+                                <span class="font-weight-bold">@{{ item.amount ? item.amount : '-' }}</span>
+                            </div>
+                            <div class="d-flex align-items-start flex-nowrap mb-2">
+                                <span class="width-100px text-secondary text-sm">Route</span>
+                                <span class="font-weight-bold">@{{ item.route ? item.route : '-' }}</span>
+                            </div>
+                            <div class="d-flex align-items-start flex-nowrap mb-2">
+                                <span class="width-100px text-secondary text-sm">Frequency</span>
+                                <span class="font-weight-bold">@{{ item.frequency ? item.frequency : '-' }}</span>
+                            </div>
+                            <div class="d-flex align-items-start flex-nowrap mb-2">
+                                <span class="width-100px text-secondary text-sm">Dispense</span>
+                                <span class="font-weight-bold">@{{ item.dispense ? item.dispense : '-' }}</span>
+                            </div>
+                            <div class="d-flex align-items-start flex-nowrap mb-2">
+                                <span class="width-100px text-secondary text-sm">Refills</span>
+                                <span class="font-weight-bold">@{{ item.refills ? item.refills : '-' }}</span>
+                            </div>
+                            <div class="d-flex align-items-start flex-nowrap">
+                                <span class="width-100px text-secondary text-sm">Purpose</span>
+                                <span class="font-weight-bold">@{{ item.purpose ? item.purpose : '-' }}</span>
+                            </div>
+                            <hr class="m-neg-4">
+                            <div class="d-flex align-items-start flex-nowrap">
+                                <span class="width-100px text-secondary text-sm">Pref. Pharmacy</span>
+                                <span class="" v-html="pharmacy()"></span>
+                            </div>
+                        </div>
+                    </div>
+                    @include('app.patient.partials.ticket_action_links')
+                </div>
+                <div class="col-6">
+                    @include('app.patient.partials.ticket_vue_collab_card')
+                </div>
+            </div>
+
+            <div class="stag-popup stag-popup-sm mcp-theme-1" stag-popup-key="erx-popup">
+                <form method="POST" action="">
+                    <h3 class="stag-popup-title mb-2">
+                        <span>@{{ popupMode === 'add' ? 'Add ERx Item' : 'Edit ERx Item' }}</span>
+                        <a href="#" class="ml-auto text-secondary"
+                           onclick="return closeStagPopup()"><i class="fa fa-times-circle"></i></a>
+                    </h3>
+                    <div class="row mb-2">
+                        <div class="col-6">
+                            <label class="text-sm text-secondary mb-1">Medication</label>
+                            <input required type="text" data-field="medication"
+                                   v-model="popupItem.medication" class="form-control form-control-sm">
+                        </div>
+                        <div class="col-6">
+                            <label class="text-sm text-secondary mb-1">Strength</label>
+                            <input type="text" data-field="strength"
+                                   v-model="popupItem.strength" class="form-control form-control-sm">
+                        </div>
+                    </div>
+                    <div class="row mb-2">
+                        <div class="col-6">
+                            <label class="text-sm text-secondary mb-1">Amount</label>
+                            <input type="text" v-model="popupItem.amount" class="form-control form-control-sm">
+                        </div>
+                        <div class="col-6">
+                            <label class="text-sm text-secondary mb-1">Route</label>
+                            <input required type="text" v-model="popupItem.route" class="form-control form-control-sm"
+                                   data-option-list="route-options">
+                            <div id="route-options" class="data-option-list">
+                                <div>PO (by mouth)</div>
+                                <div>PR (per rectum)</div>
+                                <div>IM (intramuscular)</div>
+                                <div>IV (intravenous)</div>
+                                <div>ID (intradermal)</div>
+                                <div>IN (intranasal)</div>
+                                <div>TP (topical)</div>
+                                <div>SL (sublingual)</div>
+                                <div>BUCC (buccal)</div>
+                                <div>IP (intraperitoneal)</div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row mb-2">
+                        <div class="col-6">
+                            <label class="text-sm text-secondary mb-1">Frequency</label>
+                            <input type="text" v-model="popupItem.frequency" class="form-control form-control-sm"
+                                   data-option-list="frequency-options">
+                            <div id="frequency-options" class="data-option-list">
+                                <div>Once a day</div>
+                                <div>Twice a day</div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row mb-2">
+                        <div class="col-6">
+                            <label class="text-sm text-secondary mb-1">Dispense</label>
+                            <input required type="number" v-model="popupItem.dispense" class="form-control form-control-sm">
+                        </div>
+                        <div class="col-6">
+                            <label class="text-sm text-secondary mb-1">Refills</label>
+                            <input type="number" v-model="popupItem.refills" class="form-control form-control-sm">
+                        </div>
+                    </div>
+                    <div class="row mb-2">
+                        <div class="col-12">
+                            <label class="text-sm text-secondary mb-1">Purpose</label>
+                            <input required type="text" v-model="popupItem.purpose" class="form-control form-control-sm">
+                        </div>
+                    </div>
+                    <hr class="mt-3 mb-2">
+
+                    <div class="row mb-2">
+                        <div class="col-12">
+                            <label class="text-sm text-secondary mb-1 font-weight-bold">Preferred Pharmacy</label>
+                        </div>
+                    </div>
+                    <div class="row mb-2">
+                        <div class="col-8">
+                            <label class="text-sm text-secondary mb-1">Business Name</label>
+                            <input type="text" v-model="popupItem.pharmacyName" class="form-control form-control-sm">
+                        </div>
+                    </div>
+                    <div class="row mb-2">
+                        <div class="col-6">
+                            <label class="text-sm text-secondary mb-1">City</label>
+                            <input type="text" v-model="popupItem.pharmacyCity" class="form-control form-control-sm">
+                        </div>
+                        <div class="col-6">
+                            <label class="text-sm text-secondary mb-1">State</label>
+                            <input type="text" v-model="popupItem.pharmacyState" class="form-control form-control-sm">
+                        </div>
+                    </div>
+                    <div class="row mb-2">
+                        <div class="col-12">
+                            <label class="text-sm text-secondary mb-1">Address Memo</label>
+                            <input type="text" v-model="popupItem.pharmacyAddressMemo" class="form-control form-control-sm">
+                        </div>
+                    </div>
+                    <div class="row mb-2">
+                        <div class="col-6">
+                            <label class="text-sm text-secondary mb-1">Phone</label>
+                            <input type="text" v-model="popupItem.pharmacyPhone" class="form-control form-control-sm">
+                        </div>
+                        <div class="col-6">
+                            <label class="text-sm text-secondary mb-1">Fax</label>
+                            <input type="text" v-model="popupItem.pharmacyFax" class="form-control form-control-sm">
+                        </div>
+                    </div>
+
+                    <div class="d-flex align-items-center justify-content-center mt-3">
+                        <button type="button" class="btn btn-sm btn-primary mr-2" v-on:click.prevent="savePopupItem()">Submit</button>
+                        <button type="button" class="btn btn-sm btn-default border" onclick="return closeStagPopup()">Cancel</button>
+                    </div>
+                </form>
+            </div>
+            @include('app.patient.partials.ticket_update_pro_form',['ticketType'=>'erx'])
+        </div>
+        <script>
+            (function() {
+                <?php
+                $item = json_decode($ticket->data);
+                $item->uid = $ticket->uid;
+                $item->is_open = $ticket->is_open;
+                $item->assigned_pro_id = $ticket->assigned_pro_id;
+                $item->manager_pro_id = $ticket->manager_pro_id;
+                $item->ordering_pro_id = $ticket->ordering_pro_id;
+                $item->initiating_pro_id = $ticket->initiating_pro_id;
+                $item->has_assigned_pro_signed = $ticket->has_assigned_pro_signed;
+                $item->has_manager_pro_signed = $ticket->has_manager_pro_signed;
+                $item->has_ordering_pro_signed = $ticket->has_ordering_pro_signed;
+                $item->has_initiating_pro_signed = $ticket->has_initiating_pro_signed;
+                $item->is_entry_error = $ticket->is_entry_error;
+                $item->created_at = friendly_date_time($ticket->created_at);
+                $items[] = $item;
+                ?>
+                function init() {
+                    let items = [];
+                    let erxSingleApp = new Vue({
+                        el: '#erxSingleApp',
+                        delimiters: ['@{{', '}}'],
+                        data: {
+                            popupMode: 'add',
+                            item: {!! json_encode($item) !!},
+                            popupItem: {
+                                uid: '',
+                                is_open: true,
+                                medication: '',
+                                strength: '',
+                                amount: '',
+                                route: '',
+                                frequency: '',
+                                dispense: '',
+                                refills: '',
+                                purpose: '',
+                                pharmacyName: '',
+                                pharmacyCity: '',
+                                pharmacyState: '',
+                                pharmacyAddressMemo: '',
+                                pharmacyPhone: '',
+                                pharmacyFax: '',
+                            },
+                            @include('app.patient.partials.ticket_vue_data')
+                        },
+                        methods: {
+                            showPopup: function(_name, _item) {
+                                closeStagPopup();
+                                this.popupMode = _item ? 'edit' : 'add';
+                                this.popupItem = _item ? JSON.parse(JSON.stringify(_item)) : {
+                                    uid: '',
+                                    is_open: true,
+                                    medication: '',
+                                    strength: '',
+                                    amount: '',
+                                    route: '',
+                                    frequency: '',
+                                    dispense: '',
+                                    refills: '',
+                                    purpose: '',
+                                    pharmacy: '',
+                                    pharmacyName: '',
+                                    pharmacyCity: '',
+                                    pharmacyState: '',
+                                    pharmacyAddressMemo: '',
+                                    pharmacyPhone: '',
+                                    pharmacyFax: '',
+                                };
+                                showStagPopup('erx-popup');
+                            },
+                            savePopupItem: function() {
+                                let form = $('#erxSingleApp form').first();
+                                if(!form[0].checkValidity()) {
+                                    form[0].reportValidity();
+                                    return false;
+                                }
+
+                                showMask();
+                                let payload = {};
+                                if(this.popupMode === 'add') {
+                                    payload.clientUid = '{{ $patient->uid }}';
+                                    payload.category = 'erx';
+                                    payload.assignedProUid = '{{ $pro->uid  }}';
+                                    payload.managerProUid = '{{ $pro->uid  }}';
+                                    payload.orderingProUid = '{{ $pro->uid  }}';
+                                    payload.initiatingProUid = '{{ $pro->uid  }}';
+                                    payload.data = JSON.stringify(this.popupItem);
+                                }
+                                else {
+                                    payload.uid = this.popupItem.uid;
+                                    payload.newData = JSON.stringify(this.popupItem);
+                                }
+
+                                $.post(
+                                    '/api/ticket/' + (this.popupMode === 'add' ? 'create' : 'updateData'),
+                                    payload,
+                                    function(_data) {
+                                        console.log(_data);
+                                        fastReload();
+                                    },
+                                    'json');
+
+                                return false;
+                            },
+                            closeItem: function(_item) {
+                                showMask();
+                                $.post('/api/ticket/close', {
+                                    uid: _item.uid
+                                }, function(_data) {
+                                    fastReload();
+                                });
+                            },
+                            openItem: function(_item) {
+                                showMask();
+                                $.post('/api/ticket/open', {
+                                    uid: _item.uid
+                                }, function(_data) {
+                                    fastReload();
+                                });
+                            },
+                            initRxAutoSuggest: function() {
+                                let self = this;
+                                $('#erxSingleApp input[type="text"][data-field="medication"]:not([ac-initialized])').each(function() {
+                                    let elem = this,
+                                        randPart = Math.ceil(Math.random() * 1000000),
+                                        dynID = 'rx-' + randPart;
+                                    $(elem).attr('id', dynID);
+                                    var strengthElem = $(elem).closest('.stag-popup').find('[data-field="strength"]')[0],
+                                        dynStrengthsID = 'rx-' + randPart + '-strengths';
+                                    $(strengthElem).attr('id', dynStrengthsID);
+                                    $(strengthElem).attr('rx-id', dynID);
+                                    new window.Def.Autocompleter.Prefetch(dynStrengthsID, []);
+                                    new window.Def.Autocompleter.Search(dynID,
+                                        'https://clinicaltables.nlm.nih.gov/api/rxterms/v3/search?ef=STRENGTHS_AND_FORMS');
+                                    window.Def.Autocompleter.Event.observeListSelections(dynID, function() {
+                                        var autocomp = elem.autocomp, acData = autocomp.getSelectedItemData();
+                                        var strengths = acData[0].data['STRENGTHS_AND_FORMS'];
+                                        if (strengths) {
+                                            strengthElem.autocomp.setListAndField(strengths, '');
+                                        }
+                                        self.popupItem.medication = $(elem).val();
+                                    });
+                                    window.Def.Autocompleter.Event.observeListSelections(dynStrengthsID, function() {
+                                        var autocomp = elem.autocomp, acData = autocomp.getSelectedItemData();
+                                        self.popupItem.strength = $(strengthElem).val();
+                                    });
+                                    $(elem).attr('ac-initialized', 1);
+                                    $(strengthElem).attr('ac-initialized', 1);
+                                });
+                            },
+                            inWords: function (num) {
+                                try {
+                                    num = +num;
+                                    var a = ['','one ','two ','three ','four ', 'five ','six ','seven ','eight ','nine ','ten ','eleven ','twelve ','thirteen ','fourteen ','fifteen ','sixteen ','seventeen ','eighteen ','nineteen '];
+                                    var b = ['', '', 'twenty','thirty','forty','fifty', 'sixty','seventy','eighty','ninety'];
+                                    if ((num = num.toString()).length > 3) return 'overflow';
+                                    let n = ('000000000' + num).substr(-9).match(/^(\d{2})(\d{2})(\d{2})(\d{1})(\d{2})$/);
+                                    if (!n) return; var str = '';
+                                    str += (n[1] != 0) ? (a[Number(n[1])] || b[n[1][0]] + ' ' + a[n[1][1]]) + 'crore ' : '';
+                                    str += (n[2] != 0) ? (a[Number(n[2])] || b[n[2][0]] + ' ' + a[n[2][1]]) + 'lakh ' : '';
+                                    str += (n[3] != 0) ? (a[Number(n[3])] || b[n[3][0]] + ' ' + a[n[3][1]]) + 'thousand ' : '';
+                                    str += (n[4] != 0) ? (a[Number(n[4])] || b[n[4][0]] + ' ' + a[n[4][1]]) + 'hundred ' : '';
+                                    str += (n[5] != 0) ? ((str != '') ? 'and ' : '') + (a[Number(n[5])] || b[n[5][0]] + ' ' + a[n[5][1]]) : '';
+                                    return str ? '(' + $.trim(str) + ')' : '';
+                                }
+                                catch (e) {
+                                    return '';
+                                }
+                            },
+                            pharmacy: function() {
+                                return [
+                                    this.item.pharmacyName,
+                                    this.item.pharmacyCity,
+                                    this.item.pharmacyState,
+                                    this.item.pharmacyAddressMemo,
+                                    this.item.pharmacyPhone,
+                                    this.item.pharmacyFax,
+                                ].filter(Boolean).join('<br>');
+                            },
+                            @include('app.patient.partials.ticket_vue_methods',['ticketType'=>'erx'])
+                        },
+                        mounted: function () {
+                            this.initRxAutoSuggest();
+                            initFastLoad($('#erxSingleApp'));
+                        }
+                    })
+                }
+                addMCInitializer('erx-single', init, '#erxSingleApp');
+            })();
+        </script>
+
+    </div>
+
+@endsection

+ 13 - 0
resources/views/app/patient/action-items-erx.blade.php

@@ -0,0 +1,13 @@
+@extends ('layouts.patient')
+<?php
+/** @var \App\Models\Client $patient */
+?>
+@section('inner-content')
+
+    <div class="mb-3">
+
+    @include('app/patient/partials/erx')
+
+    </div>
+
+@endsection

+ 269 - 0
resources/views/app/patient/action-items-imaging-single.blade.php

@@ -0,0 +1,269 @@
+@extends ('layouts.patient')
+<?php
+/** @var \App\Models\Client $patient */
+?>
+@section('inner-content')
+
+    <div class="mb-3">
+
+        <div id="imagingSingleApp" v-cloak>
+            <div class="d-flex align-items-center pb-2">
+                <h4 class="font-weight-bold m-0 font-size-14"><i class="fa fa-prescription mr-2"></i>Imaging Ticket
+                    <span v-if="!item.is_open" class="text-secondary font-weight-bold opacity-60">(Closed)</span>
+                </h4>
+                <span class="mx-3 text-secondary">|</span>
+                <a class="c-pointer" v-if="item.is_open" v-on:click.prevent="closeItem(item)">Close</a>
+                <a class="c-pointer" v-if="!item.is_open" v-on:click.prevent="openItem(item)">Re-open</a>
+                <span class="mx-3 text-secondary">|</span>
+                <a class="py-0 font-weight-normal c-pointer" v-on:click.prevent="showPopup('imaging-popup', item)">Edit</a>
+            </div>
+
+            <div class="row mt-2 mb-3">
+                <div class="col-6 pr-0">
+                    <div class="card bg-light mb-3">
+                        <div class="card-body">
+                            <div class="d-flex align-items-start flex-nowrap mb-2">
+                                <span class="width-100px text-secondary text-sm">Created</span>
+                                <span class="font-weight-bold">@{{ item.created_at }}</span>
+                            </div>
+                            <div class="d-flex align-items-start flex-nowrap mb-2">
+                                <span class="width-100px text-secondary text-sm">Tests</span>
+                                <span class="font-weight-bold" v-html="item.tests && Array.isArray(item.tests) ? item.tests.join(', ') : '-'"></span>
+                            </div>
+                            <div class="d-flex align-items-start flex-nowrap mb-2">
+                                <span class="width-100px text-secondary text-sm">ICDs</span>
+                                <span class="font-weight-bold" v-html="item.icds && Array.isArray(item.icds) ? item.icds.join(', ') : '-'"></span>
+                            </div>
+                            <div class="d-flex align-items-start flex-nowrap">
+                                <span class="width-100px text-secondary text-sm">Memo</span>
+                                <span class="font-weight-bold">@{{ item.memo ? item.memo : '-' }}</span>
+                            </div>
+                        </div>
+                    </div>
+                    @include('app.patient.partials.ticket_action_links')
+                </div>
+                <div class="col-6">
+                    @include('app.patient.partials.ticket_vue_collab_card')
+                </div>
+            </div>
+
+            <div class="stag-popup stag-popup-sm mcp-theme-1" stag-popup-key="imaging-popup">
+                <form method="POST" action="" class="overflow-visible">
+                    <h3 class="stag-popup-title mb-2">
+                        <span>@{{ popupMode === 'add' ? 'Add Imaging Order Item' : 'Edit Imaging Order Item' }}</span>
+                        <a href="#" class="ml-auto text-secondary"
+                           onclick="return closeStagPopup()"><i class="fa fa-times-circle"></i></a>
+                    </h3>
+                    <div class="mb-2">
+                        <div class="d-flex align-items-center mb-1">
+                            <label class="text-sm text-secondary mb-0">Tests</label>
+                            <span class="text-sm mx-2 text-secondary">|</span>
+                            <a href="#" class="text-sm" v-on:click.prevent="popupItem.tests.push('')">Add</a>
+                        </div>
+                        <div class="d-flex align-items-center mb-2" v-for="(test, testIndex) in popupItem.tests">
+                            <div class="position-relative flex-grow-1">
+                                <input required type="text" data-option-list v-model="popupItem.tests[testIndex]" class="form-control form-control-sm">
+                                <div class="data-option-list">
+                                    <div>Complete Blood Count</div>
+                                    <div>Prothrombin Time</div>
+                                    <div>Basic Metabolic Panel</div>
+                                    <div>Comprehensive Metabolic Panel</div>
+                                    <div>Lipid Panel</div>
+                                    <div>Liver Panel</div>
+                                    <div>Thyroid Stimulating Hormone</div>
+                                    <div>Hemoglobin A1C</div>
+                                    <div>Urinalysis</div>
+                                    <div>Cultures</div>
+                                </div>
+                            </div>
+                            <a v-if="popupItem.tests.length > 1" class="ml-2 text-danger" href="#" v-on:click.prevent="popupItem.tests.splice(testIndex, 1)">
+                                <i class="fa fa-trash-alt"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="mb-2">
+                        <div class="d-flex align-items-center mb-1">
+                            <label class="text-sm text-secondary mb-0">ICDs</label>
+                            <span class="text-sm mx-2 text-secondary">|</span>
+                            <a href="#" class="text-sm" v-on:click.prevent="popupItem.icds.push('')">Add</a>
+                        </div>
+                        <div class="d-flex align-items-center mb-2" v-for="(icd, icdIndex) in popupItem.icds">
+                            <div class="position-relative flex-grow-1">
+                                <input required type="text" data-field="icd" :data-index="icdIndex"
+                                       v-model="popupItem.icds[icdIndex]" class="form-control form-control-sm">
+                            </div>
+                            <a v-if="popupItem.icds.length > 1" class="ml-2 text-danger" href="#" v-on:click.prevent="popupItem.icds.splice(icdIndex, 1)">
+                                <i class="fa fa-trash-alt"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="mb-2">
+                        <label class="text-sm text-secondary mb-1">Memo</label>
+                        <input type="text" v-model="popupItem.memo" class="form-control form-control-sm">
+                    </div>
+                    <div class="d-flex align-items-center justify-content-center mt-3">
+                        <button type="button" class="btn btn-sm btn-primary mr-2" v-on:click.prevent="savePopupItem()">Submit</button>
+                        <button type="button" class="btn btn-sm btn-default border" onclick="return closeStagPopup()">Cancel</button>
+                    </div>
+                </form>
+            </div>
+            @include('app.patient.partials.ticket_update_pro_form',['ticketType'=>'imaging'])
+        </div>
+        <script>
+            (function() {
+                <?php
+                $item = json_decode($ticket->data);
+                $item->uid = $ticket->uid;
+                $item->is_open = $ticket->is_open;
+                $item->assigned_pro_id = $ticket->assigned_pro_id;
+                $item->manager_pro_id = $ticket->manager_pro_id;
+                $item->ordering_pro_id = $ticket->ordering_pro_id;
+                $item->initiating_pro_id = $ticket->initiating_pro_id;
+                $item->has_assigned_pro_signed = $ticket->has_assigned_pro_signed;
+                $item->has_manager_pro_signed = $ticket->has_manager_pro_signed;
+                $item->has_ordering_pro_signed = $ticket->has_ordering_pro_signed;
+                $item->has_initiating_pro_signed = $ticket->has_initiating_pro_signed;
+                $item->is_entry_error = $ticket->is_entry_error;
+                $item->created_at = friendly_date_time($ticket->created_at);
+                $items[] = $item;
+                ?>
+                function init() {
+                    let items = [];
+                    let imagingSingleApp = new Vue({
+                        el: '#imagingSingleApp',
+                        delimiters: ['@{{', '}}'],
+                        data: {
+                            popupMode: 'add',
+                            item: {!! json_encode($item) !!},
+                            popupItem: {
+                                uid: '',
+                                is_open: true,
+                                medication: '',
+                                strength: '',
+                                amount: '',
+                                route: '',
+                                frequency: '',
+                                dispense: '',
+                                refills: '',
+                                purpose: '',
+                                pharmacyName: '',
+                                pharmacyCity: '',
+                                pharmacyState: '',
+                                pharmacyAddressMemo: '',
+                                pharmacyPhone: '',
+                                pharmacyFax: '',
+                            },
+                            @include('app.patient.partials.ticket_vue_data')
+                        },
+                        methods: {
+                            showPopup: function(_name, _item) {
+                                closeStagPopup();
+                                this.popupMode = _item ? 'edit' : 'add';
+                                this.popupItem = _item ? JSON.parse(JSON.stringify(_item)) : {
+                                    uid: '',
+                                    is_open: true,
+                                    medication: '',
+                                    strength: '',
+                                    amount: '',
+                                    route: '',
+                                    frequency: '',
+                                    dispense: '',
+                                    refills: '',
+                                    purpose: '',
+                                    pharmacy: '',
+                                    pharmacyName: '',
+                                    pharmacyCity: '',
+                                    pharmacyState: '',
+                                    pharmacyAddressMemo: '',
+                                    pharmacyPhone: '',
+                                    pharmacyFax: '',
+                                };
+                                showStagPopup('imaging-popup');
+                            },
+                            savePopupItem: function() {
+                                let form = $('#imagingSingleApp form').first();
+                                if(!form[0].checkValidity()) {
+                                    form[0].reportValidity();
+                                    return false;
+                                }
+
+                                showMask();
+                                let payload = {};
+                                if(this.popupMode === 'add') {
+                                    payload.clientUid = '{{ $patient->uid }}';
+                                    payload.category = 'imaging';
+                                    payload.assignedProUid = '{{ $pro->uid  }}';
+                                    payload.managerProUid = '{{ $pro->uid  }}';
+                                    payload.orderingProUid = '{{ $pro->uid  }}';
+                                    payload.initiatingProUid = '{{ $pro->uid  }}';
+                                    payload.data = JSON.stringify(this.popupItem);
+                                }
+                                else {
+                                    payload.uid = this.popupItem.uid;
+                                    payload.newData = JSON.stringify(this.popupItem);
+                                }
+
+                                $.post(
+                                    '/api/ticket/' + (this.popupMode === 'add' ? 'create' : 'updateData'),
+                                    payload,
+                                    function(_data) {
+                                        console.log(_data);
+                                        fastReload();
+                                    },
+                                    'json');
+
+                                return false;
+                            },
+                            closeItem: function(_item) {
+                                showMask();
+                                $.post('/api/ticket/close', {
+                                    uid: _item.uid
+                                }, function(_data) {
+                                    fastReload();
+                                });
+                            },
+                            openItem: function(_item) {
+                                showMask();
+                                $.post('/api/ticket/open', {
+                                    uid: _item.uid
+                                }, function(_data) {
+                                    fastReload();
+                                });
+                            },
+                            initICDAutoSuggest: function() {
+                                let self = this;
+                                $('#imagingSingleApp input[type="text"][data-field="icd"]:not([ac-initialized])').each(function() {
+                                    var elem = this,
+                                        dynID = 'icd-' + Math.ceil(Math.random() * 1000000),
+                                        vueIndex = $(this).attr('data-index');
+                                    $(elem).attr('id', dynID);
+                                    new window.Def.Autocompleter.Search(dynID,
+                                        'https://clinicaltables.nlm.nih.gov/api/icd10cm/v3/search?sf=code,name&ef=name', {
+                                            tableFormat: true,
+                                            valueCols: [0],
+                                            colHeaders: ['Code', 'Name'],
+                                        }
+                                    );
+                                    window.Def.Autocompleter.Event.observeListSelections(dynID, function() {
+                                        let autocomp = elem.autocomp, acData = autocomp.getSelectedItemData();
+                                        self.popupItem.icds[vueIndex] = acData[0].code;
+                                        return false;
+                                    });
+                                    $(elem).attr('ac-initialized', 1);
+                                });
+                            },
+                            @include('app.patient.partials.ticket_vue_methods',['ticketType'=>'imaging'])
+                        },
+                        mounted: function () {
+                            this.initICDAutoSuggest();
+                            initFastLoad($('#imagingSingleApp'));
+                        }
+                    })
+                }
+                addMCInitializer('imaging-single', init, '#imagingSingleApp');
+            })();
+        </script>
+
+    </div>
+
+@endsection

+ 13 - 0
resources/views/app/patient/action-items-imaging.blade.php

@@ -0,0 +1,13 @@
+@extends ('layouts.patient')
+<?php
+/** @var \App\Models\Client $patient */
+?>
+@section('inner-content')
+
+    <div class="mb-3">
+
+    @include('app/patient/partials/imaging')
+
+    </div>
+
+@endsection

+ 269 - 0
resources/views/app/patient/action-items-lab-single.blade.php

@@ -0,0 +1,269 @@
+@extends ('layouts.patient')
+<?php
+/** @var \App\Models\Client $patient */
+?>
+@section('inner-content')
+
+    <div class="mb-3">
+
+        <div id="labSingleApp" v-cloak>
+            <div class="d-flex align-items-center pb-2">
+                <h4 class="font-weight-bold m-0 font-size-14"><i class="fa fa-prescription mr-2"></i>Lab Ticket
+                    <span v-if="!item.is_open" class="text-secondary font-weight-bold opacity-60">(Closed)</span>
+                </h4>
+                <span class="mx-3 text-secondary">|</span>
+                <a class="c-pointer" v-if="item.is_open" v-on:click.prevent="closeItem(item)">Close</a>
+                <a class="c-pointer" v-if="!item.is_open" v-on:click.prevent="openItem(item)">Re-open</a>
+                <span class="mx-3 text-secondary">|</span>
+                <a class="py-0 font-weight-normal c-pointer" v-on:click.prevent="showPopup('lab-popup', item)">Edit</a>
+            </div>
+
+            <div class="row mt-2 mb-3">
+                <div class="col-6 pr-0">
+                    <div class="card bg-light mb-3">
+                        <div class="card-body">
+                            <div class="d-flex align-items-start flex-nowrap mb-2">
+                                <span class="width-100px text-secondary text-sm">Created</span>
+                                <span class="font-weight-bold">@{{ item.created_at }}</span>
+                            </div>
+                            <div class="d-flex align-items-start flex-nowrap mb-2">
+                                <span class="width-100px text-secondary text-sm">Tests</span>
+                                <span class="font-weight-bold" v-html="item.tests && Array.isArray(item.tests) ? item.tests.join(', ') : '-'"></span>
+                            </div>
+                            <div class="d-flex align-items-start flex-nowrap mb-2">
+                                <span class="width-100px text-secondary text-sm">ICDs</span>
+                                <span class="font-weight-bold" v-html="item.icds && Array.isArray(item.icds) ? item.icds.join(', ') : '-'"></span>
+                            </div>
+                            <div class="d-flex align-items-start flex-nowrap">
+                                <span class="width-100px text-secondary text-sm">Memo</span>
+                                <span class="font-weight-bold">@{{ item.memo ? item.memo : '-' }}</span>
+                            </div>
+                        </div>
+                    </div>
+                    @include('app.patient.partials.ticket_action_links')
+                </div>
+                <div class="col-6">
+                    @include('app.patient.partials.ticket_vue_collab_card')
+                </div>
+            </div>
+
+            <div class="stag-popup stag-popup-sm mcp-theme-1" stag-popup-key="lab-popup">
+                <form method="POST" action="" class="overflow-visible">
+                    <h3 class="stag-popup-title mb-2">
+                        <span>@{{ popupMode === 'add' ? 'Add Lab Order Item' : 'Edit Lab Order Item' }}</span>
+                        <a href="#" class="ml-auto text-secondary"
+                           onclick="return closeStagPopup()"><i class="fa fa-times-circle"></i></a>
+                    </h3>
+                    <div class="mb-2">
+                        <div class="d-flex align-items-center mb-1">
+                            <label class="text-sm text-secondary mb-0">Tests</label>
+                            <span class="text-sm mx-2 text-secondary">|</span>
+                            <a href="#" class="text-sm" v-on:click.prevent="popupItem.tests.push('')">Add</a>
+                        </div>
+                        <div class="d-flex align-items-center mb-2" v-for="(test, testIndex) in popupItem.tests">
+                            <div class="position-relative flex-grow-1">
+                                <input required type="text" data-option-list v-model="popupItem.tests[testIndex]" class="form-control form-control-sm">
+                                <div class="data-option-list">
+                                    <div>Complete Blood Count</div>
+                                    <div>Prothrombin Time</div>
+                                    <div>Basic Metabolic Panel</div>
+                                    <div>Comprehensive Metabolic Panel</div>
+                                    <div>Lipid Panel</div>
+                                    <div>Liver Panel</div>
+                                    <div>Thyroid Stimulating Hormone</div>
+                                    <div>Hemoglobin A1C</div>
+                                    <div>Urinalysis</div>
+                                    <div>Cultures</div>
+                                </div>
+                            </div>
+                            <a v-if="popupItem.tests.length > 1" class="ml-2 text-danger" href="#" v-on:click.prevent="popupItem.tests.splice(testIndex, 1)">
+                                <i class="fa fa-trash-alt"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="mb-2">
+                        <div class="d-flex align-items-center mb-1">
+                            <label class="text-sm text-secondary mb-0">ICDs</label>
+                            <span class="text-sm mx-2 text-secondary">|</span>
+                            <a href="#" class="text-sm" v-on:click.prevent="popupItem.icds.push('')">Add</a>
+                        </div>
+                        <div class="d-flex align-items-center mb-2" v-for="(icd, icdIndex) in popupItem.icds">
+                            <div class="position-relative flex-grow-1">
+                                <input required type="text" data-field="icd" :data-index="icdIndex"
+                                       v-model="popupItem.icds[icdIndex]" class="form-control form-control-sm">
+                            </div>
+                            <a v-if="popupItem.icds.length > 1" class="ml-2 text-danger" href="#" v-on:click.prevent="popupItem.icds.splice(icdIndex, 1)">
+                                <i class="fa fa-trash-alt"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="mb-2">
+                        <label class="text-sm text-secondary mb-1">Memo</label>
+                        <input type="text" v-model="popupItem.memo" class="form-control form-control-sm">
+                    </div>
+                    <div class="d-flex align-items-center justify-content-center mt-3">
+                        <button type="button" class="btn btn-sm btn-primary mr-2" v-on:click.prevent="savePopupItem()">Submit</button>
+                        <button type="button" class="btn btn-sm btn-default border" onclick="return closeStagPopup()">Cancel</button>
+                    </div>
+                </form>
+            </div>
+            @include('app.patient.partials.ticket_update_pro_form',['ticketType'=>'lab'])
+        </div>
+        <script>
+            (function() {
+                <?php
+                $item = json_decode($ticket->data);
+                $item->uid = $ticket->uid;
+                $item->is_open = $ticket->is_open;
+                $item->assigned_pro_id = $ticket->assigned_pro_id;
+                $item->manager_pro_id = $ticket->manager_pro_id;
+                $item->ordering_pro_id = $ticket->ordering_pro_id;
+                $item->initiating_pro_id = $ticket->initiating_pro_id;
+                $item->has_assigned_pro_signed = $ticket->has_assigned_pro_signed;
+                $item->has_manager_pro_signed = $ticket->has_manager_pro_signed;
+                $item->has_ordering_pro_signed = $ticket->has_ordering_pro_signed;
+                $item->has_initiating_pro_signed = $ticket->has_initiating_pro_signed;
+                $item->is_entry_error = $ticket->is_entry_error;
+                $item->created_at = friendly_date_time($ticket->created_at);
+                $items[] = $item;
+                ?>
+                function init() {
+                    let items = [];
+                    let labSingleApp = new Vue({
+                        el: '#labSingleApp',
+                        delimiters: ['@{{', '}}'],
+                        data: {
+                            popupMode: 'add',
+                            item: {!! json_encode($item) !!},
+                            popupItem: {
+                                uid: '',
+                                is_open: true,
+                                medication: '',
+                                strength: '',
+                                amount: '',
+                                route: '',
+                                frequency: '',
+                                dispense: '',
+                                refills: '',
+                                purpose: '',
+                                pharmacyName: '',
+                                pharmacyCity: '',
+                                pharmacyState: '',
+                                pharmacyAddressMemo: '',
+                                pharmacyPhone: '',
+                                pharmacyFax: '',
+                            },
+                            @include('app.patient.partials.ticket_vue_data')
+                        },
+                        methods: {
+                            showPopup: function(_name, _item) {
+                                closeStagPopup();
+                                this.popupMode = _item ? 'edit' : 'add';
+                                this.popupItem = _item ? JSON.parse(JSON.stringify(_item)) : {
+                                    uid: '',
+                                    is_open: true,
+                                    medication: '',
+                                    strength: '',
+                                    amount: '',
+                                    route: '',
+                                    frequency: '',
+                                    dispense: '',
+                                    refills: '',
+                                    purpose: '',
+                                    pharmacy: '',
+                                    pharmacyName: '',
+                                    pharmacyCity: '',
+                                    pharmacyState: '',
+                                    pharmacyAddressMemo: '',
+                                    pharmacyPhone: '',
+                                    pharmacyFax: '',
+                                };
+                                showStagPopup('lab-popup');
+                            },
+                            savePopupItem: function() {
+                                let form = $('#labSingleApp form').first();
+                                if(!form[0].checkValidity()) {
+                                    form[0].reportValidity();
+                                    return false;
+                                }
+
+                                showMask();
+                                let payload = {};
+                                if(this.popupMode === 'add') {
+                                    payload.clientUid = '{{ $patient->uid }}';
+                                    payload.category = 'lab';
+                                    payload.assignedProUid = '{{ $pro->uid  }}';
+                                    payload.managerProUid = '{{ $pro->uid  }}';
+                                    payload.orderingProUid = '{{ $pro->uid  }}';
+                                    payload.initiatingProUid = '{{ $pro->uid  }}';
+                                    payload.data = JSON.stringify(this.popupItem);
+                                }
+                                else {
+                                    payload.uid = this.popupItem.uid;
+                                    payload.newData = JSON.stringify(this.popupItem);
+                                }
+
+                                $.post(
+                                    '/api/ticket/' + (this.popupMode === 'add' ? 'create' : 'updateData'),
+                                    payload,
+                                    function(_data) {
+                                        console.log(_data);
+                                        fastReload();
+                                    },
+                                    'json');
+
+                                return false;
+                            },
+                            closeItem: function(_item) {
+                                showMask();
+                                $.post('/api/ticket/close', {
+                                    uid: _item.uid
+                                }, function(_data) {
+                                    fastReload();
+                                });
+                            },
+                            openItem: function(_item) {
+                                showMask();
+                                $.post('/api/ticket/open', {
+                                    uid: _item.uid
+                                }, function(_data) {
+                                    fastReload();
+                                });
+                            },
+                            initICDAutoSuggest: function() {
+                                let self = this;
+                                $('#labSingleApp input[type="text"][data-field="icd"]:not([ac-initialized])').each(function() {
+                                    var elem = this,
+                                        dynID = 'icd-' + Math.ceil(Math.random() * 1000000),
+                                        vueIndex = $(this).attr('data-index');
+                                    $(elem).attr('id', dynID);
+                                    new window.Def.Autocompleter.Search(dynID,
+                                        'https://clinicaltables.nlm.nih.gov/api/icd10cm/v3/search?sf=code,name&ef=name', {
+                                            tableFormat: true,
+                                            valueCols: [0],
+                                            colHeaders: ['Code', 'Name'],
+                                        }
+                                    );
+                                    window.Def.Autocompleter.Event.observeListSelections(dynID, function() {
+                                        let autocomp = elem.autocomp, acData = autocomp.getSelectedItemData();
+                                        self.popupItem.icds[vueIndex] = acData[0].code;
+                                        return false;
+                                    });
+                                    $(elem).attr('ac-initialized', 1);
+                                });
+                            },
+                            @include('app.patient.partials.ticket_vue_methods',['ticketType'=>'lab'])
+                        },
+                        mounted: function () {
+                            this.initICDAutoSuggest();
+                            initFastLoad($('#labSingleApp'));
+                        }
+                    })
+                }
+                addMCInitializer('lab-single', init, '#labSingleApp');
+            })();
+        </script>
+
+    </div>
+
+@endsection

+ 13 - 0
resources/views/app/patient/action-items-lab.blade.php

@@ -0,0 +1,13 @@
+@extends ('layouts.patient')
+<?php
+/** @var \App\Models\Client $patient */
+?>
+@section('inner-content')
+
+    <div class="mb-3">
+
+    @include('app/patient/partials/lab')
+
+    </div>
+
+@endsection

+ 13 - 0
resources/views/app/patient/action-items-other.blade.php

@@ -0,0 +1,13 @@
+@extends ('layouts.patient')
+<?php
+/** @var \App\Models\Client $patient */
+?>
+@section('inner-content')
+
+    <div class="mb-5">
+
+    @include('app/patient/partials/other')
+
+    </div>
+
+@endsection

+ 45 - 14
resources/views/app/patient/partials/equipment.blade.php

@@ -3,35 +3,57 @@
         <h4 class="font-weight-bold m-0 font-size-14"><i class="fa fa-car-battery mr-2"></i>Equipment/Device</h4>
         <span class="mx-2 text-secondary">|</span>
         <a class="py-0 font-weight-normal c-pointer" v-on:click.prevent="showPopup('equipment-popup')">Add</a>
+        <select class="ml-auto max-width-300px form-control form-control-sm"
+                onchange="fastLoad('/patients/view/{{$patient->uid}}/action-items-equipment/' + this.value, true, false, false)">
+            <option value="open" {{ $filter === 'open' ? 'selected' : '' }}>Open tickets</option>
+            <option value="closed" {{ $filter === 'closed' ? 'selected' : '' }}>Closed tickets</option>
+            <option value="all" {{ $filter === 'all' ? 'selected' : '' }}>All tickets</option>
+        </select>
     </div>
-    <table class="table table-sm table-bordered mb-0" style="table-layout: fixed">
+    <table class="table table-sm table-bordered mb-0">
         <thead>
         <tr class="bg-light">
             <th class="px-2 text-secondary border-bottom-0 width-30px">#</th>
-            <th class="px-2 text-secondary border-bottom-0">Items</th>
-            <th class="px-2 text-secondary border-bottom-0">Purpose</th>
+            <th class="px-2 text-secondary border-bottom-0">Equipment</th>
             <th class="px-2 text-secondary border-bottom-0">Memo</th>
-            <th class="px-2 text-secondary border-bottom-0">&nbsp;</th>
+            <th class="px-2 text-secondary border-bottom-0 width-200px">Collaboration</th>
         </tr>
         </thead>
         <tbody>
-            <tr v-for="(item, index) in items" :class="item.is_open ? '' : 'opacity-60'">
+            <tr v-for="(item, index) in items" :class="item.is_open ? '' : 'opacity-60 bg-light'">
                 <td class="px-2">@{{ index + 1 }}</td>
-                <td class="px-2" v-html="item.items && Array.isArray(item.items) ? item.items.join('<br>') : item.items"></td>
-                <td class="px-2">@{{item.purpose}}</td>
-                <td class="px-2">@{{item.memo}}</td>
                 <td class="px-2">
+                    <div class="d-flex align-items-center flex-wrap">
+                        <div>
+                            <a :href="'/patients/view/{{$patient->uid}}/action-items-equipment/view/' + item.uid"
+                               v-html="item.items && Array.isArray(item.items) ? item.items.join(', ') : '-'"
+                               class="font-weight-bold font-size-13"></a>
+                        </div>
+                        <span class="mx-2 text-secondary">•</span>
+                        <div>
+                            <span class="text-secondary">Purpose:</span>
+                            <span v-html="item.purpose ? item.purpose : '-'"></span>
+                        </div>
+                    </div>
+                    <div>
+                        <span class="text-secondary text-sm mt-1">Created:</span>
+                        @{{ item.created_at }}
+                    </div>
+                </td>
+                <td class="px-2">@{{item.memo}}</td>
+                @include('app.patient.partials.ticket_vue_collab_column')
+                {{--<td class="px-2">
                     <a class="mr-2 c-pointer" v-on:click.prevent="showPopup('equipment-popup', item)">Edit</a>
                     <a class="mr-2 c-pointer" v-if="item.is_open" v-on:click.prevent="closeItem(item)">Close</a>
                     <a class="mr-2 c-pointer" v-if="!item.is_open" v-on:click.prevent="openItem(item)">Open</a>
 
                     @include('app.patient.partials.ticket_action_links')
-                </td>
+                </td>--}}
             </tr>
         </tbody>
     </table>
     <div class="stag-popup stag-popup-sm mcp-theme-1" stag-popup-key="equipment-popup">
-        <form method="POST" action="/api/appointment/create">
+        <form method="POST" action="">
             <h3 class="stag-popup-title mb-2">
                 <span>@{{ popupMode === 'add' ? 'Add Equipment' : 'Edit Equipment' }}</span>
                 <a href="#" class="ml-auto text-secondary"
@@ -76,19 +98,28 @@
 <script>
     (function() {
         <?php
-        $tickets = $patient->tickets->filter(function($_item) {
-            return $_item->category === 'equipment';
+        $tickets = $patient->tickets->filter(function($_item) use ($filter) {
+            $match = $_item->category === 'equipment';
+            if($filter !== 'all') {
+                $match = $match && ($filter === 'open' ? $_item->is_open : !$_item->is_open);
+            }
+            return $match;
         });
         $items = [];
         foreach ($tickets as $ticket) {
             $item = json_decode($ticket->data);
             $item->uid = $ticket->uid;
             $item->is_open = $ticket->is_open;
+            $item->assigned_pro_id = $ticket->assigned_pro_id;
+            $item->manager_pro_id = $ticket->manager_pro_id;
+            $item->ordering_pro_id = $ticket->ordering_pro_id;
+            $item->initiating_pro_id = $ticket->initiating_pro_id;
             $item->has_assigned_pro_signed = $ticket->has_assigned_pro_signed;
-            $item->has_initiating_pro_signed = $ticket->has_initiating_pro_signed;
             $item->has_manager_pro_signed = $ticket->has_manager_pro_signed;
             $item->has_ordering_pro_signed = $ticket->has_ordering_pro_signed;
+            $item->has_initiating_pro_signed = $ticket->has_initiating_pro_signed;
             $item->is_entry_error = $ticket->is_entry_error;
+            $item->created_at = friendly_date_time($ticket->created_at);
             $items[] = $item;
         }
         ?>
@@ -175,7 +206,7 @@
                     @include('app.patient.partials.ticket_vue_methods',['ticketType'=>'equipment'])
                 },
                 mounted: function () {
-
+                    initFastLoad($('#equipmentApp'));
                 }
             })
         }

+ 79 - 26
resources/views/app/patient/partials/erx.blade.php

@@ -3,47 +3,80 @@
         <h4 class="font-weight-bold m-0 font-size-14"><i class="fa fa-prescription mr-2"></i>ERx</h4>
         <span class="mx-2 text-secondary">|</span>
         <a class="py-0 font-weight-normal c-pointer" v-on:click.prevent="showPopup('erx-popup')">Add</a>
+        <select class="ml-auto max-width-300px form-control form-control-sm"
+                onchange="fastLoad('/patients/view/{{$patient->uid}}/action-items-erx/' + this.value, true, false, false)">
+            <option value="open" {{ $filter === 'open' ? 'selected' : '' }}>Open tickets</option>
+            <option value="closed" {{ $filter === 'closed' ? 'selected' : '' }}>Closed tickets</option>
+            <option value="all" {{ $filter === 'all' ? 'selected' : '' }}>All tickets</option>
+        </select>
     </div>
-    <table class="table table-sm table-bordered mb-0" style="table-layout: fixed">
+    <table class="table table-sm table-bordered mb-0">
         <thead>
         <tr class="bg-light">
             <th class="px-2 text-secondary border-bottom-0 width-30px">#</th>
             <th class="px-2 text-secondary border-bottom-0">Medication</th>
-            <th class="px-2 text-secondary border-bottom-0">Strength</th>
-            <th class="px-2 text-secondary border-bottom-0">Amount</th>
-            <th class="px-2 text-secondary border-bottom-0">Route</th>
-            <th class="px-2 text-secondary border-bottom-0">Frequency</th>
-            <th class="px-2 text-secondary border-bottom-0">Dispense</th>
-            <th class="px-2 text-secondary border-bottom-0">Refills</th>
-            <th class="px-2 text-secondary border-bottom-0">Purpose</th>
-            <th class="px-2 text-secondary border-bottom-0">Pharmacy</th>
-            <th class="px-2 text-secondary border-bottom-0">&nbsp;</th>
+            <th class="px-2 text-secondary border-bottom-0 width-200px">Pharmacy</th>
+            <th class="px-2 text-secondary border-bottom-0 width-200px">Collaboration</th>
         </tr>
         </thead>
         <tbody>
-            <tr v-for="(item, index) in items" :class="item.is_open ? '' : 'opacity-60'">
+            <tr v-for="(item, index) in items" :class="item.is_open ? '' : 'opacity-60 bg-light'">
                 <td class="px-2">@{{ index + 1 }}</td>
-                <td class="px-2">@{{item.medication}}</td>
-                <td class="px-2">@{{item.strength}}</td>
-                <td class="px-2">@{{item.amount}}</td>
-                <td class="px-2">@{{item.route}}</td>
-                <td class="px-2">@{{item.frequency}}</td>
-                <td class="px-2">@{{item.dispense}} <span class="text-secondary" v-html="inWords(item.dispense)"></span></td>
-                <td class="px-2">@{{item.refills}}</td>
-                <td class="px-2">@{{item.purpose}}</td>
-                <td class="px-2">@{{item.pharmacy}}</td>
                 <td class="px-2">
+                    <div class="d-flex align-items-center flex-wrap">
+                        <a :href="'/patients/view/{{$patient->uid}}/action-items-erx/view/' + item.uid"
+                           class="font-weight-bold font-size-13">@{{item.medication}}</a>
+                        <span class="d-inline-flex align-items-center" v-if="item.strength">
+                            <span class="mx-2 text-secondary">•</span>
+                            <span>@{{item.strength}}</span>
+                        </span>
+                        <span class="d-inline-flex align-items-center" v-if="item.amount">
+                            <span class="mx-2 text-secondary">•</span>
+                            <span>@{{item.amount}}</span>
+                        </span>
+                        <span class="d-inline-flex align-items-center" v-if="item.route">
+                            <span class="mx-2 text-secondary">•</span>
+                            <span>@{{item.route}}</span>
+                        </span>
+                        <span class="d-inline-flex align-items-center" v-if="item.frequency">
+                            <span class="mx-2 text-secondary">•</span>
+                            <span>@{{item.frequency}}</span>
+                        </span>
+                        <span class="d-inline-flex align-items-center" v-if="item.dispense">
+                            <span class="mx-2 text-secondary">•</span>
+                            <span>Dispense:</span> @{{item.dispense}}
+                            <span class="text-secondary ml-1" v-html="inWords(item.dispense)"></span>
+                        </span>
+                        <span class="d-inline-flex align-items-center" v-if="item.refills">
+                            <span class="mx-2 text-secondary">•</span>
+                            <span><span>Refills:</span> @{{item.refills}}</span>
+                        </span>
+                        <span class="d-inline-flex align-items-center" v-if="item.purpose">
+                            <span class="mx-2 text-secondary">•</span>
+                            <span><span>Purpose:</span> @{{item.purpose}}</span>
+                        </span>
+                    </div>
+                    <div>
+                        <span class="text-secondary text-sm mt-1">Created:</span>
+                        @{{ item.created_at }}
+                    </div>
+                </td>
+                <td class="px-2">
+                    <span class="" v-html="pharmacy(item)"></span>
+                </td>
+                @include('app.patient.partials.ticket_vue_collab_column')
+                {{--<td class="px-2">
                     <a class="mr-2 c-pointer" v-on:click.prevent="showPopup('erx-popup', item)">Edit</a>
                     <a class="mr-2 c-pointer" v-if="item.is_open" v-on:click.prevent="closeItem(item)">Close</a>
                     <a class="mr-2 c-pointer" v-if="!item.is_open" v-on:click.prevent="openItem(item)">Open</a>
-                    
+
                     @include('app.patient.partials.ticket_action_links')
-                </td>
+                </td>--}}
             </tr>
         </tbody>
     </table>
     <div class="stag-popup stag-popup-sm mcp-theme-1" stag-popup-key="erx-popup">
-        <form method="POST" action="/api/appointment/create">
+        <form method="POST" action="">
             <h3 class="stag-popup-title mb-2">
                 <span>@{{ popupMode === 'add' ? 'Add ERx Item' : 'Edit ERx Item' }}</span>
                 <a href="#" class="ml-auto text-secondary"
@@ -162,19 +195,28 @@
 <script>
     (function() {
         <?php
-        $tickets = $patient->tickets->filter(function($_item) {
-            return $_item->category === 'erx';
+        $tickets = $patient->tickets->filter(function($_item) use ($filter) {
+            $match = $_item->category === 'erx';
+            if($filter !== 'all') {
+                $match = $match && ($filter === 'open' ? $_item->is_open : !$_item->is_open);
+            }
+            return $match;
         });
         $items = [];
         foreach ($tickets as $ticket) {
             $item = json_decode($ticket->data);
             $item->uid = $ticket->uid;
             $item->is_open = $ticket->is_open;
+            $item->assigned_pro_id = $ticket->assigned_pro_id;
+            $item->manager_pro_id = $ticket->manager_pro_id;
+            $item->ordering_pro_id = $ticket->ordering_pro_id;
+            $item->initiating_pro_id = $ticket->initiating_pro_id;
             $item->has_assigned_pro_signed = $ticket->has_assigned_pro_signed;
-            $item->has_initiating_pro_signed = $ticket->has_initiating_pro_signed;
             $item->has_manager_pro_signed = $ticket->has_manager_pro_signed;
             $item->has_ordering_pro_signed = $ticket->has_ordering_pro_signed;
+            $item->has_initiating_pro_signed = $ticket->has_initiating_pro_signed;
             $item->is_entry_error = $ticket->is_entry_error;
+            $item->created_at = friendly_date_time($ticket->created_at);
             $items[] = $item;
         }
         ?>
@@ -330,10 +372,21 @@
                             return '';
                         }
                     },
+                    pharmacy: function(_item) {
+                        return [
+                            _item.pharmacyName,
+                            _item.pharmacyCity,
+                            _item.pharmacyState,
+                            _item.pharmacyAddressMemo,
+                            _item.pharmacyPhone,
+                            _item.pharmacyFax,
+                        ].filter(Boolean).join('<br>');
+                    },
                     @include('app.patient.partials.ticket_vue_methods',['ticketType'=>'erx'])
                 },
                 mounted: function () {
                     this.initRxAutoSuggest();
+                    initFastLoad($('#erxApp'));
                 }
             })
         }

+ 45 - 13
resources/views/app/patient/partials/imaging.blade.php

@@ -3,35 +3,57 @@
         <h4 class="font-weight-bold m-0 font-size-14"><i class="fa fa-image mr-2"></i>Imaging</h4>
         <span class="mx-2 text-secondary">|</span>
         <a class="py-0 font-weight-normal c-pointer" v-on:click.prevent="showPopup('imaging-popup')">Add</a>
+        <select class="ml-auto max-width-300px form-control form-control-sm"
+                onchange="fastLoad('/patients/view/{{$patient->uid}}/action-items-imaging/' + this.value, true, false, false)">
+            <option value="open" {{ $filter === 'open' ? 'selected' : '' }}>Open tickets</option>
+            <option value="closed" {{ $filter === 'closed' ? 'selected' : '' }}>Closed tickets</option>
+            <option value="all" {{ $filter === 'all' ? 'selected' : '' }}>All tickets</option>
+        </select>
     </div>
-    <table class="table table-sm table-bordered mb-0" style="table-layout: fixed">
+    <table class="table table-sm table-bordered mb-0">
         <thead>
         <tr class="bg-light">
             <th class="px-2 text-secondary border-bottom-0 width-30px">#</th>
             <th class="px-2 text-secondary border-bottom-0">Tests</th>
-            <th class="px-2 text-secondary border-bottom-0">ICDs</th>
             <th class="px-2 text-secondary border-bottom-0">Memo</th>
-            <th class="px-2 text-secondary border-bottom-0">&nbsp;</th>
+            <th class="px-2 text-secondary border-bottom-0 width-200px">Collaboration</th>
         </tr>
         </thead>
         <tbody>
-        <tr v-for="(item, index) in items" :class="item.is_open ? '' : 'opacity-60'">
+        <tr v-for="(item, index) in items" :class="item.is_open ? '' : 'opacity-60 bg-light'">
             <td class="px-2">@{{ index + 1 }}</td>
-            <td class="px-2" v-html="item.tests && Array.isArray(item.tests) ? item.tests.join('<br>') : item.tests"></td>
-            <td class="px-2" v-html="item.icds && Array.isArray(item.icds) ? item.icds.join('<br>') : item.icds"></td>
-            <td class="px-2">@{{item.memo}}</td>
             <td class="px-2">
+                <div class="d-flex align-items-center flex-wrap">
+                    <div>
+                        <a :href="'/patients/view/{{$patient->uid}}/action-items-imaging/view/' + item.uid"
+                           v-html="item.tests && Array.isArray(item.tests) ? item.tests.join(', ') : '-'"
+                           class="font-weight-bold font-size-13"></a>
+                    </div>
+                    <span class="mx-2 text-secondary">•</span>
+                    <div>
+                        <span class="text-secondary">ICDs:</span>
+                        <span v-html="item.tests && Array.isArray(item.icds) ? item.icds.join(', ') : '-'"></span>
+                    </div>
+                </div>
+                <div>
+                    <span class="text-secondary text-sm mt-1">Created:</span>
+                    @{{ item.created_at }}
+                </div>
+            </td>
+            <td class="px-2">@{{item.memo ? item.memo : '-'}}</td>
+            @include('app.patient.partials.ticket_vue_collab_column')
+            {{--<td class="px-2">
                 <a class="mr-2 c-pointer" v-on:click.prevent="showPopup('imaging-popup', item)">Edit</a>
                 <a class="mr-2 c-pointer" v-if="item.is_open" v-on:click.prevent="closeItem(item)">Close</a>
                 <a class="mr-2 c-pointer" v-if="!item.is_open" v-on:click.prevent="openItem(item)">Open</a>
 
-                @include('app.patient.partials.ticket_action_links')        
-            </td>
+                @include('app.patient.partials.ticket_action_links')
+            </td>--}}
         </tr>
         </tbody>
     </table>
     <div class="stag-popup stag-popup-sm mcp-theme-1" stag-popup-key="imaging-popup">
-        <form method="POST" action="/api/appointment/create" class="overflow-visible">
+        <form method="POST" action="" class="overflow-visible">
             <h3 class="stag-popup-title mb-2">
                 <span>@{{ popupMode === 'add' ? 'Add Imaging Order Item' : 'Edit Imaging Order Item' }}</span>
                 <a href="#" class="ml-auto text-secondary"
@@ -92,19 +114,28 @@
 <script>
     (function() {
         <?php
-        $tickets = $patient->tickets->filter(function($_item) {
-            return $_item->category === 'imaging';
+        $tickets = $patient->tickets->filter(function($_item) use ($filter) {
+            $match = $_item->category === 'imaging';
+            if($filter !== 'all') {
+                $match = $match && ($filter === 'open' ? $_item->is_open : !$_item->is_open);
+            }
+            return $match;
         });
         $items = [];
         foreach ($tickets as $ticket) {
             $item = json_decode($ticket->data);
             $item->uid = $ticket->uid;
             $item->is_open = $ticket->is_open;
+            $item->assigned_pro_id = $ticket->assigned_pro_id;
+            $item->manager_pro_id = $ticket->manager_pro_id;
+            $item->ordering_pro_id = $ticket->ordering_pro_id;
+            $item->initiating_pro_id = $ticket->initiating_pro_id;
             $item->has_assigned_pro_signed = $ticket->has_assigned_pro_signed;
-            $item->has_initiating_pro_signed = $ticket->has_initiating_pro_signed;
             $item->has_manager_pro_signed = $ticket->has_manager_pro_signed;
             $item->has_ordering_pro_signed = $ticket->has_ordering_pro_signed;
+            $item->has_initiating_pro_signed = $ticket->has_initiating_pro_signed;
             $item->is_entry_error = $ticket->is_entry_error;
+            $item->created_at = friendly_date_time($ticket->created_at);
             $items[] = $item;
         }
         ?>
@@ -218,6 +249,7 @@
                 },
                 mounted: function () {
                     this.initICDAutoSuggest();
+                    initFastLoad($('#imagingApp'));
                 }
             })
         }

+ 44 - 12
resources/views/app/patient/partials/lab.blade.php

@@ -3,36 +3,58 @@
         <h4 class="font-weight-bold m-0 font-size-14"><i class="fa fa-vials mr-2"></i>Lab</h4>
         <span class="mx-2 text-secondary">|</span>
         <a class="py-0 font-weight-normal c-pointer" v-on:click.prevent="showPopup('lab-popup')">Add</a>
+        <select class="ml-auto max-width-300px form-control form-control-sm"
+                onchange="fastLoad('/patients/view/{{$patient->uid}}/action-items-lab/' + this.value, true, false, false)">
+            <option value="open" {{ $filter === 'open' ? 'selected' : '' }}>Open tickets</option>
+            <option value="closed" {{ $filter === 'closed' ? 'selected' : '' }}>Closed tickets</option>
+            <option value="all" {{ $filter === 'all' ? 'selected' : '' }}>All tickets</option>
+        </select>
     </div>
-    <table class="table table-sm table-bordered mb-0" style="table-layout: fixed">
+    <table class="table table-sm table-bordered mb-0">
         <thead>
         <tr class="bg-light">
             <th class="px-2 text-secondary border-bottom-0 width-30px">#</th>
             <th class="px-2 text-secondary border-bottom-0">Tests</th>
-            <th class="px-2 text-secondary border-bottom-0">ICDs</th>
             <th class="px-2 text-secondary border-bottom-0">Memo</th>
-            <th class="px-2 text-secondary border-bottom-0">&nbsp;</th>
+            <th class="px-2 text-secondary border-bottom-0 width-200px">Collaboration</th>
         </tr>
         </thead>
         <tbody>
-            <tr v-for="(item, index) in items" :class="item.is_open ? '' : 'opacity-60'">
+            <tr v-for="(item, index) in items" :class="item.is_open ? '' : 'opacity-60 bg-light'">
                 <td class="px-2">@{{ index + 1 }}</td>
-                <td class="px-2" v-html="item.tests && Array.isArray(item.tests) ? item.tests.join('<br>') : item.tests"></td>
-                <td class="px-2" v-html="item.icds && Array.isArray(item.icds) ? item.icds.join('<br>') : item.icds"></td>
-                <td class="px-2">@{{item.memo}}</td>
                 <td class="px-2">
+                    <div class="d-flex align-items-center flex-wrap">
+                        <div>
+                            <a :href="'/patients/view/{{$patient->uid}}/action-items-lab/view/' + item.uid"
+                               v-html="item.tests && Array.isArray(item.tests) ? item.tests.join(', ') : '-'"
+                               class="font-weight-bold font-size-13"></a>
+                        </div>
+                        <span class="mx-2 text-secondary">•</span>
+                        <div>
+                            <span class="text-secondary">ICDs:</span>
+                            <span v-html="item.tests && Array.isArray(item.icds) ? item.icds.join(', ') : '-'"></span>
+                        </div>
+                    </div>
+                    <div>
+                        <span class="text-secondary text-sm mt-1">Created:</span>
+                        @{{ item.created_at }}
+                    </div>
+                </td>
+                <td class="px-2">@{{item.memo ? item.memo : '-'}}</td>
+                @include('app.patient.partials.ticket_vue_collab_column')
+                {{--<td class="px-2">
                     <a class="mr-2 c-pointer" v-on:click.prevent="showPopup('lab-popup', item)">Edit</a>
                     <a class="mr-2 c-pointer" v-if="item.is_open" v-on:click.prevent="closeItem(item)">Close</a>
                     <a class="mr-2 c-pointer" v-if="!item.is_open" v-on:click.prevent="openItem(item)">Open</a>
 
                     @include('app.patient.partials.ticket_action_links')
 
-                </td>
+                </td>--}}
             </tr>
         </tbody>
     </table>
     <div class="stag-popup stag-popup-sm mcp-theme-1" stag-popup-key="lab-popup">
-        <form method="POST" action="/api/appointment/create" class="overflow-visible">
+        <form method="POST" action="" class="overflow-visible">
             <h3 class="stag-popup-title mb-2">
                 <span>@{{ popupMode === 'add' ? 'Add Lab Order Item' : 'Edit Lab Order Item' }}</span>
                 <a href="#" class="ml-auto text-secondary"
@@ -96,19 +118,28 @@
 <script>
     (function() {
         <?php
-        $tickets = $patient->tickets->filter(function($_item) {
-            return $_item->category === 'lab';
+        $tickets = $patient->tickets->filter(function($_item) use ($filter) {
+            $match = $_item->category === 'lab';
+            if($filter !== 'all') {
+                $match = $match && ($filter === 'open' ? $_item->is_open : !$_item->is_open);
+            }
+            return $match;
         });
         $items = [];
         foreach ($tickets as $ticket) {
             $item = json_decode($ticket->data);
             $item->uid = $ticket->uid;
             $item->is_open = $ticket->is_open;
+            $item->assigned_pro_id = $ticket->assigned_pro_id;
+            $item->manager_pro_id = $ticket->manager_pro_id;
+            $item->ordering_pro_id = $ticket->ordering_pro_id;
+            $item->initiating_pro_id = $ticket->initiating_pro_id;
             $item->has_assigned_pro_signed = $ticket->has_assigned_pro_signed;
-            $item->has_initiating_pro_signed = $ticket->has_initiating_pro_signed;
             $item->has_manager_pro_signed = $ticket->has_manager_pro_signed;
             $item->has_ordering_pro_signed = $ticket->has_ordering_pro_signed;
+            $item->has_initiating_pro_signed = $ticket->has_initiating_pro_signed;
             $item->is_entry_error = $ticket->is_entry_error;
+            $item->created_at = friendly_date_time($ticket->created_at);
             $items[] = $item;
         }
         ?>
@@ -222,6 +253,7 @@
                 },
                 mounted: function () {
                     this.initICDAutoSuggest();
+                    initFastLoad($('#labApp'));
                 }
             })
         }

+ 4 - 3
resources/views/app/patient/partials/other.blade.php

@@ -24,7 +24,7 @@
                     <a class="mr-2 c-pointer" v-on:click.prevent="showPopup('other-popup', item)">Edit</a>
                     <a class="mr-2 c-pointer" v-if="item.is_open" v-on:click.prevent="closeItem(item)">Close</a>
                     <a class="mr-2 c-pointer" v-if="!item.is_open" v-on:click.prevent="openItem(item)">Open</a>
-                    
+
                     @include('app.patient.partials.ticket_action_links')
 
                 </td>
@@ -32,7 +32,7 @@
         </tbody>
     </table>
     <div class="stag-popup stag-popup-sm mcp-theme-1" stag-popup-key="other-popup">
-        <form method="POST" action="/api/appointment/create" class="overflow-visible">
+        <form method="POST" action="" class="overflow-visible">
             <h3 class="stag-popup-title mb-2">
                 <span>@{{ popupMode === 'add' ? 'Add Item' : 'Edit Item' }}</span>
                 <a href="#" class="ml-auto text-secondary"
@@ -65,7 +65,7 @@
         $tickets = $patient->tickets->filter(function($_item) {
             return $_item->category === 'other';
         });
-      
+
         $items = [];
         foreach ($tickets as $ticket) {
             $item = json_decode($ticket->data);
@@ -168,6 +168,7 @@
                     @include('app.patient.partials.ticket_vue_methods',['ticketType'=>'other'])
                 },
                 mounted: function () {
+                    initFastLoad($('#otherApp'));
                 }
             })
         }

+ 3 - 13
resources/views/app/patient/partials/ticket_action_links.blade.php

@@ -1,13 +1,3 @@
-<a class="mr-2 c-pointer" v-if="!item.is_entry_error" v-on:click.prevent="setIsEntryErrorToTrue(item)">Mark As Entry Error</a>
-<a class="mr-2 c-pointer" v-if="item.is_entry_error" v-on:click.prevent="setIsEntryErrorToFalse(item)">Undo Mark As Entry Error</a>
-<a class="mr-2 c-pointer" v-if="!item.has_assigned_pro_signed" v-on:click.prevent="signAsAssignedPro(item)">Sign As Assigned Pro</a>
-<a class="mr-2 c-pointer" v-if="item.has_assigned_pro_signed" v-on:click.prevent="undoSignAsAssignedPro(item)">Undo Sign As Assigned Pro</a>
-<a class="mr-2 c-pointer" v-if="!item.has_manager_pro_signed" v-on:click.prevent="signAsManagerPro(item)">Sign As Manager Pro</a>
-<a class="mr-2 c-pointer" v-if="item.has_manager_pro_signed" v-on:click.prevent="undoSignAsManagerPro(item)">Undo Sign As Manager Pro</a>
-<a class="mr-2 c-pointer" v-if="!item.has_ordering_pro_signed" v-on:click.prevent="signAsOrderingPro(item)">Sign As Ordering Pro</a>
-<a class="mr-2 c-pointer" v-if="item.has_ordering_pro_signed" v-on:click.prevent="undoSignAsOrderingPro(item)">Undo Sign As Ordering Pro</a>
-<a class="mr-2 c-pointer" v-if="!item.has_initiating_pro_signed" v-on:click.prevent="signAsInitiatingPro(item)">Sign As Initiating Pro</a>
-<a class="mr-2 c-pointer" v-if="item.has_initiating_pro_signed" v-on:click.prevent="undoSignAsInitiatingPro(item)">Undo Sign As Initiating Pro</a>
-<template v-for="proType in proTypes">
-    <a class="mr-2 c-pointer" v-on:click.prevent="showProUpdatePopup('other-popup', proType, item)">Update @{{proType}} Pro</a>
-</template>
+<a class="btn btn-sm btn-primary text-white font-weight-bold mr-2 c-pointer" v-if="!item.is_entry_error" v-on:click.prevent="setIsEntryErrorToTrue(item)">Mark As Entry Error</a>
+<a class="btn btn-sm btn-primary text-white font-weight-bold mr-2 c-pointer" v-if="item.is_entry_error" v-on:click.prevent="setIsEntryErrorToFalse(item)">Undo Mark As Entry Error</a>
+

+ 84 - 0
resources/views/app/patient/partials/ticket_vue_collab_card.blade.php

@@ -0,0 +1,84 @@
+<div class="card bg-light">
+    <div class="card-body">
+        <span class="d-flex align-items-center mb-2" v-if="item.assigned_pro_id">
+            <span class="text-secondary text-sm width-50px">Assigned:</span>
+            <b>@{{proNameFromId(item.assigned_pro_id)}}</b>
+            <span class="d-inline-flex" v-if="item.manager_pro_id === {{$pro->id}}">
+                <span class="mx-2 opacity-60 text-secondary">•</span>
+                <a class="on-hover-opaque c-pointer" v-on:click.prevent="showProUpdatePopup('other-popup', 'Assigned', item)">
+                    <i class="fa fa-edit"></i>
+                </a>
+            </span>
+            <span class="d-inline-flex" v-if="item.assigned_pro_id === {{$pro->id}}">
+                <span class="mx-2 opacity-60 text-secondary">•</span>
+                <span v-if="item.has_assigned_pro_signed" class="text-success">
+                    <i class="fa fa-check"></i>
+                    Signed
+                    <a class="ml-2 c-pointer" v-on:click.prevent="undoSignAsAssignedPro(item)">Undo</a>
+                </span>
+                <a v-if="!item.has_assigned_pro_signed" class="c-pointer"
+                   v-on:click.prevent="signAsAssignedPro(item)">Sign</a>
+            </span>
+        </span>
+        <span class="d-flex align-items-center mb-2" v-if="item.manager_pro_id">
+            <span class="text-secondary text-sm width-50px">Manager:</span>
+            <b>@{{proNameFromId(item.manager_pro_id)}}</b>
+            <span class="d-inline-flex" v-if="item.manager_pro_id === {{$pro->id}}">
+                <span class="mx-2 opacity-60 text-secondary">•</span>
+                <a class="on-hover-opaque c-pointer" v-on:click.prevent="showProUpdatePopup('other-popup', 'Manager', item)">
+                    <i class="fa fa-edit"></i>
+                </a>
+            </span>
+            <span class="d-inline-flex" v-if="item.manager_pro_id === {{$pro->id}}">
+                <span class="mx-2 opacity-60 text-secondary">•</span>
+                <span v-if="item.has_manager_pro_signed" class="text-success">
+                    <i class="fa fa-check"></i>
+                    Signed
+                    <a class="ml-2 c-pointer" v-on:click.prevent="undoSignAsManagerPro(item)">Undo</a>
+                </span>
+                <a v-if="!item.has_manager_pro_signed" class="c-pointer"
+                   v-on:click.prevent="signAsManagerPro(item)">Sign</a>
+            </span>
+        </span>
+        <span class="d-flex align-items-center mb-2" v-if="item.initiating_pro_id">
+            <span class="text-secondary text-sm width-50px">Initiating:</span>
+            <b>@{{proNameFromId(item.initiating_pro_id)}}</b>
+            <span class="d-inline-flex" v-if="item.manager_pro_id === {{$pro->id}}">
+                <span class="mx-2 opacity-60 text-secondary">•</span>
+                <a class="on-hover-opaque c-pointer" v-on:click.prevent="showProUpdatePopup('other-popup', 'Initiating', item)">
+                    <i class="fa fa-edit"></i>
+                </a>
+            </span>
+            <span class="d-inline-flex" v-if="item.initiating_pro_id === {{$pro->id}}">
+                <span class="mx-2 opacity-60 text-secondary">•</span>
+                <span v-if="item.has_initiating_pro_signed" class="text-success">
+                    <i class="fa fa-check"></i>
+                    Signed
+                    <a class="ml-2 c-pointer" v-on:click.prevent="undoSignAsInitiatingPro(item)">Undo</a>
+                </span>
+                <a v-if="!item.has_initiating_pro_signed" class="c-pointer"
+                   v-on:click.prevent="signAsInitiatingPro(item)">Sign</a>
+            </span>
+        </span>
+        <span class="d-flex align-items-center" v-if="item.ordering_pro_id">
+            <span class="text-secondary text-sm width-50px">Ordering:</span>
+            <b>@{{proNameFromId(item.ordering_pro_id)}}</b>
+            <span class="d-inline-flex" v-if="item.manager_pro_id === {{$pro->id}}">
+                <span class="mx-2 opacity-60 text-secondary">•</span>
+                <a class="on-hover-opaque c-pointer" v-on:click.prevent="showProUpdatePopup('other-popup', 'Ordering', item)">
+                    <i class="fa fa-edit"></i>
+                </a>
+            </span>
+            <span class="d-inline-flex" v-if="item.ordering_pro_id === {{$pro->id}}">
+                <span class="mx-2 opacity-60 text-secondary">•</span>
+                <span v-if="item.has_ordering_pro_signed" class="text-success">
+                    <i class="fa fa-check"></i>
+                    Signed
+                    <a class="ml-2 c-pointer" v-on:click.prevent="undoSignAsOrderingPro(item)">Undo</a>
+                </span>
+                <a v-if="!item.has_ordering_pro_signed" class="c-pointer"
+                   v-on:click.prevent="signAsOrderingPro(item)">Sign</a>
+            </span>
+        </span>
+    </div>
+</div>

+ 33 - 0
resources/views/app/patient/partials/ticket_vue_collab_column.blade.php

@@ -0,0 +1,33 @@
+<td class="px-2">
+    <span class="d-inline-flex align-items-center" v-if="item.assigned_pro_id">
+        <span class="text-nowrap">
+            <span class="text-secondary text-sm">Assigned:</span>
+            <b>@{{proNameFromId(item.assigned_pro_id)}}</b>
+            <span class="text-secondary text-sm" v-html="item.has_assigned_pro_signed ? '(signed)' : ''"></span>
+        </span>
+    </span>
+    <br>
+    <span class="d-inline-flex align-items-center" v-if="item.manager_pro_id">
+        <span class="text-nowrap">
+            <span class="text-secondary text-sm">Manager:</span>
+            <b>@{{proNameFromId(item.manager_pro_id)}}</b>
+            <span class="text-secondary text-sm" v-html="item.has_manager_pro_signed ? '(signed)' : ''"></span>
+        </span>
+    </span>
+    <br>
+    <span class="d-inline-flex align-items-center" v-if="item.initiating_pro_id">
+        <span class="text-nowrap">
+            <span class="text-secondary text-sm">Initiating:</span>
+            <b>@{{proNameFromId(item.initiating_pro_id)}}</b>
+            <span class="text-secondary text-sm" v-html="item.has_ordering_pro_signed ? '(signed)' : ''"></span>
+        </span>
+    </span>
+    <br>
+    <span class="d-inline-flex align-items-center" v-if="item.ordering_pro_id">
+        <span class="text-nowrap">
+            <span class="text-secondary text-sm">Ordering:</span>
+            <b>@{{proNameFromId(item.ordering_pro_id)}}</b>
+            <span class="text-secondary text-sm" v-html="item.has_initiating_pro_signed ? '(signed)' : ''"></span>
+        </span>
+    </span>
+</td>

+ 2 - 1
resources/views/app/patient/partials/ticket_vue_data.blade.php

@@ -1,3 +1,4 @@
+allPros: {!! json_encode($allPros) !!},
 proToUpdate: '',
 proTypes: ['Assigned', 'Manager', 'Initiating', 'Ordering'],
-newProUid:''
+newProUid:''

+ 23 - 12
resources/views/app/patient/partials/ticket_vue_methods.blade.php

@@ -1,3 +1,14 @@
+proNameFromId: function(_id) {
+    let matched = this.allPros.filter(_pro => {
+        return _pro.id === _id;
+    });
+    if(matched && matched.length) {
+        matched = matched[0];
+        return [matched.name_last, matched.name_first].filter(Boolean).join(', ');
+    }
+    return '-';
+},
+
 showProUpdatePopup: function(_name, _proToUpdate, _item) {
     closeStagPopup();
     this.proToUpdate = _proToUpdate
@@ -19,7 +30,7 @@ updateTicketPro: function() {
     showMask();
     let payload = this.popupItem;
     payload.newProUid = self.newProUid;
-    
+
     $.post(
         '/api/ticket/update' + self.proToUpdate +'Pro',
         payload,
@@ -39,7 +50,7 @@ setIsEntryErrorToTrue: function(_item){
     $.post('/api/ticket/setIsEntryErrorToTrue', {
         uid:_item.uid
     }, function(_data){
-        fastReload();     
+        fastReload();
     });
 },
 
@@ -48,7 +59,7 @@ setIsEntryErrorToFalse: function(_item){
     $.post('/api/ticket/setIsEntryErrorToFalse', {
         uid:_item.uid
     }, function(_data){
-        fastReload();     
+        fastReload();
     })
 },
 
@@ -57,7 +68,7 @@ signAsAssignedPro: function(_item){
     $.post('/api/ticket/signAsAssignedPro', {
         uid:_item.uid
     }, function(_data){
-        fastReload();     
+        fastReload();
     })
 },
 
@@ -66,7 +77,7 @@ undoSignAsAssignedPro: function(_item){
     $.post('/api/ticket/undoSignAsAssignedPro', {
         uid:_item.uid
     }, function(_data){
-        fastReload();     
+        fastReload();
     })
 },
 
@@ -75,7 +86,7 @@ signAsManagerPro: function(_item){
     $.post('/api/ticket/signAsManagerPro', {
         uid:_item.uid
     }, function(_data){
-        fastReload();     
+        fastReload();
     })
 },
 
@@ -84,7 +95,7 @@ undoSignAsManagerPro: function(_item){
     $.post('/api/ticket/undoSignAsManagerPro', {
         uid:_item.uid
     }, function(_data){
-        fastReload();     
+        fastReload();
     })
 },
 
@@ -93,7 +104,7 @@ signAsOrderingPro: function(_item){
     $.post('/api/ticket/signAsOrderingPro', {
         uid:_item.uid
     }, function(_data){
-        fastReload();     
+        fastReload();
     })
 },
 
@@ -102,7 +113,7 @@ undoSignAsOrderingPro: function(_item){
     $.post('/api/ticket/undoSignAsOrderingPro', {
         uid:_item.uid
     }, function(_data){
-        fastReload();     
+        fastReload();
     })
 },
 
@@ -111,7 +122,7 @@ signAsInitiatingPro: function(_item){
     $.post('/api/ticket/signAsInitiatingPro', {
         uid:_item.uid
     }, function(_data){
-        fastReload();     
+        fastReload();
     })
 },
 
@@ -120,6 +131,6 @@ undoSignAsInitiatingPro: function(_item){
     $.post('/api/ticket/undoSignAsInitiatingPro', {
         uid:_item.uid
     }, function(_data){
-        fastReload();     
+        fastReload();
     })
-}
+}

+ 31 - 5
resources/views/layouts/patient.blade.php

@@ -45,10 +45,36 @@
                             <a class="nav-link {{ strpos($routeName, 'patients.view.handouts') === 0 ? 'active' : '' }}"
                                href="{{ route('patients.view.handouts', ['patient' => $patient]) }}">Handouts</a>
                         </li>
-                        <li class="nav-item">
-                            <a class="nav-link {{ strpos($routeName, 'patients.view.action-items') === 0 ? 'active' : '' }}"
-                               href="{{ route('patients.view.action-items', ['patient' => $patient]) }}">ERx/Orders</a>
-                        </li>
+                            <li class="nav-item">
+                                <a class="nav-link d-flex align-items-center {{ strpos($routeName, 'patients.view.action-items') === 0 ? 'active' : '' }}"
+                                   native onclick="return false">
+                                    <span class="text-dark">ERx/Orders</span>
+                                    {{--<i class="fa if-collapsed fa-chevron-down text-secondary ml-auto mr-1"></i>
+                                    <i class="fa if-not-collapsed fa-chevron-up text-secondary ml-auto mr-1"></i>--}}
+                                </a>
+                                <ul class="m-0 p-0 nav-child-list">
+                                    <li class="nav-item">
+                                        <a class="nav-link {{ strpos($routeName, 'patients.view.action-items-erx') === 0 ? 'active' : '' }}"
+                                           href="{{ route('patients.view.action-items-erx', ['patient' => $patient]) }}">ERx</a>
+                                    </li>
+                                    <li class="nav-item">
+                                        <a class="nav-link {{ strpos($routeName, 'patients.view.action-items-lab') === 0 ? 'active' : '' }}"
+                                           href="{{ route('patients.view.action-items-lab', ['patient' => $patient]) }}">Lab</a>
+                                    </li>
+                                    <li class="nav-item">
+                                        <a class="nav-link {{ strpos($routeName, 'patients.view.action-items-imaging') === 0 ? 'active' : '' }}"
+                                           href="{{ route('patients.view.action-items-imaging', ['patient' => $patient]) }}">Imaging</a>
+                                    </li>
+                                    <li class="nav-item">
+                                        <a class="nav-link {{ strpos($routeName, 'patients.view.action-items-equipment') === 0 ? 'active' : '' }}"
+                                           href="{{ route('patients.view.action-items-equipment', ['patient' => $patient]) }}">Equipment</a>
+                                    </li>
+                                    {{--<li class="nav-item">
+                                        <a class="nav-link {{ strpos($routeName, 'patients.view.action-items-other') === 0 ? 'active' : '' }}"
+                                           href="{{ route('patients.view.action-items-other', ['patient' => $patient]) }}">Other</a>
+                                    </li>--}}
+                                </ul>
+                            </li>
                         <li class="nav-item">
                             <a class="nav-link {{ strpos($routeName, 'patients.view.allergies') === 0 ? 'active' : '' }}"
                                href="{{ route('patients.view.allergies', ['patient' => $patient]) }}">Allergies</a>
@@ -381,7 +407,7 @@
                                                 </div>
                                             </form>
                                         </span>
-                                        
+
                                     </div>
                                 </section>
                                 {{--<section>

+ 8 - 4
resources/views/layouts/template.blade.php

@@ -194,6 +194,10 @@
 
     <script>
         $(document).ready(function() {
+            window.toggleChildLinks = function(_element) {
+                $(_element).closest('.nav-item').toggleClass('nav-child-collapsed');
+                return false;
+            }
             const debounce = (func, wait) => {
                 let timeout;
                 return function executedFunction(...args) {
@@ -294,13 +298,13 @@
 
             window.socketClient.subscribe("/user/topic/newMcpRequest", function(message) {
                 console.log("Received new mcp request: ", message);
-                //TODO: Update the mcp queue on the DOM 
+                //TODO: Update the mcp queue on the DOM
             }); // once in 15 seconds
 
             window.socketClient.subscribe("/user/topic/removeMcpRequest", function(message) {
                 console.log("An mcp request has been removed: ", message);
-                //TODO: Update the mcp queue on the DOM 
-            }); 
+                //TODO: Update the mcp queue on the DOM
+            });
 
             window.socketClient.subscribe("/user/topic/myCurrentProClientWork", function(message) {
                 console.log("You have a client pro work: ", message);
@@ -308,7 +312,7 @@
                     $('.current-work').html(_data);
                     initFastLoad($('.current-work'));
                 });
-            });   
+            });
 
         });
     </script>

+ 10 - 0
routes/web.php

@@ -101,6 +101,16 @@ Route::middleware('pro.auth')->group(function () {
         Route::get('immunizations', 'PatientController@immunizations')->name('immunizations');
         Route::get('allergies', 'PatientController@allergies')->name('allergies');
         Route::get('action-items', 'PatientController@actionItems')->name('action-items');
+        Route::get('action-items-erx/view/{ticket}', 'PatientController@actionItemsErxSingle')->name('action-items-erx-single');
+        Route::get('action-items-lab/view/{ticket}', 'PatientController@actionItemsLabSingle')->name('action-items-lab-single');
+        Route::get('action-items-imaging/view/{ticket}', 'PatientController@actionItemsImagingSingle')->name('action-items-imaging-single');
+        Route::get('action-items-equipment/view/{ticket}', 'PatientController@actionItemsEquipmentSingle')->name('action-items-equipment-single');
+        Route::get('action-items-other/view/{ticket}', 'PatientController@actionItemsOtherSingle')->name('action-items-other-single');
+        Route::get('action-items-erx/{filter?}', 'PatientController@actionItemsErx')->name('action-items-erx');
+        Route::get('action-items-lab/{filter?}', 'PatientController@actionItemsLab')->name('action-items-lab');
+        Route::get('action-items-imaging/{filter?}', 'PatientController@actionItemsImaging')->name('action-items-imaging');
+        Route::get('action-items-equipment/{filter?}', 'PatientController@actionItemsEquipment')->name('action-items-equipment');
+        Route::get('action-items-other/{filter?}', 'PatientController@actionItemsOther')->name('action-items-other');
         Route::get('notes/{filter?}', 'PatientController@notes')->name('notes');
         Route::name('notes.view.')->prefix('notes/view/{note}')->group(function () {
             Route::get('', 'NoteController@dashboard')->name('dashboard');