Bläddra i källkod

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

Josh 4 år sedan
förälder
incheckning
d3d335f0d9

+ 1 - 0
app/Models/Client.php

@@ -85,6 +85,7 @@ class Client extends Model
 
     public function memos() {
         return $this->hasMany(ClientMemo::class, 'client_id', 'id')
+            ->where('is_cancelled', false)
             ->orderBy('created_at', 'desc');
     }
 

+ 7 - 0
app/Models/SectionTemplate.php

@@ -7,4 +7,11 @@ namespace App\Models;
 class SectionTemplate extends Model
 {
     protected $table = 'section_template';
+
+    public function customItems()
+    {
+        return $this->hasMany(SectionTemplateCustomItem::class, 'section_template_id', 'id')
+            ->where('is_removed', false)
+            ->orderBy('label', 'asc');
+    }
 }

+ 8 - 0
app/Models/SectionTemplateCustomItem.php

@@ -0,0 +1,8 @@
+<?php
+
+namespace App\Models;
+
+class SectionTemplateCustomItem extends Model
+{
+    protected $table = 'section_template_custom_item';
+}

+ 8 - 1
public/css/style.css

@@ -127,13 +127,15 @@ body.stag_rhs_collapsed .app-right-panel {
     border-color: rgb(13, 89, 175);
     box-shadow: none;
 }
-.mcp-theme
 .mcp-theme-1 .nav-item {
     margin: 0;
 }
 .mcp-theme-1 .nav-link:hover {
     background: #e3e3e394;
 }
+.mcp-theme-1 .nav-link.active {
+    background: #e2e2e2;
+}
 .mcp-theme-1 .text-sm {
     font-size: 85%;
 }
@@ -607,3 +609,8 @@ input.search_field, textarea.search_field {
 .note-summary p {
     margin-bottom: 0.25rem;
 }
+.aligned-icon {
+    display: inline-block;
+    width: 18px;
+    text-align: center;
+}

+ 52 - 48
public/js/yemi.js

@@ -306,7 +306,7 @@ var initMoes = function() {
                             if($(realForm).is('form')) $(realForm)[0].reset();
                             showMoeFormMask();
                             setTimeout(function() {
-                                $('[moe]>form:visible').hide();
+                                $('[moe]>form:not([show]):visible').hide();
                                 $(realForm).toggle(100);
                                 initPrimaryForm($(realForm));
                             }, 100);
@@ -363,59 +363,63 @@ var initMoes = function() {
                 }
             }
 
-            // trigger validation
-            if(!$(form)[0].checkValidity()) {
-                $(form)[0].reportValidity();
-                return;
-            }
+            if($(form).is('form')) {
 
-            moe.isProcessing = true;
-            var data = {};
-            var formData = $(form).serializeArray();
-            formData.forEach(function (field) {
-                if (data[field.name]) {
-                    if (data[field.name] instanceof Array) {
-                        data[field.name].push(field.value);
-                    } else {
-                        var arr = [];
-                        arr.push(data[field.name]);
-                        arr.push(field.value);
-                        data[field.name] = arr;
-                    }
-                } else {
-                    data[field.name] = field.value;
+                // trigger validation
+                if (!$(form)[0].checkValidity()) {
+                    $(form)[0].reportValidity();
+                    return;
                 }
-            });
-            console.log(data);
-            //var doAjax = function (url, data, pre, post, onSuccess, onFailure, suppressErrorMessage, onHttpFailure, shouldHideMask, immediatelyHideMaskOnReply)
-            doAjax(url, data, null, function () {
-                moe.isProcessing = false;
-            }, function (data) {
-                if (justLog) { // this is to test!
-                    console.log('RETURNED', data);
-                } else if (redir) {
-                    if (redir == "back") {
-                        window.top.history.back();
+
+                // submit
+                moe.isProcessing = true;
+                var data = {};
+                var formData = $(form).serializeArray();
+                formData.forEach(function (field) {
+                    if (data[field.name]) {
+                        if (data[field.name] instanceof Array) {
+                            data[field.name].push(field.value);
+                        } else {
+                            var arr = [];
+                            arr.push(data[field.name]);
+                            arr.push(field.value);
+                            data[field.name] = arr;
+                        }
                     } else {
-                        if (redir.indexOf('[data]') > -1) {
-                            redir = redir.replace('[data]', data);
+                        data[field.name] = field.value;
+                    }
+                });
+                console.log(data);
+                //var doAjax = function (url, data, pre, post, onSuccess, onFailure, suppressErrorMessage, onHttpFailure, shouldHideMask, immediatelyHideMaskOnReply)
+                doAjax(url, data, null, function () {
+                    moe.isProcessing = false;
+                }, function (data) {
+                    if (justLog) { // this is to test!
+                        console.log('RETURNED', data);
+                    } else if (redir) {
+                        if (redir == "back") {
+                            window.top.history.back();
+                        } else {
+                            if (redir.indexOf('[data]') > -1) {
+                                redir = redir.replace('[data]', data);
+                            }
+                            fastLoad(redir, true, false);
                         }
-                        fastLoad(redir, true, false);
+                    } else if (moeParent.length) {
+                        showMask();
+                        $.get(moeParent.attr('url'), function (_data) {
+                            moeParent.html(_data);
+                            hideMask();
+                            hideMoeFormMask();
+                            initMoes();
+                        });
+                    } else {
+                        pageReload();
                     }
-                } else if (moeParent.length) {
-                    showMask();
-                    $.get(moeParent.attr('url'), function(_data) {
-                        moeParent.html(_data);
-                        hideMask();
-                        hideMoeFormMask();
-                        initMoes();
-                    });
-                } else {
-                    pageReload();
-                }
-            }, function (errorMessage) {
+                }, function (errorMessage) {
 
-            }, false);
+                }, false);
+            }
         });
 
         moe.attr('initialized', 1); // mark as initialized

+ 24 - 3
resources/views/app/mc.blade.php

@@ -35,13 +35,13 @@
             if(!$('#stag_mcp_rhs').length) window.location.reload();
         };
         window.toggleRHS = function() {
-            var body = $('body'), leftPanel = $('.app-left-panel');
+            var body = $('body'), leftPanel = $('.app-left-panel'), result = '';
             if(!body.is('.stag_rhs_collapsed')) {
                 body.addClass('stag_rhs_collapsed');
                 leftPanel.attr('data-prev-style', leftPanel.attr('style'));
                 leftPanel.attr('style', '');
                 leftPanel.removeClass('col-9').addClass('col-12');
-                return 'collapsed';
+                result = 'collapsed';
             }
             else {
                 if(leftPanel.attr('data-prev-style')) {
@@ -50,8 +50,10 @@
                 leftPanel.attr('data-prev-style', '');
                 leftPanel.removeClass('col-12').addClass('col-9');
                 body.removeClass('stag_rhs_collapsed');
-                return 'expanded';
+                result = 'expanded';
             }
+            window.localStorage.stagRHS = result;
+            return result;
         };
         window.showRHS = function() {
             var body = $('body'), leftPanel = $('.app-left-panel');
@@ -62,9 +64,21 @@
                 leftPanel.attr('data-prev-style', '');
                 leftPanel.removeClass('col-12').addClass('col-9');
                 body.removeClass('stag_rhs_collapsed');
+                window.localStorage.stagRHS = 'expanded';
                 return 'expanded';
             }
         };
+        window.hideRHS = function() {
+            var body = $('body'), leftPanel = $('.app-left-panel');
+            if(!body.is('.stag_rhs_collapsed')) {
+                body.addClass('stag_rhs_collapsed');
+                leftPanel.attr('data-prev-style', leftPanel.attr('style'));
+                leftPanel.attr('style', '');
+                leftPanel.removeClass('col-9').addClass('col-12');
+                window.localStorage.stagRHS = 'collapsed';
+                result = 'collapsed';
+            }
+        };
         $(document).ready(function() {
             var body = $('body'), leftPanel = $('.app-left-panel');
             if(!{{$pro->is_enrolled_as_mcp ? 1 : 0}}) {
@@ -73,9 +87,16 @@
                     leftPanel.attr('data-prev-style', leftPanel.attr('style'));
                     leftPanel.attr('style', '');
                     leftPanel.removeClass('col-9').addClass('col-12');
+                    window.localStorage.stagRHS = 'collapsed';
                     return 'collapsed';
                 }
             }
+            if(window.localStorage.stagRHS === 'collapsed') {
+                window.hideRHS();
+            }
+            else {
+                window.showRHS();
+            }
         });
     </script>
 </body>

