Kaynağa Gözat

Psych visit - segment - risk assessment

Vijayakrishnan 3 yıl önce
ebeveyn
işleme
3278527c7a

+ 9 - 0
public/css/style.css

@@ -3508,4 +3508,13 @@ table.v-top th {
     overflow: hidden;
     padding: 0;
     border-bottom: 0;
+}
+/*.note_template_psych_visit .edit-container [visit-moe]>form>div:last-child {
+    margin: 0 !important;
+}*/
+.note_template_psych_visit .edit-container [visit-moe]>form>div:last-child>.btn.btn-primary {
+    display: none;
+}
+.note_template_psych_visit .edit-container [visit-moe]>form>div:last-child>.d-inline-flex {
+    display: flex !important;
 }

+ 266 - 1
resources/views/app/patient/segment-templates/psych_risk_assessment/edit.blade.php

@@ -1 +1,266 @@
-Hello
+<?php
+
+use App\Models\Client;
+use App\Models\Point;
+use App\Models\Note;
+/** @var Client $patient */
+/** @var Note $note */
+
+if(!@$segment) $segment = null;
+
+if(!@$sessionKey) {
+    $sessionKey = request()->cookie('sessionKey');
+}
+
+$point = Point::getOrCreateOnlyTopLevelPointOfCategory($note, 'PSYCH_RISK_ASSESSMENT', $sessionKey, true);
+
+$contentData = $parsed = false;
+
+if ($point->lastChildReview && $point->lastChildReview->data) {
+    $point->lastChildReview->data = json_decode($point->lastChildReview->data, true);
+    $contentData = $parsed = $point->lastChildReview->data;
+}
+
+if(!$contentData) {
+    $contentData = [
+        "count" => 1,
+        "no_risks" => false,
+        "items" => [
+            [
+                "area" => '',
+                "level" => null,
+                "intent" => null,
+                "plan" => null,
+                "means" => null,
+                "risk_factors" => '',
+                "protective_factors" => '',
+                "additional_details" => ''
+            ]
+        ]
+    ];
+}
+
+?>
+
+<hr class="hide-outside-popup mt-3 mb-0">
+<div class="p-3 mcp-theme-1">
+    <div {{!!$segment ? 'visit-moe' : 'moe'}} close-on-save close-on-cancel class="d-block">
+        <form show url="/api/visitPoint/upsertChildReview" class="mcp-theme-1">
+            @if(!!@$segment)
+                <input type="hidden" name="segmentUid" value="<?= $segment->uid ?>">
+            @else
+                <input type="hidden" name="segmentUid" value="<?= $note->coreSegment->uid ?>">
+            @endif
+            <input type="hidden" name="uid" value="<?= $point->uid ?>">
+            <input type="hidden" name="noteUid" value="<?= $note->uid ?>">
+            <input type="hidden" name="data">
+
+            <div id="edit-univ_psych_risk_assessment-container">
+
+                <div class="border border-secondary rounded mb-2 p-2">
+                    <label class="my-0 d-flex align-items-center">
+                        <input type="checkbox" class="my-0 mr-2" v-model="no_risks" name="no_risks">
+                        <span>Patient denies all areas of risk. No contrary clinical indications present.</span>
+                    </label>
+                </div>
+
+                <div v-if="!no_risks" v-for="(item, index) in items" class="note-section-item-row">
+                    <hr v-if="index > 0" class="row">
+                    <div class="d-flex align-items-baseline mb-2">
+                        <label class="width-140px my-0">Area of Risk:</label>
+                        <input type="text" class="form-control form-control-sm min-width-unset fg-1" v-model="item.area" required>
+                        <div moe relative v-if="items.length > 1" class="ml-3">
+                            <a href="#" start show><i class="fa fa-trash-alt text-danger on-hover-opaque"></i></a>
+                            <div url="/nop" right>
+                                <p>Are you sure?</p>
+                                <div class="">
+                                    <a class="btn btn-sm btn-danger text-white" v-on:click.prevent="removeItem(index)">Yes</a>
+                                    <button type="button" class="btn btn-sm btn-default border" cancel>No</button>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row mb-1">
+                        <div class="col-3">
+                            <div class="mb-1">Level of Risk:</div>
+                            <label class="my-0 d-flex align-items-center">
+                                <input type="radio" v-model="item.level" value="Low">
+                                <span class="ml-1">Low</span>
+                            </label>
+                            <label class="my-0 d-flex align-items-center">
+                                <input type="radio" v-model="item.level" value="Medium">
+                                <span class="ml-1">Medium</span>
+                            </label>
+                            <label class="my-0 d-flex align-items-center">
+                                <input type="radio" v-model="item.level" value="High">
+                                <span class="ml-1">High</span>
+                            </label>
+                            <label class="my-0 d-flex align-items-center">
+                                <input type="radio" v-model="item.level" value="Imminent">
+                                <span class="ml-1">Imminent</span>
+                            </label>
+                        </div>
+                        <div class="col-3">
+                            <div class="mb-1">Intent to Act:</div>
+                            <label class="my-0 d-flex align-items-center">
+                                <input type="radio" v-model="item.intent" value="Yes">
+                                <span class="ml-1">Yes</span>
+                            </label>
+                            <label class="my-0 d-flex align-items-center">
+                                <input type="radio" v-model="item.intent" value="No">
+                                <span class="ml-1">No</span>
+                            </label>
+                            <label class="my-0 d-flex align-items-center">
+                                <input type="radio" v-model="item.intent" value="Not Applicable">
+                                <span class="ml-1">Not Applicable</span>
+                            </label>
+                        </div>
+                        <div class="col-3">
+                            <div class="mb-1">Plan to Act:</div>
+                            <label class="my-0 d-flex align-items-center">
+                                <input type="radio" v-model="item.plan" value="Yes">
+                                <span class="ml-1">Yes</span>
+                            </label>
+                            <label class="my-0 d-flex align-items-center">
+                                <input type="radio" v-model="item.plan" value="No">
+                                <span class="ml-1">No</span>
+                            </label>
+                            <label class="my-0 d-flex align-items-center">
+                                <input type="radio" v-model="item.plan" value="Not Applicable">
+                                <span class="ml-1">Not Applicable</span>
+                            </label>
+                        </div>
+                        <div class="col-3">
+                            <div class="mb-1">Means to Act:</div>
+                            <label class="my-0 d-flex align-items-center">
+                                <input type="radio" v-model="item.means" value="Yes">
+                                <span class="ml-1">Yes</span>
+                            </label>
+                            <label class="my-0 d-flex align-items-center">
+                                <input type="radio" v-model="item.means" value="No">
+                                <span class="ml-1">No</span>
+                            </label>
+                            <label class="my-0 d-flex align-items-center">
+                                <input type="radio" v-model="item.means" value="Not Applicable">
+                                <span class="ml-1">Not Applicable</span>
+                            </label>
+                        </div>
+                    </div>
+                    <div class="d-flex align-items-baseline mb-1">
+                        <label class="width-140px my-0">Risk Factors:</label>
+                        <input type="text" class="form-control form-control-sm min-width-unset fg-1" v-model="item.risk_factors" required>
+                    </div>
+                    <div class="d-flex align-items-baseline mb-1">
+                        <label class="width-140px my-0">Protective Factors:</label>
+                        <input type="text" class="form-control form-control-sm min-width-unset fg-1" v-model="item.protective_factors" required>
+                    </div>
+                    <div class="d-flex align-items-baseline mb-1">
+                        <label class="width-140px my-0">Additional Details:</label>
+                        <input type="text" class="form-control form-control-sm min-width-unset fg-1" v-model="item.additional_details" required>
+                    </div>
+                </div>
+
+                <div class="form-group my-2">
+                    <button v-if="!no_risks" class="btn btn-sm btn-default text-primary border border-primary mr-2"
+                            v-on:click.prevent="addItem()"
+                    >Add Area of Risk</button>
+                </div>
+
+            </div>
+
+            @if(!!$segment)
+                <div>
+                    <button onclick="return saveVisitForm(this, false, false)" type="button" class="btn btn-sm btn-primary mr-2"><i class="fa fa-save"></i></button>
+                    <div class="d-inline-flex align-self-stretch align-items-center">
+                        <span class="autosave-indicator saving text-sm text-secondary">Saving changes &hellip;</span>
+                        <span class="autosave-indicator saved text-sm text-secondary">
+                            <i class="fa fa-check"></i>
+                            Saved
+                        </span>
+                    </div>
+                </div>
+            @else
+                <div>
+                    <button submit type="button" class="btn btn-sm btn-primary mr-2">Submit</button>
+                    <button cancel type="button" class="btn btn-sm btn-default border" {!! @$closeOnSave ? 'onmousedown="return closeStagPopup()"' : '' !!}>Close</button>
+                </div>
+            @endif
+
+        </form>
+    </div>
+</div>
+<script>
+    (function() {
+
+        function init() {
+
+            new Vue({
+                el: '#edit-univ_psych_risk_assessment-container',
+                data: {
+                    count: {{ $contentData['count'] }},
+                    no_risks: {{ $contentData['no_risks'] ? 'true' : 'false' }},
+                    items: <?= json_encode($contentData['items']) ?>
+                },
+                watch: {
+                    $data: {
+                        handler: function(val, oldVal) {
+                            let parent = $('#edit-univ_psych_risk_assessment-container').closest('form');
+                            parent.find('[name="data"]').val(JSON.stringify(this.$data)).trigger('save-trigger');
+                        },
+                        deep: true
+                    }
+                },
+                methods: {
+
+                    clearValue: function(_item, _key) {
+                        _item[_key] = null;
+                        Vue.nextTick(function() {
+                            $('#edit-univ_psych_risk_assessment-container').find('textarea').first().trigger('input');
+                        });
+                    },
+
+                    addItem: function() {
+                        this.items.push({
+                            area: '',
+                            level: null,
+                            intent: null,
+                            plan: null,
+                            means: null,
+                            risk_factors: '',
+                            protective_factors: '',
+                            additional_details: ''
+                        });
+                        this.count = this.items.length;
+
+                        // trigger autosave!
+                        Vue.nextTick(() => {
+                            let parent = $('#edit-univ_psych_risk_assessment-container').closest('form');
+                            parent.find('[name="no_risks"]').trigger('change');
+                            $('#edit-univ_psych_risk_assessment-container').find('[moe][initialized]').removeAttr('initialized');
+                            initMoes();
+                        });
+                    },
+                    removeItem: function(_index) {
+                        this.items.splice(_index, 1);
+                        this.count = this.items.length;
+
+                        // trigger autosave!
+                        Vue.nextTick(() => {
+                            let parent = $('#edit-univ_psych_risk_assessment-container').closest('form');
+                            parent.find('[name="no_risks"]').trigger('change');
+                            hideMoeFormMask();
+                        });
+                    }
+                },
+                mounted: function() {
+                    $('#edit-univ_psych_risk_assessment-container').find('[moe][initialized]').removeAttr('initialized');
+                    initMoes();
+                }
+            });
+
+        }
+
+        window.segmentInitializers.psych_risk_assessment = init;
+
+    }).call(window);
+</script>

