Browse Source

Visit moe - social history (wip 1)

Vijayakrishnan 3 years ago
parent
commit
fc163325e8

+ 8 - 4
app/Models/Point.php

@@ -28,15 +28,19 @@ class Point extends Model
         return $this->hasOne(Note::class, 'id', 'last_child_plan_point_scoped_note_id');
         return $this->hasOne(Note::class, 'id', 'last_child_plan_point_scoped_note_id');
     }
     }
 
 
-    public static function getGlobalSingletonOfCategory(Client $_patient, String $_category) {
-        return Point
+    public static function getGlobalSingletonOfCategory(Client $_patient, String $_category, $_assoc = false) {
+        $point = Point
             ::where('client_id', $_patient->id)
             ::where('client_id', $_patient->id)
             ->where('category', $_category)
             ->where('category', $_category)
             ->orderBy('created_at', 'DESC')
             ->orderBy('created_at', 'DESC')
             ->first();
             ->first();
+        if ($point->data) {
+            $point->data = json_decode($point->data, $_assoc);
+        }
+        return $point;
     }
     }
 
 
-    public static function getIntakePointsOfCategory(Client $_patient, String $_category, Note $_note) {
+    public static function getIntakePointsOfCategory(Client $_patient, String $_category, Note $_note, $_assoc = false) {
         $points = Point
         $points = Point
             ::where('client_id', $_patient->id)
             ::where('client_id', $_patient->id)
             ->where('category', $_category)
             ->where('category', $_category)
@@ -53,7 +57,7 @@ class Point extends Model
             ->get();
             ->get();
         foreach ($points as $point) {
         foreach ($points as $point) {
             if ($point->data) {
             if ($point->data) {
-                $point->data = json_decode($point->data);
+                $point->data = json_decode($point->data, $_assoc);
             }
             }
         }
         }
         return $points;
         return $points;

+ 262 - 1
resources/views/app/patient/segment-templates/history_social/edit.php

@@ -1 +1,262 @@
-<h1>Edit for history_social</h1>
+<?php
+
+use App\Models\Point;
+use App\Models\Client;
+use App\Models\Note;
+use App\Models\Segment;
+
+/** @var Client $patient */
+/** @var Note $note */
+/** @var Segment $segment */
+
+$point = Point::getGlobalSingletonOfCategory($patient, 'SOCIAL_HISTORY',true);
+
+$socHx = $point->data;
+
+$fields = [
+    [
+        "Tobacco" => ["Current every day smoker", "Current some day smoker", "Former smoker", "Heavy tobacco smoker", "Light tobacco smoker", "Never smoker", "Smoker, current status unknown", "Unknown if ever smoked "],
+    ],
+    [
+        "Alcohol" => ["Do not drink", "Drink daily", "Frequently drink", "Hx of Alcoholism", "Occasional drink"],
+        "Drug Abuse" => ["IVDU", "Illicit drug use", "No illicit drug use"],
+    ],
+    [
+        "Cardiovascular" => ["Eat healthy meals", "Regular exercise", "Take daily aspirin"],
+        "Safety" => ["Household Smoke detector", "Keep Firearms in home", "Wear seatbelts"],
+    ],
+    [
+        "Sexual Activity" => ["Exposure to STI", "Homosexual encounters", "Not sexually active", "Safe sex practices", "Sexually active"],
+        "Birth Gender" => ["Male", "Female", "Undifferentiated"],
+    ]
+];
+
+$customFields = [];
+/*
+ // TODO
+$customFields = $pro->canvasCustomItems('sochx');
+$customFields = array_map(function($_item) {
+    return $_item['label'];
+}, $customFields->toArray());
+*/
+if (!$socHx) {
+    $socHx = [
+        "common" => [],
+        "custom" => [],
+        "comments" => "",
+    ];
+}
+
+$contentData = $socHx;
+?>
+<div visit-moe close-on-save close-on-cancel class="d-block">
+    <form show url="/api/visitPoint/upsertGlobalSingleton" class="mcp-theme-1">
+        <input type="hidden" name="segmentUid" value="<?= $segment->uid ?>">
+        <input type="hidden" name="category" value="SOCIAL_HISTORY">
+        <input type="hidden" name="data">
+        <div class="row">
+            <?php for ($i = 0; $i < count($fields); $i++): ?>
+                <div class="col-md-3">
+                    <?php foreach ($fields[$i] as $head => $values): ?>
+                        <div class="font-weight-bold mb-2"><?= $head ?></div>
+                        <div class="mb-3">
+                            <?php 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" class="m-0"
+                                           data-name="common-><?= $fName ?>"
+                                        <?= @$contentData['common'][$fName] ? 'checked' : '' ?>
+                                    >
+                                    <span class="mx-2"><?= $values[$k] ?></span>
+                                    <!--<div moe>
+                                        <a href="#" start show>
+                                            <i v-show="common['<?= $fName ?>']" class="fa-comment"
+                                               :class="common['<?= $fName ?>__comments'] ? 'fas' : 'far'"></i>
+                                        </a>
+                                        <div url="/nop">
+                                            <div class="mb-2">
+                                        <textarea class="form-control form-control-sm ns-custom-comment"
+                                                  data-name="common['<?= $fName ?>__comments']"></textarea>
+                                            </div>
+                                            <div class="">
+                                                <button type="button" class="btn btn-sm btn-primary" cancel>Close
+                                                </button>
+                                            </div>
+                                        </div>
+                                    </div>-->
+                                </label>
+                            <?php endfor; ?>
+                        </div>
+                    <?php endforeach; ?>
+                </div>
+            <?php endfor; ?>
+        </div>
+
+        <?php /*
+            <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"
+                                           v-model="newCustomItemLabel"
+                                           class="form-control form-control-sm label_new_custom_item">
+                                </div>
+                                <div>
+                                    <button type="button" class="btn btn-sm btn-primary mr-1"
+                                            v-on:click.prevent="saveCustomItem(newCustomItemLabel)">Submit</button>
+                                    <button type="button" class="btn btn-sm btn-default border"
+                                            v-on:click.prevent="cancelCustomItem()">Cancel</button>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+
+                    {{-- custom items --}}
+                    <div class="d-flex align-items-start flex-wrap custom-items-container">
+                        <div class="w-25" v-for="item in customFields">
+                            <label class="d-flex align-items-center mb-1">
+                                <input type="checkbox" class="m-0"
+                                       v-model="item.value">
+                                <span class="mx-2">@{{ item.label }}</span>
+                                <div moe>
+                                    <a href="#" start show>
+                                        <i v-show="item.value" class="fa-comment" :class="item.comments ? 'fas' : 'far'"></i>
+                                    </a>
+                                    <div url="/nop">
+                                        <div class="mb-2">
+                                            <textarea class="form-control form-control-sm ns-custom-comment" v-model="item.comments"></textarea>
+                                        </div>
+                                        <div class="">
+                                            <button type="button" class="btn btn-sm btn-primary" cancel>Close</button>
+                                        </div>
+                                    </div>
+                                </div>
+                            </label>
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+            */ ?>
+
+        <div class="row mb-3">
+            <div class="col-12">
+                <textarea type="text" class="form-control form-control-sm p-2 mt-2"
+                          data-name="comments"
+                          placeholder="Comments"><?= @$contentData['comments'] ?: '' ?></textarea>
+            </div>
+        </div>
+
+        <div>
+            <button submit class="btn btn-sm btn-primary mr-2">Submit</button>
+            <button cancel class="btn btn-sm btn-default border">Cancel</button>
+        </div>
+
+    </form>
+
+</div>
+
+<script>
+    (function () {
+        let model = <?= json_encode($contentData) ?>;
+        model.newCustomItemLabel = '';
+        let customFields = <?= json_encode($customFields) ?>;
+        if (!model.customFields) {
+            model.customFields = [];
+        }
+        for (let i = 0; i < customFields.length; i++) {
+            let found = model.customFields.filter(function (_item) {
+                return _item.label === customFields[i];
+            }).length;
+            if (!found) {
+                model.customFields.push({
+                    label: customFields[i],
+                    value: '',
+                    comments: '',
+                })
+            }
+        }
+
+        function init() {
+            window.clientSocHXApp = new Vue({
+                el: '#sochxSection',
+                data: model,
+                mounted: function () {
+                    $('#sochxSection [moe][initialized]').removeAttr('initialized');
+                    initMoes();
+                    $('#sochxSection').find('[name="data"]').val(JSON.stringify({
+                        common: this.cleanObject(this.common),
+                        customFields: this.customFields,
+                        comments: this.comments,
+                    }));
+                },
+                watch: {
+                    $data: {
+                        handler: function (val, oldVal) {
+                            $('#sochxSection').find('[name="data"]').val(JSON.stringify({
+                                common: this.cleanObject(this.common),
+                                customFields: this.customFields,
+                                comments: this.comments,
+                            }));
+                        },
+                        deep: true
+                    }
+                },
+                methods: {
+                    cleanObject: function (_source) {
+                        let plObject = {};
+                        for (let y in _source) {
+                            if (_source.hasOwnProperty(y)) {
+                                plObject[y] = _source[y];
+                            }
+                        }
+                        return plObject;
+                    },
+                    saveCustomItem: function (_label) {
+                        if (!_label) return false;
+                        showMask();
+                        let self = this;
+                        $.post('/api/clientCanvasCustomItem/create', {
+                            proUid: '{{ $pro->uid }}',
+                            key: 'sochx',
+                            label: _label
+                        }, function (_data) {
+                            hideMask();
+                            if (_data && _data.success) {
+                                self.appendCustomItem(_label);
+                                hideMoeFormMask();
+                                $('[custom-item-form]').hide();
+                            } else {
+                                toastr.error(_data.message);
+                            }
+                        }, 'json');
+                        return false;
+                    },
+                    cancelCustomItem: function () {
+                        hideMoeFormMask();
+                        $('div[moe]').hide();
+                        return false;
+                    },
+                    appendCustomItem: function (_name) {
+                        this.customFields.push({
+                            label: _name,
+                            value: '',
+                            comments: '',
+                        });
+                        Vue.nextTick(function () {
+                            $('.custom-items-container [moe][initialized]').removeAttr('initialized');
+                            initMoes();
+                        });
+                    }
+                }
+            });
+        }
+
+        // addMCInitializer('client-sochx', init, '#sochxSection');
+    })();
+</script>

+ 95 - 1
resources/views/app/patient/segment-templates/history_social/summary.php

@@ -1 +1,95 @@
-<h1>Summary for history_social</h1>
+<?php
+
+use App\Models\Point;
+use App\Models\Client;
+use App\Models\Note;
+use App\Models\Segment;
+
+/** @var Client $patient */
+/** @var Note $note */
+/** @var Segment $segment */
+
+$point = Point::getGlobalSingletonOfCategory($patient, 'SOCIAL_HISTORY', true);
+
+$contentData = $point->data;
+
+$fields = [
+    [
+        "Tobacco" => ["Current every day smoker", "Current some day smoker", "Former smoker", "Heavy tobacco smoker", "Light tobacco smoker", "Never smoker", "Smoker, current status unknown", "Unknown if ever smoked "],
+    ],
+    [
+        "Alcohol" => ["Do not drink", "Drink daily", "Frequently drink", "Hx of Alcoholism", "Occasional drink"],
+        "Drug Abuse" => ["IVDU", "Illicit drug use", "No illicit drug use"],
+    ],
+    [
+        "Cardiovascular" => ["Eat healthy meals", "Regular exercise", "Take daily aspirin"],
+        "Safety" => ["Household Smoke detector", "Keep Firearms in home", "Wear seatbelts"],
+    ],
+    [
+        "Sexual Activity" => ["Exposure to STI", "Homosexual encounters", "Not sexually active", "Safe sex practices", "Sexually active"],
+        "Birth Gender" => ["Male", "Female", "Undifferentiated"],
+    ]
+];
+
+$isempty = false;
+if(!$contentData) {
+    $contentData = [
+        "common" => [],
+        "customFields" => [],
+        "comments" => "",
+    ];
+    $isempty = true;
+}
+
+if($isempty) {
+    echo '<span class="text-secondary">No social history in the system</span>';
+}
+else {
+
+    for ($i = 0; $i < count($fields); $i++):
+        foreach($fields[$i] as $head => $values):
+            for($k = 0; $k < count($values); $k++):
+                $fName = $head . '_' . sanitize_field_name($values[$k]);
+                if(@$contentData['common'][$fName]): ?>
+                    <div>
+                        <?= ucwords($head) ?>
+                        <i class="fa fa-arrow-right text-sm text-secondary"></i>
+                        <span class="font-weight-bold"><?= $values[$k] ?></span>
+                        <?php if(@$contentData['common'][$fName . '__comments']): ?>
+                            <span class="text-sm ml-1 text-secondary">(<?= $contentData['common'][$fName . '__comments'] ?>)</span>
+                        <?php endif; ?>
+                    </div>
+                <?php
+                endif;
+            endfor;
+        endforeach;
+    endfor;
+
+    // custom fields
+    if(@$contentData['customFields'] && count($contentData['customFields'])):
+        ?> <div class="mt-2"> <?php
+        for ($i = 0; $i < count($contentData['customFields']); $i++):
+            $item = $contentData['customFields'][$i];
+            if($item['value']): ?>
+                <div>
+                    Custom
+                    <i class="fa fa-arrow-right text-sm text-secondary"></i>
+                    <span class="font-weight-bold"><?= $item['label'] ?></span>
+                    <?php if($item['comments']): ?>
+                        <span class="text-sm ml-1 text-secondary">(<?= $item['comments'] ?>)</span>
+                    <?php endif; ?>
+                </div>
+            <?php
+            endif;
+        endfor;
+        ?> </div> <?php
+    endif;
+
+    if(isset($contentData['comments'])) { ?>
+        <div class="mt-2 mb-1">
+            <div class="font-weight-bold">Comments:</div>
+            <div><?= $contentData['comments'] ?></div>
+        </div>
+    <?php }
+}
+?>