+ 101 - 1
resources/views/app/patient/dashboard.blade.php

@@ -923,7 +923,7 @@
         <div class="row my-3">
             <div class="col-12">
                 {{-- erx --}}
-                <div  class="mb-2 py-2 border-top">
+                <div  class="mb-2 pt-3 pb-2 border-top">
                     <style>
                         td.fit {
                             width:1%;
@@ -1091,5 +1091,105 @@
             </div>
         </div>
 
+        <div class="row my-3">
+            <div class="col-12">
+                {{-- memos --}}
+                <div  class="mb-2 pt-3 pb-2 border-top">
+                    <div class="">
+                        <div class="d-flex align-items-start pb-2">
+                            <h6 class="my-0 font-weight-bold text-secondary">Client Memos</h6>
+                        </div>
+                        <div moe class="w-50 p-2 border mb-3">
+                            <form url="/api/clientMemo/create" show>
+                                <input type="hidden" name="clientUid" value="{{ $patient->uid }}">
+                                <label class="text-secondary font-weight-bold">+ New Memo</label>
+                                <div class="mb-2">
+                                    <select class="form-control form-control-sm" name="category" required>
+                                        <option value="">-- select --</option>
+                                        <option value="Incoming Call">Incoming Call</option>
+                                        <option value="Outgoing Call">Outgoing Call</option>
+                                        <option value="Call Unspecified">Call Unspecified</option>
+                                        <option value="Other">Other</option>
+                                    </select>
+                                </div>
+                                <div class="mb-2">
+                                    <textarea class="form-control form-control-sm" rows="5" name="content" placeholder="Content"></textarea>
+                                </div>
+                                <div class="d-flex align-items-center">
+                                    <button class="btn btn-sm btn-primary mr-2" type="button" submit>Save</button>
+                                </div>
+                            </form>
+                        </div>
+                        <table class="table table-striped table-sm table-bordered mb-0">
+                            @if($patient->memos && count($patient->memos))
+                                <thead>
+                                <tr>
+                                    <th class="px-2 text-secondary">Created</th>
+                                    <th class="px-2 text-secondary w-25">Category</th>
+                                    <th class="px-2 text-secondary w-50">Summary</th>
+                                    <th class="px-2 text-secondary delete-column">&nbsp;</th>
+                                </tr>
+                                </thead>
+                                <tbody>
+                                @foreach($patient->memos as $memo)
+                                    <tr>
+                                        <td class="px-2">{{ friendly_date_time($memo->created_at) }}</td>
+                                        <td class="px-2">{{ $memo->category }}</td>
+                                        <td class="px-2"><pre class="m-0">{{ $memo->content }}</pre></td>
+                                        <td class="px-2 text-center delete-column">
+                                            <div moe wide relative class="mr-2">
+                                                <a class="on-hover-opaque" start show title="Edit">
+                                                    <i class="font-size-11 fa fa-edit"></i>
+                                                </a>
+                                                <form url="/api/clientMemo/update" right>
+                                                    <input type="hidden" name="uid" value="{{ $memo->uid }}">
+                                                    <div class="mb-2">
+                                                        <select class="form-control form-control-sm" name="category" required>
+                                                            <option value="">-- select --</option>
+                                                            <option {{ $memo->category === "Incoming Call" ? "selected" : "" }} value="Incoming Call">Incoming Call</option>
+                                                            <option {{ $memo->category === "Outgoing Call" ? "selected" : "" }} value="Outgoing Call">Outgoing Call</option>
+                                                            <option {{ $memo->category === "Call Unspecified" ? "selected" : "" }} value="Call Unspecified">Call Unspecified</option>
+                                                            <option {{ $memo->category === "Other" ? "selected" : "" }} value="Other">Other</option>
+                                                        </select>
+                                                    </div>
+                                                    <div class="mb-2">
+                                        <textarea class="form-control form-control-sm" name="content" rows="5"
+                                                  placeholder="Content"><?= $memo->content ?></textarea>
+                                                    </div>
+                                                    <div class="d-flex align-items-center">
+                                                        <button class="btn btn-sm btn-primary mr-2" type="button" submit>Save</button>
+                                                        <button class="btn btn-sm btn-default mr-2 border" type="button"
+                                                                cancel>Cancel</button>
+                                                    </div>
+                                                </form>
+                                            </div>
+                                            <div moe relative>
+                                                <a start show class="on-hover-opaque"><i class="fa fa-trash-alt text-danger"></i></a>
+                                                <form url="/api/clientMemo/cancel" right>
+                                                    <input type="hidden" name="uid" value="{{ $memo->uid }}">
+                                                    <p class="small">Are you sure you want to cancel this memo?</p>
+                                                    <div class="d-flex align-items-center">
+                                                        <button class="btn btn-sm btn-danger mr-2" submit>Delete</button>
+                                                        <button class="btn btn-sm btn-default mr-2 border" cancel>Cancel</button>
+                                                    </div>
+                                                </form>
+                                            </div>
+                                        </td>
+                                    </tr>
+                                @endforeach
+                                </tbody>
+                            @else
+                                <tbody>
+                                <tr>
+                                    <td class="text-secondary p-3">No memos have been created for this patient</td>
+                                </tr>
+                                </tbody>
+                            @endif
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+
     </div>
 @endsection

+ 25 - 27
resources/views/app/patient/memos.blade.php

@@ -1,39 +1,37 @@
 @extends ('layouts.patient')
 @section('inner-content')
     <div class="">
-        <div class="d-flex align-items-center pb-2">
+        <div class="d-flex align-items-start pb-2">
             <h4 class="font-weight-bold m-0">Client Memos</h4>
-            <span class="mx-2 text-secondary">|</span>
-            <div moe wide>
-                <a start show class="">Add</a>
-                <form url="/api/clientMemo/create">
-                    <input type="hidden" name="clientUid" value="{{ $patient->uid }}">
-                    <div class="mb-2">
-                        <select class="form-control form-control-sm" name="category" required>
-                            <option value="">-- select --</option>
-                            <option value="Incoming Call">Incoming Call</option>
-                            <option value="Outgoing Call">Outgoing Call</option>
-                            <option value="Call Unspecified">Call Unspecified</option>
-                            <option value="Other">Other</option>
-                        </select>
-                    </div>
-                    <div class="mb-2">
-                        <textarea class="form-control form-control-sm" rows="10" name="content" placeholder="Content"></textarea>
-                    </div>
-                    <div class="d-flex align-items-center">
-                        <button class="btn btn-sm btn-primary mr-2" type="button" submit>Save</button>
-                        <button class="btn btn-sm btn-default mr-2 border" type="button" cancel>Cancel</button>
-                    </div>
-                </form>
-            </div>
+        </div>
+        <div moe class="w-50 p-2 border mb-3">
+            <form url="/api/clientMemo/create" show>
+                <input type="hidden" name="clientUid" value="{{ $patient->uid }}">
+                <label class="text-secondary font-weight-bold">+ New Memo</label>
+                <div class="mb-2">
+                    <select class="form-control form-control-sm" name="category" required>
+                        <option value="">-- select --</option>
+                        <option value="Incoming Call">Incoming Call</option>
+                        <option value="Outgoing Call">Outgoing Call</option>
+                        <option value="Call Unspecified">Call Unspecified</option>
+                        <option value="Other">Other</option>
+                    </select>
+                </div>
+                <div class="mb-2">
+                    <textarea class="form-control form-control-sm" rows="5" name="content" placeholder="Content"></textarea>
+                </div>
+                <div class="d-flex align-items-center">
+                    <button class="btn btn-sm btn-primary mr-2" type="button" submit>Save</button>
+                </div>
+            </form>
         </div>
         <table class="table table-striped table-sm table-bordered mb-0">
             @if($patient->memos && count($patient->memos))
                 <thead>
                 <tr>
                     <th class="px-2 text-secondary">Created</th>
-                    <th class="px-2 text-secondary">Category</th>
-                    <th class="px-2 text-secondary">Summary</th>
+                    <th class="px-2 text-secondary w-25">Category</th>
+                    <th class="px-2 text-secondary w-50">Summary</th>
                     <th class="px-2 text-secondary delete-column">&nbsp;</th>
                 </tr>
                 </thead>
@@ -60,7 +58,7 @@
                                         </select>
                                     </div>
                                     <div class="mb-2">
-                                        <textarea class="form-control form-control-sm" name="content" rows="10"
+                                        <textarea class="form-control form-control-sm" name="content" rows="5"
                                                   placeholder="Content"><?= $memo->content ?></textarea>
                                     </div>
                                     <div class="d-flex align-items-center">

+ 1 - 0
resources/views/app/patient/note/dashboard.blade.php

@@ -239,6 +239,7 @@
                         @foreach($note->sections as $section)
                         <div class="p-3 border-bottom note-section {{ $section->is_initialized ? '' : 'pending-initialization' }}"
                              data-section-uid="{{ $section->uid }}"
+                             data-section-template-uid="{{ $section->sectionTemplate->uid }}"
                              data-section-template-name="{{ $section->sectionTemplate->internal_name }}">
                             <div class="d-flex align-items-start">
                                 <a class="font-weight-bold mb-2 d-flex align-items-center c-pointer">

+ 4 - 2
resources/views/app/patient/partials/allergies.blade.php

@@ -45,7 +45,8 @@
         </a>
         @endif
     </div>
-    <table class="table table-sm border-0 my-0 mx-2">
+    <div class="px-2">
+    <table class="table table-sm border-0 my-0">
         <tbody>
         <?php $itemCount = 0;
         ?>
@@ -91,7 +92,7 @@
                                         </div>
                                     </form>
                                 </div>
-                                <span class="content-html"><b>{{$line->contentText}}</b></span>
+                                <span class="content-html text-nowrap"><b>{{$line->contentText}}</b></span>
                             </div>
                         </td>
                     </tr>
@@ -107,4 +108,5 @@
         @endif
         </tbody>
     </table>
+    </div>
 </div>

+ 4 - 2
resources/views/app/patient/partials/care-team.blade.php

@@ -51,7 +51,8 @@
         </a>
         @endif
     </div>
-    <table class="table table-sm border-0 my-0 mx-2">
+    <div class="px-2">
+    <table class="table table-sm border-0 my-0">
         <tbody>
         <?php $itemCount = 0; ?>
         @foreach($infoLines as $category => $lines)
@@ -100,7 +101,7 @@
                                         </div>
                                     </form>
                                 </div>
-                                <div class="content-html">
+                                <div class="content-html text-nowrap">
                                     <b>{{$line->contentText}}</b>
                                     <span class="text-secondary mx-1">/</span>
                                     <span class="text-secondary">{{ getVal($line->contentDetail, 'Specialty') }}</span>
@@ -122,4 +123,5 @@
         @endif
         </tbody>
     </table>
+    </div>
 </div>

+ 4 - 2
resources/views/app/patient/partials/dx.blade.php

@@ -56,7 +56,8 @@
         </a>
         @endif
     </div>
-    <table class="table table-sm border-0 my-0 mx-2">
+    <div class="px-2">
+    <table class="table table-sm border-0 my-0">
         <tbody>
         <?php $itemCount = 0; ?>
         @foreach($infoLines as $category => $lines)
@@ -120,7 +121,7 @@
                                         </div>
                                     </form>
                                 </div>
-                                <div class="content-html">
+                                <div class="content-html text-nowrap">
                                     <b>{{$line->contentText}}</b>
                                     @if(!empty(getVal($line->contentDetail, "Chronic or Acute")))
                                         <span class="text-secondary mx-1">/</span>
@@ -146,4 +147,5 @@
         @endif
         </tbody>
     </table>
+    </div>
 </div>

+ 4 - 2
resources/views/app/patient/partials/rx.blade.php

@@ -60,7 +60,8 @@
         </a>
         @endif
     </div>
-    <table class="table table-sm border-0 my-0 mx-2">
+    <div class="px-2">
+    <table class="table table-sm border-0 my-0">
         <tbody>
         <?php $itemCount = 0; ?>
         @foreach($infoLines as $category => $lines)
@@ -120,7 +121,7 @@
                                         </div>
                                     </form>
                                 </div>
-                                <span class="content-html">
+                                <span class="content-html text-nowrap">
                                     <b>{{$line->contentText}}</b>
                                     @if(!empty(getVal($line->contentDetail, "strength")))
                                         <span class="text-secondary">/</span>
@@ -146,5 +147,6 @@
         @endif
         </tbody>
     </table>
+    </div>
 </div>
 

+ 4 - 2
resources/views/app/patient/partials/vitals.blade.php

@@ -106,7 +106,8 @@ foreach($patient->measurements as $measurement) {
         </a>
         @endif
     </div>
-    <table class="table table-sm border-0 my-0 mx-2">
+    <div class="px-2">
+    <table class="table table-sm border-0 my-0">
         <tbody>
         @foreach($vitalLabels as $label)
             <tr>
@@ -138,7 +139,7 @@ foreach($patient->measurements as $measurement) {
                                 </div>
                             </form>
                         </div>
-                        <span class="content-html">
+                        <span class="content-html text-nowrap">
                             <span>{{ $label }}:</span>
                             <b>{{ $vitalValues[$label]['value'] }}</b>
                             <span class="font-weight-normal text-secondary ml-2 text-sm">(as on {{ friendly_date_time($vitalValues[$label]['effectiveDate'], false) }})</span>
@@ -156,4 +157,5 @@ foreach($patient->measurements as $measurement) {
         @endif
         </tbody>
     </table>
+    </div>
 </div>

+ 43 - 59
resources/views/layouts/patient.blade.php

@@ -8,47 +8,62 @@
             <nav id="sidebarMenu" class="d-md-block bg-light sidebar collapse px-0">
                 <div class="sidebar-sticky pt-3">
                     <ul class="nav flex-column mcp-theme-1">
+                        <?php $routeName = request()->route()->getName(); ?>
                         <li class="nav-item">
-                            <a class="nav-link" href="{{ route('patients.view.dashboard', ['patient' => $patient]) }}">Dashboard</a>
+                            <a class="nav-link {{ strpos($routeName, 'patients.view.dashboard') === 0 ? 'active' : '' }}"
+                               href="{{ route('patients.view.dashboard', ['patient' => $patient]) }}">Dashboard</a>
                         </li>
                         <li class="nav-item">
-                            <a class="nav-link" href="{{ route('patients.view.care-months', ['patient' => $patient]) }}">Care Months</a>
+                            <a class="nav-link {{ strpos($routeName, 'patients.view.care-months') === 0 ? 'active' : '' }}"
+                               href="{{ route('patients.view.care-months', ['patient' => $patient]) }}">Care Months</a>
                         </li>
                         <li class="nav-item">
-                            <a class="nav-link" href="{{ route('patients.view.notes', ['patient' => $patient]) }}">Notes</a>
+                            <a class="nav-link {{ strpos($routeName, 'patients.view.notes') === 0 ? 'active' : '' }}"
+                               href="{{ route('patients.view.notes', ['patient' => $patient]) }}">Notes</a>
                         </li>
                         <li class="nav-item">
-                            <a class="nav-link" href="{{ route('patients.view.action-items', ['patient' => $patient]) }}">ERx/Orders</a>
+                            <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" href="{{ route('patients.view.allergies', ['patient' => $patient]) }}">Allergies</a>
+                            <a class="nav-link {{ strpos($routeName, 'patients.view.allergies') === 0 ? 'active' : '' }}"
+                               href="{{ route('patients.view.allergies', ['patient' => $patient]) }}">Allergies</a>
                         </li>
                         <li class="nav-item">
-                            <a class="nav-link" href="{{ route('patients.view.medications', ['patient' => $patient]) }}">Medications</a>
+                            <a class="nav-link {{ strpos($routeName, 'patients.view.medications') === 0 ? 'active' : '' }}"
+                               href="{{ route('patients.view.medications', ['patient' => $patient]) }}">Medications</a>
                         </li>
                         <li class="nav-item">
-                            <a class="nav-link" href="{{ route('patients.view.dx-and-focus-areas', ['patient' => $patient]) }}">Current Focus Areas</a>
+                            <a class="nav-link {{ strpos($routeName, 'patients.view.dx-and-focus-areas') === 0 ? 'active' : '' }}"
+                               href="{{ route('patients.view.dx-and-focus-areas', ['patient' => $patient]) }}">Current Focus Areas</a>
                         </li>
                         <li class="nav-item">
-                            <a class="nav-link" href="{{ route('patients.view.care-team', ['patient' => $patient]) }}">Care Team</a>
+                            <a class="nav-link {{ strpos($routeName, 'patients.view.care-team') === 0 ? 'active' : '' }}"
+                               href="{{ route('patients.view.care-team', ['patient' => $patient]) }}">Care Team</a>
                         </li>
                         <li class="nav-item">
-                            <a class="nav-link" href="{{ route('patients.view.history', ['patient' => $patient]) }}">History</a>
+                            <a class="nav-link {{ strpos($routeName, 'patients.view.history') === 0 ? 'active' : '' }}"
+                               href="{{ route('patients.view.history', ['patient' => $patient]) }}">History</a>
                         </li>
                         <li class="nav-item">
-                            <a class="nav-link" href="{{ route('patients.view.memos', ['patient' => $patient]) }}">Memos</a>
+                            <a class="nav-link {{ strpos($routeName, 'patients.view.memos') === 0 ? 'active' : '' }}"
+                               href="{{ route('patients.view.memos', ['patient' => $patient]) }}">Memos</a>
                         </li>
                         <li class="nav-item">
-                            <a class="nav-link" href="{{ route('patients.view.sms', ['patient' => $patient]) }}">SMS</a>
+                            <a class="nav-link {{ $routeName === 'patients.view.sms' ? 'active' : '' }}"
+                               href="{{ route('patients.view.sms', ['patient' => $patient]) }}">SMS</a>
                         </li>
                         <li class="nav-item">
-                            <a class="nav-link" href="{{ route('patients.view.sms-numbers', ['patient' => $patient]) }}">SMS Numbers</a>
+                            <a class="nav-link {{ strpos($routeName, 'patients.view.sms-numbers') === 0 ? 'active' : '' }}"
+                               href="{{ route('patients.view.sms-numbers', ['patient' => $patient]) }}">SMS Numbers</a>
                         </li>
                         <li class="nav-item">
-                            <a class="nav-link" href="{{ route('patients.view.documents', ['patient' => $patient]) }}">Documents</a>
+                            <a class="nav-link {{ strpos($routeName, 'patients.view.documents') === 0 ? 'active' : '' }}"
+                               href="{{ route('patients.view.documents', ['patient' => $patient]) }}">Documents</a>
                         </li>
                         <li class="nav-item">
-                            <a class="nav-link" href="{{ route('patients.view.demographics', ['patient' => $patient]) }}">Contact Info</a>
+                            <a class="nav-link {{ strpos($routeName, 'patients.view.demographics') === 0 ? 'active' : '' }}"
+                               href="{{ route('patients.view.demographics', ['patient' => $patient]) }}">Contact Info</a>
                         </li>
                         {{--<li class="nav-item">
                             <a class="nav-link" href="/patients/view/{{ $patient->uid }}/intake">Intake</a>
@@ -209,51 +224,6 @@
                                             @endif
                                         </div>
                                     </div>
-                                    {{--<ul class=hbox>
-                                        <li><i class="fa fa-phone-alt" aria-hidden="true"></i> {{$confirmedCell}}</li>
-                                        <li><i class="fa fa-envelope" aria-hidden="true"></i> {{$confirmedEmail}}</li>
-                                        <li><i class="fa fa-map-marker-alt" aria-hidden="true"></i> {{$location}}</li>
-                                        <li>
-                                            <div moe>
-                                                <a start show><i class="fa fa-edit"></i></a>
-                                                <form url="/api/client/putContactInfo" class="mcp-theme-1">
-                                                    <input type="hidden" name="uid" value="{{$patient->uid}}">
-                                                    <div class="mb-2">
-                                                        <input type="tel"
-                                                               class="form-control form-control-sm"
-                                                               name="cellNumber"
-                                                               placeholder="Phone Number"
-                                                               value="{{ $patient->cell_number }}">
-                                                    </div>
-                                                    <div class="mb-2">
-                                                        <input type="text"
-                                                               class="form-control form-control-sm"
-                                                               name="email"
-                                                               placeholder="Email"
-                                                               value="{{ $patient->email_address }}">
-                                                    </div>
-                                                    <div class="mb-2">
-                                                        <input type="text"
-                                                               class="form-control form-control-sm"
-                                                               name="city"
-                                                               placeholder="City"
-                                                               value="{{ $patient->home_address_city }}">
-                                                    </div>
-                                                    <div class="mb-2">
-                                                        <input type="text"
-                                                               class="form-control form-control-sm"
-                                                               name="state"
-                                                               placeholder="State"
-                                                               value="{{ $patient->home_address_state }}">
-                                                    </div>
-                                                    <div>
-                                                        <button submit class="btn btn-sm btn-primary mr-1">Submit</button>
-                                                        <button cancel class="btn btn-sm btn-default border">Cancel</button>
-                                                    </div>
-                                                </form>
-                                            </div>
-                                        </li>
-                                    </ul>--}}
                                     <div class=separators>
                                         <div>Joined <?=$memberSince?></div>
                                         <div><label>PCP:</label> {{$mcpName}}</div>
@@ -441,6 +411,20 @@
                                         </span>
                                     </div>
                                 </section>
+                                <ul class="vbox ml-auto align-self-start">
+                                    <li>
+                                        <span class="aligned-icon"><i class="fa fa-map-marker-alt" aria-hidden="true"></i></span>
+                                        {{$location}}
+                                    </li>
+                                    <li>
+                                        <span class="aligned-icon"><i class="fa fa-phone-alt" aria-hidden="true"></i></span>
+                                        {{$confirmedCell}}
+                                    </li>
+                                    <li>
+                                        <span class="aligned-icon"><i class="fa fa-envelope" aria-hidden="true"></i></span>
+                                        {{$confirmedEmail}}
+                                    </li>
+                                </ul>
                             </div>
                         </div></div> <!-- z -->
                     </div>

+ 189 - 96
storage/sections/pmhx/form.blade.php

@@ -26,20 +26,39 @@ $fields = [
     ]
 ];
 
-$customFields = [
-    [
-        ":::Anxiety disorder|BPH|carpal tunnel|CHF|Degernative Disc Disorder|Fibromyalgia",
-    ],
-    [
-        ":::Hard of Hearing|Hearing Impairment|Lupus|Multiple Falls|Multiple kidney stones|Multiple Rib Fractures",
-    ],
-    [
-        ":::Neuropathy|Obesity|Obstructive Sleep Apnea|Primary immunodeficiency diso|pulmonary hypertension|Restless Leg Syndrome",
-    ],
-    [
-        ":::Rhinitis|Russell Silver Syndrome|transverse myelitis|Vertigo",
-    ]
-];
+$customFields = [];
+
+if($section) {
+    $customItems = $section->sectionTemplate->customItems;
+    $perColumn = floor(count($customItems) / 4);
+    if($perColumn < 5) $perColumn = 5;
+    $inColumn = 0;
+    foreach ($customItems as $customItem) {
+        if(!isset($customFields[$inColumn])) $customFields[$inColumn] = [];
+        $customFields[$inColumn][] = $customItem->label;
+        if(count($customFields[$inColumn]) >= $perColumn) {
+            $inColumn++;
+        }
+    }
+    for ($i=0; $i<count($customFields); $i++) {
+        $customFields[$i] = [':::' . implode("|", $customFields[$i])];
+    }
+}
+
+//$customFields = [
+//    [
+//        ":::Anxiety disorder|BPH|carpal tunnel|CHF|Degernative Disc Disorder|Fibromyalgia",
+//    ],
+//    [
+//        ":::Hard of Hearing|Hearing Impairment|Lupus|Multiple Falls|Multiple kidney stones|Multiple Rib Fractures",
+//    ],
+//    [
+//        ":::Neuropathy|Obesity|Obstructive Sleep Apnea|Primary immunodeficiency diso|pulmonary hypertension|Restless Leg Syndrome",
+//    ],
+//    [
+//        ":::Rhinitis|Russell Silver Syndrome|transverse myelitis|Vertigo",
+//    ]
+//];
 
 $contentData = false;
 if($section){
@@ -108,7 +127,7 @@ $formID = rand(0, 100000);
         </div>
     </div>
 
-    <div class="row">
+    <div class="row mb-3">
         @for ($i = 0; $i < count($fields); $i++)
             <div class="col-md-3">
                 @for($j = 0; $j < count($fields[$i]); $j++)
@@ -118,96 +137,119 @@ $formID = rand(0, 100000);
                         if(!empty($parts[0])) $head = $parts[0];
                         $values = explode("|", $parts[1]);
                     ?>
-                    <div class="mb-3">
-                        @if($head !== 'custom')
-                            <div class="font-weight-bold mb-2">{{ $head }}</div>
-                        @endif
-                        @for($k = 0; $k < count($values); $k++)
-                            <?php
-                                $fName = $head . '_' . sanitize_field_name($values[$k]);
-                            ?>
-                            <label class="d-flex align-items-center mb-1">
-                                <input type="checkbox" name="{{ $fName }}" class="m-0"
-                                       onchange="onItemSelected_{{ $formID }}(this)"
-                                       {{ $contentData[$fName] ? 'checked' : '' }}>
-                                <span class="mx-2">{{ $values[$k] }}</span>
-                                <div moe>
-                                    <a href="#" start show>
-                                        <i class="<?= trim(@$contentData[$fName . '__comments']) === '' ? 'far' : 'fas' ?> <?= $contentData[$fName] ? '' : 'd-none' ?> fa-comment"></i>
-                                    </a>
-                                    <div url="/nop">
-                                        <div class="mb-2">
-                                            <textarea name="{{ $fName }}__comments"
-                                                      onchange="onCommentChange_{{ $formID }}(this)"
-                                                      onkeyup="onCommentChange_{{ $formID }}(this)"
-                                                      onpaste="onCommentChange_{{ $formID }}(this)"
-                                                      class="form-control form-control-sm ns-custom-comment"
-                                            >{{ @$contentData[$fName . '__comments'] }}</textarea>
-                                        </div>
-                                        <div class="">
-                                            <button type="button" class="btn btn-sm btn-primary" cancel>Close
-                                            </button>
-                                        </div>
+                    @if($head !== 'custom')
+                        <div class="font-weight-bold mb-2">{{ $head }}</div>
+                    @endif
+                    @for($k = 0; $k < count($values); $k++)
+                        <?php
+                            $fName = $head . '_' . sanitize_field_name($values[$k]);
+                        ?>
+                        <label class="d-flex align-items-center mb-1">
+                            <input type="checkbox" name="{{ $fName }}" class="m-0"
+                                   onchange="onItemSelected_{{ $formID }}(this)"
+                                   {{ $contentData[$fName] ? 'checked' : '' }}>
+                            <span class="mx-2">{{ $values[$k] }}</span>
+                            <div moe>
+                                <a href="#" start show>
+                                    <i class="<?= trim(@$contentData[$fName . '__comments']) === '' ? 'far' : 'fas' ?> <?= $contentData[$fName] ? '' : 'd-none' ?> fa-comment"></i>
+                                </a>
+                                <div url="/nop">
+                                    <div class="mb-2">
+                                        <textarea name="{{ $fName }}__comments"
+                                                  onchange="onCommentChange_{{ $formID }}(this)"
+                                                  onkeyup="onCommentChange_{{ $formID }}(this)"
+                                                  onpaste="onCommentChange_{{ $formID }}(this)"
+                                                  class="form-control form-control-sm ns-custom-comment"
+                                        >{{ @$contentData[$fName . '__comments'] }}</textarea>
+                                    </div>
+                                    <div class="">
+                                        <button type="button" class="btn btn-sm btn-primary" cancel>Close
+                                        </button>
                                     </div>
                                 </div>
-                            </label>
-                            @endfor
-                    </div>
+                            </div>
+                        </label>
+                    @endfor
                 @endfor
             </div>
         @endfor
     </div>
 
-    <div class="font-weight-bold mb-2">Custom Items</div>
-
-    <div class="row">
-        @for ($i = 0; $i < count($customFields); $i++)
-            <div class="col-md-3">
-                @for($j = 0; $j < count($customFields[$i]); $j++)
-                    <?php
-                    $parts = explode(":::", $customFields[$i][$j]);
-                    $head = 'custom';
-                    if(!empty($parts[0])) $head = $parts[0];
-                    $values = explode("|", $parts[1]);
-                    ?>
-                    <div class="mb-3">
-                        @if($head !== 'custom')
-                            <div class="font-weight-bold mb-2">{{ $head }}</div>
-                        @endif
-                        @for($k = 0; $k < count($values); $k++)
-                            <?php
-                            $fName = $head . '_' . sanitize_field_name($values[$k]);
-                            ?>
-                            <label class="d-flex align-items-center mb-1">
-                                <input type="checkbox" name="{{ $fName }}" class="m-0"
-                                       onchange="onItemSelected_{{ $formID }}(this)"
-                                       {{ $contentData[$fName] ? 'checked' : '' }}>
-                                <span class="mx-2">{{ $values[$k] }}</span>
-                                <div moe>
-                                    <a href="#" start show>
-                                        <i class="<?= trim(@$contentData[$fName . '__comments']) === '' ? 'far' : 'fas' ?> <?= $contentData[$fName] ? '' : 'd-none' ?> fa-comment"></i>
-                                    </a>
-                                    <div url="/nop">
-                                        <div class="mb-2">
-                                            <textarea name="{{ $fName }}__comments"
-                                                      onchange="onCommentChange_{{ $formID }}(this)"
-                                                      onkeyup="onCommentChange_{{ $formID }}(this)"
-                                                      onpaste="onCommentChange_{{ $formID }}(this)"
-                                                      class="form-control form-control-sm ns-custom-comment"
-                                            >{{ @$contentData[$fName . '__comments'] }}</textarea>
-                                        </div>
-                                        <div class="">
-                                            <button type="button" class="btn btn-sm btn-primary" cancel>Close
-                                            </button>
-                                        </div>
-                                    </div>
-                                </div>
-                            </label>
-                        @endfor
+    <div class="row border-top pt-3">
+        <div class="col-12">
+            <div class="d-flex align-items-center mb-2">
+                <span class="font-weight-bold">Custom Items</span>
+                <span class="mx-2 text-secondary">|</span>
+                <div moe>
+                    <a href="#" start show>Add</a>
+                    <div custom-item-form url="/api/sectionTemplateCustomItem/create">
+                        <div class="mb-2">
+                            <input type="text" placeholder="Label" class="form-control form-control-sm label_new_custom_item">
+                        </div>
+                        <div>
+                            <button type="button" class="btn btn-sm btn-primary mr-1"
+                                    onclick="return saveCustomItem_{{ $formID }}($(this).closest('[moe]'))">Submit</button>
+                            <button type="button" class="btn btn-sm btn-default border"
+                                    onclick="return cancelCustomItem_{{ $formID }}()">Cancel</button>
+                        </div>
                     </div>
-                @endfor
+                </div>
             </div>
-        @endfor
+
+            @if($customFields && count($customFields))
+                <div class="row mb-3">
+                    @for ($i = 0; $i < count($customFields); $i++)
+                        <div class="col-md-3 custom-field-column" data-column="{{ $i + 1 }}">
+                            @for($j = 0; $j < count($customFields[$i]); $j++)
+                                <?php
+                                $parts = explode(":::", $customFields[$i][$j]);
+                                $head = 'custom';
+                                if(!empty($parts[0])) $head = $parts[0];
+                                $values = explode("|", $parts[1]);
+                                ?>
+                                @if($head !== 'custom')
+                                    <div class="font-weight-bold mb-2">{{ $head }}</div>
+                                @endif
+                                @for($k = 0; $k < count($values); $k++)
+                                    <?php
+                                    $fName = $head . '_' . sanitize_field_name($values[$k]);
+                                    ?>
+                                    <label class="d-flex align-items-center mb-1">
+                                        <input type="checkbox" name="{{ $fName }}" class="m-0"
+                                               onchange="onItemSelected_{{ $formID }}(this)"
+                                            {{ $contentData[$fName] ? 'checked' : '' }}>
+                                        <span class="mx-2">{{ $values[$k] }}</span>
+                                        <div moe>
+                                            <a href="#" start show>
+                                                <i class="<?= trim(@$contentData[$fName . '__comments']) === '' ? 'far' : 'fas' ?> <?= $contentData[$fName] ? '' : 'd-none' ?> fa-comment"></i>
+                                            </a>
+                                            <div url="/nop">
+                                                <div class="mb-2">
+                                        <textarea name="{{ $fName }}__comments"
+                                                  onchange="onCommentChange_{{ $formID }}(this)"
+                                                  onkeyup="onCommentChange_{{ $formID }}(this)"
+                                                  onpaste="onCommentChange_{{ $formID }}(this)"
+                                                  class="form-control form-control-sm ns-custom-comment"
+                                        >{{ @$contentData[$fName . '__comments'] }}</textarea>
+                                                </div>
+                                                <div class="">
+                                                    <button type="button" class="btn btn-sm btn-primary" cancel>Close
+                                                    </button>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </label>
+                                @endfor
+                            @endfor
+                        </div>
+                    @endfor
+                </div>
+            @else
+                <div class="row mb-3">
+                    <div class="col-md-3 custom-field-column" data-column="1"></div>
+                </div>
+            @endif
+        </div>
     </div>
 
     <div class="row mb-3">
@@ -254,4 +296,55 @@ $formID = rand(0, 100000);
             $(_trigger).siblings('[moe]').find('i').first().addClass('d-none');
         }
     }
+    function saveCustomItem_{{ $formID }}(_moe) {
+        console.log('saveCustomItem_{{ $formID }}');
+        let label = $.trim(_moe.find('.label_new_custom_item').first().val());
+        if(!label) return false;
+        showMask();
+        $.post('/api/sectionTemplateCustomItem/create', {
+            sectionTemplateUid: '{{ $section->sectionTemplate->uid }}',
+            label: label
+        }, function(_data) {
+            hideMask();
+            if(_data && _data.success) {
+                appendCustomItem(label);
+                hideMoeFormMask();
+                $('[custom-item-form]').hide();
+            }
+            else {
+                toastr.error(_data.message);
+            }
+        }, 'json');
+        return false;
+    }
+    function cancelCustomItem_{{ $formID }}(_moe) {
+        hideMoeFormMask();
+        $('div[moe]').hide();
+        return false;
+    }
+    function appendCustomItem(_name) {
+        let sanitized = 'custom_' + _name.toLowerCase().replace(/[^0-9a-z]/ig, '_');
+        let html = '<label class="d-flex align-items-center mb-1">' +
+            '<input type="checkbox" name="' + sanitized + '" class="m-0" onchange="onItemSelected_{{ $formID }}(this)">' +
+                '<span class="mx-2">' + _name + '</span>' +
+                '<div moe>' +
+                    '<a href="#" start show><i class="far d-none fa-comment"></i></a>' +
+                    '<div url="/nop">' +
+                        '<div class="mb-2">' +
+                            '<textarea name="' + _name + '__comments" onchange="onCommentChange_{{ $formID }}(this)" onkeyup="onCommentChange_{{ $formID }}(this)" onpaste="onCommentChange_{{ $formID }}(this)" class="form-control form-control-sm ns-custom-comment"></textarea>' +
+                        '</div>' +
+                        '<div class=""><button type="button" class="btn btn-sm btn-primary" cancel>Close</button></div>' +
+                    '</div>' +
+                '</div>' +
+            '</label>';
+        let targetColumn = $('.custom-field-column').first(), numItems = -1;
+        $('.custom-field-column').each(function() {
+            if(numItems === -1 || numItems > $(this).find('>label').length) {
+                numItems = $(this).find('>label').length;
+                targetColumn = $(this);
+            }
+        });
+        targetColumn.append(html);
+        initMoes();
+    }
 </script>

+ 33 - 14
storage/sections/pmhx/processor.php

@@ -26,20 +26,39 @@ $fields = [
     ]
 ];
 
-$customFields = [
-    [
-        ":::Anxiety disorder|BPH|carpal tunnel|CHF|Degernative Disc Disorder|Fibromyalgia",
-    ],
-    [
-        ":::Hard of Hearing|Hearing Impairment|Lupus|Multiple Falls|Multiple kidney stones|Multiple Rib Fractures",
-    ],
-    [
-        ":::Neuropathy|Obesity|Obstructive Sleep Apnea|Primary immunodeficiency diso|pulmonary hypertension|Restless Leg Syndrome",
-    ],
-    [
-        ":::Rhinitis|Russell Silver Syndrome|transverse myelitis|Vertigo",
-    ]
-];
+$customFields = [];
+
+if($section) {
+    $customItems = $section->sectionTemplate->customItems;
+    $perColumn = floor(count($customItems) / 4);
+    if($perColumn < 5) $perColumn = 5;
+    $inColumn = 0;
+    foreach ($customItems as $customItem) {
+        if(!isset($customFields[$inColumn])) $customFields[$inColumn] = [];
+        $customFields[$inColumn][] = $customItem->label;
+        if(count($customFields[$inColumn]) >= $perColumn) {
+            $inColumn++;
+        }
+    }
+    for ($i=0; $i<count($customFields); $i++) {
+        $customFields[$i] = [':::' . implode("|", $customFields[$i])];
+    }
+}
+
+//$customFields = [
+//    [
+//        ":::Anxiety disorder|BPH|carpal tunnel|CHF|Degernative Disc Disorder|Fibromyalgia",
+//    ],
+//    [
+//        ":::Hard of Hearing|Hearing Impairment|Lupus|Multiple Falls|Multiple kidney stones|Multiple Rib Fractures",
+//    ],
+//    [
+//        ":::Neuropathy|Obesity|Obstructive Sleep Apnea|Primary immunodeficiency diso|pulmonary hypertension|Restless Leg Syndrome",
+//    ],
+//    [
+//        ":::Rhinitis|Russell Silver Syndrome|transverse myelitis|Vertigo",
+//    ]
+//];
 
 $newContentData = [];
 

+ 33 - 14
storage/sections/pmhx/summary.php

@@ -26,20 +26,39 @@ $fields = [
     ]
 ];
 
-$customFields = [
-    [
-        ":::Anxiety disorder|BPH|carpal tunnel|CHF|Degernative Disc Disorder|Fibromyalgia",
-    ],
-    [
-        ":::Hard of Hearing|Hearing Impairment|Lupus|Multiple Falls|Multiple kidney stones|Multiple Rib Fractures",
-    ],
-    [
-        ":::Neuropathy|Obesity|Obstructive Sleep Apnea|Primary immunodeficiency diso|pulmonary hypertension|Restless Leg Syndrome",
-    ],
-    [
-        ":::Rhinitis|Russell Silver Syndrome|transverse myelitis|Vertigo",
-    ]
-];
+$customFields = [];
+
+if($section) {
+    $customItems = $section->sectionTemplate->customItems;
+    $perColumn = floor(count($customItems) / 4);
+    if($perColumn < 5) $perColumn = 5;
+    $inColumn = 0;
+    foreach ($customItems as $customItem) {
+        if(!isset($customFields[$inColumn])) $customFields[$inColumn] = [];
+        $customFields[$inColumn][] = $customItem->label;
+        if(count($customFields[$inColumn]) >= $perColumn) {
+            $inColumn++;
+        }
+    }
+    for ($i=0; $i<count($customFields); $i++) {
+        $customFields[$i] = [':::' . implode("|", $customFields[$i])];
+    }
+}
+
+//$customFields = [
+//    [
+//        ":::Anxiety disorder|BPH|carpal tunnel|CHF|Degernative Disc Disorder|Fibromyalgia",
+//    ],
+//    [
+//        ":::Hard of Hearing|Hearing Impairment|Lupus|Multiple Falls|Multiple kidney stones|Multiple Rib Fractures",
+//    ],
+//    [
+//        ":::Neuropathy|Obesity|Obstructive Sleep Apnea|Primary immunodeficiency diso|pulmonary hypertension|Restless Leg Syndrome",
+//    ],
+//    [
+//        ":::Rhinitis|Russell Silver Syndrome|transverse myelitis|Vertigo",
+//    ]
+//];
 
 $blood = [];
 if(isset($newContentData['blood_type'])) {