+ 49 - 0
resources/views/app/patient/segment-templates/psych_risk_assessment/log.blade.php

@@ -0,0 +1,49 @@
+<?php
+
+use App\Models\Client;
+use App\Models\Point;
+use App\Models\Note;
+/** @var Client $patient */
+/** @var Note $note */
+
+$point = Point::getOnlyTopLevelPointOfCategory($note, 'PSYCH_RISK_ASSESSMENT', true);
+
+if($point) {
+    ?> <div class="popup-content-container px-3"> <?php
+    foreach ($point->childReviews as $childReview) {
+        $contentData = $parsed = false;
+        if ($childReview->data) {
+            $childReview->data = json_decode($childReview->data, true);
+            $contentData = $parsed = $childReview->data;
+
+            if($contentData && !$contentData['no_risks'] && !!$contentData['count']) {
+                ?>
+                <div class="mb-1 font-weight-bold">{{$childReview->creatorPro->displayName()}} - {{friendly_date($childReview->note->effective_dateest)}}</div>
+                <div class="pl-3 bg-light border p-3 mb-3">
+                <?php
+                for ($i = 0; $i < $contentData['count']; $i++) {
+                    ?>
+                    <div class="<?= $i > 0 ? 'mt-1' : '' ?>">
+                        <div class="d-flex align-items-baseline mb-1">
+                            <b class="mr-3"><?= @($contentData['items'][$i]['area']) ?></b>
+                            <div class="mr-2">Level: <?= @($contentData['items'][$i]['level']) ?></div>
+                            <div class="mr-2">Intent: <?= @($contentData['items'][$i]['intent']) ?></div>
+                            <div class="mr-2">Plan: <?= @($contentData['items'][$i]['plan']) ?></div>
+                            <div class="mr-2">Means: <?= @($contentData['items'][$i]['means']) ?></div>
+                            <div class="ml-3">
+                                <div class="">Risk Factors: <?= @($contentData['items'][$i]['risk_factors']) ?></div>
+                                <div class="">Protective Factors: <?= @($contentData['items'][$i]['protective_factors']) ?></div>
+                                <div class="">Additional Details: <?= @($contentData['items'][$i]['additional_details']) ?></div>
+                            </div>
+                        </div>
+                    </div>
+                    <?php
+                }
+                ?>
+                </div>
+                <?php
+            }
+        }
+    }
+    ?> </div> <?php
+}

+ 57 - 1
resources/views/app/patient/segment-templates/psych_risk_assessment/summary.blade.php

@@ -1 +1,57 @@
-Coming soon
+<?php
+
+use App\Models\Client;
+use App\Models\Point;
+use App\Models\Note;
+/** @var Client $patient */
+/** @var Note $note */
+
+if(!@$note) {
+    $note = $patient->coreNote;
+}
+if(!@$sessionKey) {
+    $sessionKey = request()->cookie('sessionKey');
+}
+
+$point = Point::getOrCreateOnlyTopLevelPointOfCategory($note, 'PSYCH_RISK_ASSESSMENT', $sessionKey, true);
+
+$contentData = $parsed = false;
+
+if ($point->lastChildReview && $point->lastChildReview->data) {
+    $point->lastChildReview->data = json_decode($point->lastChildReview->data, true);
+    $contentData = $parsed = $point->lastChildReview->data;
+}
+
+if($contentData && !$contentData['no_risks'] && !!$contentData['count']) {
+    for ($i = 0; $i < $contentData['count']; $i++) {
+?>
+<div class="<?= $i > 0 ? 'mt-1' : '' ?>">
+    @if(@($contentData['items'][$i]['area']))
+    <div class="d-flex align-items-baseline mb-1">
+        <b class="mr-3"><?= @($contentData['items'][$i]['area']) ?></b>
+        <div class="mr-2"><span class="text-secondary text-sm">Level:</span> <?= @($contentData['items'][$i]['level']) ?></div>
+        <div class="mr-2"><span class="text-secondary text-sm">Intent:</span> <?= @($contentData['items'][$i]['intent']) ?></div>
+        <div class="mr-2"><span class="text-secondary text-sm">Plan:</span> <?= @($contentData['items'][$i]['plan']) ?></div>
+        <div class="mr-2"><span class="text-secondary text-sm">Means:</span> <?= @($contentData['items'][$i]['means']) ?></div>
+    </div>
+    <div class="ml-3">
+        <div class="">Risk Factors: <?= @($contentData['items'][$i]['risk_factors']) ?></div>
+        <div class="">Protective Factors: <?= @($contentData['items'][$i]['protective_factors']) ?></div>
+        <div class="">Additional Details: <?= @($contentData['items'][$i]['additional_details']) ?></div>
+    </div>
+    @endif
+</div>
+<?php
+    }
+}
+else if(@$contentData['no_risks']) {
+?>
+<div class="text-secondary">Patient denies all areas of risk. No contrary clinical indications present.</div>
+<?php
+}
+else {
+?>
+<div class="text-secondary">-</div>
+<?php
+}
+?>