소스 검색

Pro dashboard > measurements tab with stamping and edd-entry

Vijayakrishnan 4 년 전
부모
커밋
3faeb5c991
6개의 변경된 파일337개의 추가작업 그리고 111개의 파일을 삭제
  1. 5 0
      app/Http/Controllers/HomeController.php
  2. 11 0
      app/Models/Client.php
  3. 41 0
      app/Models/Pro.php
  4. 7 4
      public/css/style.css
  5. 270 107
      resources/views/app/dashboard.blade.php
  6. 3 0
      routes/web.php

+ 5 - 0
app/Http/Controllers/HomeController.php

@@ -334,6 +334,11 @@ class HomeController extends Controller
         return json_encode($appointments);
     }
 
+    public function dashboardMeasurements(Request $request, $filter) {
+        $measurements = $this->performer()->pro->getMeasurements($filter === 'NEED_ACK');
+        return json_encode($measurements);
+    }
+
     public function patients(Request $request, $filter = '')
     {
         $performer = $this->performer();

+ 11 - 0
app/Models/Client.php

@@ -95,6 +95,17 @@ class Client extends Model
             ->orderBy('effective_date', 'desc');
     }
 
+    public function currentCareMonth() {
+        $cmStartDate = strtotime(date('Y-m-d'));
+        $month = date("n", $cmStartDate);
+        $year = date("Y", $cmStartDate);
+        return CareMonth
+            ::where('client_id', $this->id)
+            ->whereRaw('EXTRACT(MONTH FROM start_date) = ?', [$month])
+            ->whereRaw('EXTRACT(YEAR FROM start_date) = ?', [$year])
+            ->first();
+    }
+
     public function measurementsInCareMonth(CareMonth $careMonth) {
         $cmStartDate = strtotime($careMonth->start_date);
         $month = date("n", $cmStartDate);

+ 41 - 0
app/Models/Pro.php

@@ -321,4 +321,45 @@ class Pro extends Model
 
         return $allowed ? $clientPrograms : FALSE;
     }
+
+    public function getMeasurements($_onlyUnstamped = false)
+    {
+        $measurementsQuery = Measurement::where('is_removed', false);
+        if ($this->pro_type != 'ADMIN') {
+            $measurementsQuery
+                ->whereIn('client_id', $this->getMyClientIds());
+        }
+        if ($_onlyUnstamped) {
+            $measurementsQuery
+                ->whereNotNull('client_bdt_measurement_id')
+                ->where(function ($q) {
+                    $q->whereNull('status')
+                        ->orWhere(function ($q2) {
+                            $q2->where('status', '<>', 'ACK')
+                                ->where('status', '<>', 'INVALID_ACK');
+                        });
+                });
+        }
+        $measurements = $measurementsQuery->orderBy('id', 'desc')->get();
+
+        // eager load stuff needed in JS
+        foreach ($measurements as $measurement) {
+            if ($measurement->client_bdt_measurement_id) {
+                $measurement->bdtMeasurement = $measurement->clientBDTMeasurement->measurement;
+            }
+            unset($measurement->clientBDTMeasurement); // we do not need this travelling to the frontend
+
+            $client = [
+                "uid" => $measurement->client->uid,
+                "name" => $measurement->client->displayName(),
+            ];
+            $measurement->patient = $client;
+
+            $measurement->careMonth = $measurement->client->currentCareMonth();
+
+            unset($measurement->client); // we do not need this travelling to the frontend
+        }
+
+        return $measurements;
+    }
 }

+ 7 - 4
public/css/style.css

@@ -163,16 +163,16 @@ body.stag_rhs_collapsed .app-right-panel {
     border-color: rgb(13, 89, 175);
     box-shadow: none;
 }
-.mcp-theme-1 .nav-item {
+#sidebarMenu .mcp-theme-1 .nav-item {
     margin: 0;
 }
-.mcp-theme-1 .nav-link:hover {
+#sidebarMenu .mcp-theme-1 .nav-link:hover {
     background: #e3e3e394;
 }
-.mcp-theme-1 .nav-link {
+#sidebarMenu .mcp-theme-1 .nav-link {
     border-top: 1px solid transparent;
 }
-.mcp-theme-1 .nav-link.active {
+#sidebarMenu .mcp-theme-1 .nav-link.active {
     border-top: 1px solid #f8f9fa;
     background: #e2e2e2;
 }
@@ -264,6 +264,9 @@ body>nav.navbar {
 .mcp-theme-1 .width-200px {
     width: 200px !important;
 }
+.mcp-theme-1 .width-22px {
+    width: 22px !important;
+}
 .mcp-theme-1 .width-30px {
     width: 30px !important;
 }

+ 270 - 107
resources/views/app/dashboard.blade.php

@@ -5,7 +5,7 @@
     <div class="m-0 mt-4">
         <div class="row mcp-theme-1" id="pro-dashboard-container" v-cloak>
             <div class="col-md-3 mcp-theme-1">
-                <div class="mb-4">
+                <div class="mb-4" v-show="tab==='appointments'">
                     <div class="pro-dashboard-inline-calendar"></div>
                 </div>
                 <div class="card mb-4">
@@ -80,119 +80,216 @@
                 </div>
             </div>
             <div class="col-md-9">
-                <div class="d-flex align-items-end mb-3">
-                    <b class="large">@{{ selectedDate }}</b>
-                    <div class="ml-auto">
-                        <label class="text-secondary mb-1">Filter by status:</label>
-                        <select v-model="filterStatus"
-                                class="form-control form-control-sm"
-                                v-on:change="updateNumEventsForDate()">
-                            <option value="">ALL</option>
-                            <option value="CREATED">CREATED</option>
-                            <option value="CONFIRMED">CONFIRMED</option>
-                            <option value="CANCELLED">CANCELLED</option>
-                            <option value="COMPLETED">COMPLETED</option>
-                            <option value="ABANDONED">ABANDONED</option>
-                        </select>
-                    </div>
-                </div>
-                <div v-for="event in events" class="align-items-end p-3 border rounded mb-3"
-                     :class="event.dateYMD === selectedDate && (filterStatus === '' || filterStatus === event.status) ? 'd-flex' : 'd-none'">
-                    <div class="patient-avatar mr-3 align-self-center">@{{ event.proInitials }}</div>
-                    <div>
-                        <div class="pb-1">
-                            <b class="text-info">@{{ event.proName }}</b>
-                            &nbsp;/&nbsp;
-                            @{{ event.friendlyStartTime }} - @{{ event.friendlyEndTime }} <span class="text-secondary">@{{ event.timezone }}</span>
-                            &nbsp;/&nbsp;
-                            <span class="d-inline-block ml- 2 text-secondary font-weight-bold">@{{ event.title }}</span>
+
+                <ul class="nav nav-tabs">
+                    <li class="nav-item">
+                        <a class="nav-link" :class="tab == 'appointments' ? 'active' : ''" href="#" v-on:click.prevent="tab='appointments'">Appointments</a>
+                    </li>
+                    <li class="nav-item">
+                        <a class="nav-link" :class="tab == 'measurements' ? 'active' : ''" href="#" v-on:click.prevent="tab='measurements'">Measurements</a>
+                    </li>
+                </ul>
+
+                <div class="border-left border-right border-bottom p-3">
+                    <div v-show="tab==='appointments'">
+                        <div class="d-flex align-items-end mb-3">
+                            <b class="large"><span class="text-secondary">Today:</span> @{{ selectedDate }}</b>
+                            <div class="ml-auto d-inline-flex align-items-center">
+                                <label class="text-secondary mr-2 my-0 text-nowrap">Filter by status:</label>
+                                <select v-model="filterStatus"
+                                        class="form-control form-control-sm"
+                                        v-on:change="updateNumEventsForDate()">
+                                    <option value="">All</option>
+                                    <option value="CREATED">Created</option>
+                                    <option value="CONFIRMED">Confirmed</option>
+                                    <option value="CANCELLED">Cancelled</option>
+                                    <option value="COMPLETED">Completed</option>
+                                    <option value="ABANDONED">Abandoned</option>
+                                </select>
+                            </div>
                         </div>
-                        <div class="pb-1">
-                            <a target="_top" :href="'/mc/patients/view/' + event.clientUid" class="font-weight-bold">@{{ event.clientName }}</a>
-                            <span class="small d-inline-block pl-2 text-secondary font-weight-normal">@{{ event.clientSummary }}</span>
+                        <div v-for="event in events" class="align-items-end p-3 border rounded mb-3"
+                             :class="event.dateYMD === selectedDate && (filterStatus === '' || filterStatus === event.status) ? 'd-flex' : 'd-none'">
+                            <div class="patient-avatar mr-3 align-self-center">@{{ event.proInitials }}</div>
+                            <div>
+                                <div class="pb-1">
+                                    <b class="text-info">@{{ event.proName }}</b>
+                                    &nbsp;/&nbsp;
+                                    @{{ event.friendlyStartTime }} - @{{ event.friendlyEndTime }} <span class="text-secondary">@{{ event.timezone }}</span>
+                                    &nbsp;/&nbsp;
+                                    <span class="d-inline-block ml- 2 text-secondary font-weight-bold">@{{ event.title }}</span>
+                                </div>
+                                <div class="pb-1">
+                                    <a target="_top" :href="'/mc/patients/view/' + event.clientUid" class="font-weight-bold">@{{ event.clientName }}</a>
+                                    <span class="small d-inline-block pl-2 text-secondary font-weight-normal">@{{ event.clientSummary }}</span>
+                                </div>
+                                <div>
+                                    Status: <b class="text-secondary">@{{ event.status }}</b>
+                                    &nbsp;/&nbsp;
+                                    <a target="_top" :href="'/patients/view/' + event.clientUid + '/calendar/' + event.uid">
+                                        <i class="fa fa-edit"></i>
+                                        Edit Appointment
+                                    </a>
+                                </div>
+                            </div>
+                            <div class="ml-auto">
+                                <select v-model="event.newStatus"
+                                        class="form-control form-control-sm bg-light"
+                                        v-on:change="updateStatus(event)">
+                                    <option value="CREATED">CREATED</option>
+                                    <option value="CONFIRMED">CONFIRMED</option>
+                                    <option value="CANCELLED">CANCELLED</option>
+                                    <option value="COMPLETED">COMPLETED</option>
+                                    <option value="ABANDONED">ABANDONED</option>
+                                </select>
+                                <div v-if="selectedDate === '{{ date('Y-m-d') }}'"
+                                     class="pt-1 text-right" :class="event.started ? 'text-danger': 'text-secondary'">
+                                    @{{ event.inHowManyHours }}
+                                </div>
+                            </div>
                         </div>
-                        <div>
-                            Status: <b class="text-secondary">@{{ event.status }}</b>
-                            &nbsp;/&nbsp;
-                            <a target="_top" :href="'/patients/view/' + event.clientUid + '/calendar/' + event.uid">
-                                <i class="fa fa-edit"></i>
-                                Edit Appointment
-                            </a>
-                            {{--<span relative class="ml-1" moe>
-                                <a start show v-on:click.prevent="return showEditForm($event.target)">
-                                    <i class="fa fa-edit"></i>
-                                    Edit Appointment
-                                </a>
-                                <form url="/api/appointment/update" right>
-                                    <input type="hidden" name="uid" :value="event.uid">
-                                    <div class="mb-2">
-                                        <label class="text-secondary text-sm mb-1">Pro</label>
-                                        <select name="proUid" class="form-control form-control-sm">
-                                            <option value=""> --select-- </option>
-                                            @foreach($pros as $iPro)
-                                                <option :selected="event.proUid === '{{$iPro->uid}}'" value="{{$iPro->uid}}">{{$iPro->displayName()}}</option>
-                                            @endforeach
-                                        </select>
-                                    </div>
-                                    <div class="mb-2">
-                                        <label class="text-secondary text-sm mb-1">Date</label>
-                                        <input autofocus type="date" name="date" min="{{ date('Y-m-d') }}"
-                                               :value="event.dateYMD" class="form-control form-control-sm">
-                                    </div>
-                                    <div class="mb-2">
-                                        <label class="text-secondary text-sm mb-1">Start Time</label>
-                                        <input type="time" name="startTime" class="form-control form-control-sm"
-                                               :value="event.raw_start_time ? event.raw_start_time.substr(0, 5) : ''">
-                                    </div>
-                                    <div class="mb-2">
-                                        <label class="text-secondary text-sm mb-1">End Time</label>
-                                        <input type="time" name="endTime" class="form-control form-control-sm"
-                                               :value="event.raw_end_time ? event.raw_end_time.substr(0, 5) : ''">
+                        <div v-if="numEventsForDate === 0" class="bg-light p-3 text-secondary border bounded">
+                        <span v-if="filterStatus === ''">You have no appointments on <b>@{{ selectedDate }}</b></span>
+                        <span v-if="filterStatus !== ''">You have no appointments on <b>@{{ selectedDate }}</b> with status <b>@{{ filterStatus }}</b></span>
+                    </div>
+                    </div>
+                    <div v-show="tab==='measurements'">
+                        <div class="d-flex align-items-end mb-3">
+                            <b class="large">Measurements in {{friendly_month(date('Y-m-d'))}}</b>
+                            <div class="ml-auto d-inline-flex align-items-center">
+                                <label class="text-secondary mr-2 my-0 text-nowrap">Filter by status:</label>
+                                <select v-model="measurementFilterStatus"
+                                        class="form-control form-control-sm"
+                                        v-on:change="updateMeasurements()">
+                                    <option value="ALL">All</option>
+                                    <option value="NEED_ACK">Needs Stamping</option>
+                                </select>
+                            </div>
+                        </div>
+                        <table class="table table-striped table-sm table-bordered mb-0">
+                            <thead>
+                            <tr>
+                                <th class="border-0 px-2 text-secondary">Patient</th>
+                                <th class="border-0 px-2 text-secondary">Category</th>
+                                <th class="border-0 px-2 text-secondary">Value</th>
+                                <th class="border-0 px-2 text-secondary">Mins this month</th>
+                                <th class="border-0 px-2 text-secondary text-center">Stamp</th>
+                                <th class="border-0 px-2 text-secondary text-center">Entry</th>
+                            </tr>
+                            </thead>
+                            <tbody>
+                            <tr v-for="measurement in measurements">
+                                <td class="px-2">
+                                    <a native
+                                       target="_top" :href="'/mc/patients/view/' + measurement.patient.uid"
+                                       class="font-weight-bold">
+                                        @{{ measurement.patient.name }}
+                                    </a>
+                                </td>
+                                <td class="px-2">@{{ measurement.label }}</td>
+                                <td class="px-2">
+                                    <div v-if="!measurement.client_bdt_measurement_id"><b>@{{ measurement.value }}</b></div>
+                                    <div v-else>
+                                        <div v-if="measurement.label === 'BP'">
+                                            <b>@{{ measurement.bdtMeasurement.systolic_bp_in_mm_hg }}</b>/<b>@{{ measurement.bdtMeasurement.diastolic_bp_in_mm_hg }}</b> mmHg
+                                        </div>
+                                        <div v-if="measurement.label === 'SBP'">
+                                            <b>@{{ measurement.bdtMeasurement.systolic_bp_in_mm_hg }}</b> mmHg
+                                        </div>
+                                        <div v-if="measurement.label === 'DBP'">
+                                            <b>@{{ measurement.bdtMeasurement.diastolic_bp_in_mm_hg }}</b> mmHg
+                                        </div>
+                                        <div v-if="measurement.label === 'Wt. (lbs.)'">
+                                            <b>@{{ parseFloat(measurement.bdtMeasurement.weight_in_pounds).toFixed(1) }}</b> lbs
+                                        </div>
                                     </div>
-                                    <div class="mb-2">
-                                        <label class="text-secondary text-sm mb-1">Timezone *</label>
-                                        <select name="timeZone" class="form-control form-control-sm"
-                                                :value="event.timezone" required>
-                                            <option value=""> --select-- </option>
-                                            <option value="EASTERN">Eastern</option>
-                                            <option value="CENTRAL">Central</option>
-                                            <option value="MOUNTAIN">Mountain</option>
-                                            <option value="PACIFIC">Pacific</option>
-                                            <option value="ALASKA">Alaska</option>
-                                            <option value="HAWAII">Hawaii</option>
-                                            <option value="PUERTO_RICO">Puerto Rico</option>
-                                        </select>
+                                </td>
+                                <td class="px-2">
+                                    @{{Math.floor(measurement.careMonth.rm_total_time_in_seconds/60).toFixed(0)}}
+                                </td>
+                                <td colspan="px-2">
+                                    <div v-if="measurement.client_bdt_measurement_id" class="d-flex align-items-center justify-content-center">
+                                        <button class="btn btn-sm py-0 px-1 width-22px" v-on:click.prevent="setMeasurementStatus(measurement.uid, 'ACK')"
+                                                :class="measurement.status === 'ACK' ? 'bg-success text-white' : 'text-success'">
+                                            <i class="fa fa-check"></i>
+                                        </button>
+                                        <button class="btn btn-sm py-0 px-1 width-22px ml-0" v-on:click.prevent="setMeasurementStatus(measurement.uid, 'INVALID_ACK')"
+                                                :class="measurement.status === 'INVALID_ACK' ? 'bg-danger text-white' : 'text-danger'">
+                                            <i class="fa fa-times"></i>
+                                        </button>
                                     </div>
-                                    <div>
-                                        <button submit class="btn btn-sm btn-primary mr-1"
-                                                v-on:click.prevent="return submitEditForm($event.target)">Submit</button>
-                                        <button cancel class="btn btn-sm btn-default border"
-                                                v-on:click.prevent="return cancelEditForm($event.target)">Cancel</button>
+                                    <div v-else>-</div>
+                                </td>
+                                <td colspan="px-2">
+                                    <div v-if="measurement.client_bdt_measurement_id" class="text-center">
+                                        <span moe large relative>
+                                            <a start show class="py-0 mb-3 font-weight-bold">Add</a>
+                                            <form url="/api/careMonthEntry/createForRm" right>
+                                                <p class="mb-2 d-block text-left"><b>Add RM Entry</b></p>
+                                                <input type="hidden" name="careMonthUid" :value="measurement.careMonth.uid">
+                                                <input type="hidden" name="proUid" value="{{$pro->uid}}">
+                                                <input type="hidden" name="effectiveDate" value="{{date('Y-m-d')}}">
+                                                <div class="bg-light border rounded p-2 mb-2">
+                                                    <div class="mb-1 d-flex align-items-center">
+                                                        <span class="width-50px text-left text-secondary">Type</span>
+                                                        <div><b>@{{ measurement.label }}</b></div>
+                                                    </div>
+                                                    <div class="d-flex align-items-center">
+                                                        <span class="width-50px text-left text-secondary">Value</span>
+                                                        <div v-if="!measurement.client_bdt_measurement_id"><b>@{{ measurement.value }}</b></div>
+                                                        <div v-else>
+                                                            <div v-if="measurement.label === 'BP'">
+                                                                <b>@{{ measurement.bdtMeasurement.systolic_bp_in_mm_hg }}</b>/<b>@{{ measurement.bdtMeasurement.diastolic_bp_in_mm_hg }}</b> mmHg
+                                                            </div>
+                                                            <div v-if="measurement.label === 'SBP'">
+                                                                <b>@{{ measurement.bdtMeasurement.systolic_bp_in_mm_hg }}</b> mmHg
+                                                            </div>
+                                                            <div v-if="measurement.label === 'DBP'">
+                                                                <b>@{{ measurement.bdtMeasurement.diastolic_bp_in_mm_hg }}</b> mmHg
+                                                            </div>
+                                                            <div v-if="measurement.label === 'Wt. (lbs.)'">
+                                                                <b>@{{ parseFloat(measurement.bdtMeasurement.weight_in_pounds).toFixed(1) }}</b> lbs
+                                                            </div>
+                                                        </div>
+                                                    </div>
+                                                </div>
+                                                <div class="mb-2">
+                                                    <div class="row">
+                                                        <div class="col-6 d-flex align-items-center">
+                                                            <label class="text-secondary text-sm my-0 mr-3 text-nowrap">Time (mins)</label>
+                                                            <input type="number" min="0" max="5400"
+                                                                   class="form-control form-control-sm w-100 cm-time-value"
+                                                                   name="timeInMinutes" value="" placeholder="Time (mins.)" required>
+                                                        </div>
+                                                    </div>
+                                                </div>
+                                                <div class="mb-2">
+                                                    <div class="row">
+                                                        <div class="col-12 text-left">
+                                                            <label class="text-secondary text-sm mb-1">Details</label>
+                                                            <textarea class="form-control form-control-sm" rows="4"
+                                                                      name="contentText">@{{ 'Reviewed ' + measurement.label + ' measurement' }}</textarea>
+                                                        </div>
+                                                    </div>
+                                                </div>
+                                                <div class="d-flex align-items-center">
+                                                    <button class="btn btn-sm btn-success mr-2" submit>Submit</button>
+                                                    <button class="btn btn-sm btn-default mr-2 border" cancel>Cancel</button>
+                                                </div>
+                                            </form>
+                                        </span>
                                     </div>
-                                </form>
-                            </span>--}}
-                        </div>
-                    </div>
-                    <div class="ml-auto">
-                        <select v-model="event.newStatus"
-                                class="form-control form-control-sm bg-light"
-                                v-on:change="updateStatus(event)">
-                            <option value="CREATED">CREATED</option>
-                            <option value="CONFIRMED">CONFIRMED</option>
-                            <option value="CANCELLED">CANCELLED</option>
-                            <option value="COMPLETED">COMPLETED</option>
-                            <option value="ABANDONED">ABANDONED</option>
-                        </select>
-                        <div v-if="selectedDate === '{{ date('Y-m-d') }}'"
-                             class="pt-1 text-right" :class="event.started ? 'text-danger': 'text-secondary'">
-                            @{{ event.inHowManyHours }}
-                        </div>
+                                </td>
+                            </tr>
+                            <tr v-if="!measurements || !measurements.length">
+                                <td class="text-secondary p-0 border-0 p-3" colspan="6">
+                                    No items to show
+                                </td>
+                            </tr>
+                            </tbody>
+                        </table>
                     </div>
                 </div>
-                <div v-if="numEventsForDate === 0" class="bg-light p-3 text-secondary border bounded">
-                    <span v-if="filterStatus === ''">You have no appointments on <b>@{{ selectedDate }}</b></span>
-                    <span v-if="filterStatus !== ''">You have no appointments on <b>@{{ selectedDate }}</b> with status <b>@{{ filterStatus }}</b></span>
-                </div>
             </div>
         </div>
     </div>
@@ -205,6 +302,7 @@
                 el: '#pro-dashboard-container',
                 delimiters: ['@{{', '}}'],
                 data: {
+                    tab: 'measurements', // appointments | measurements
                     selectedDate: '{{ date('Y-m-d') }}',
                     selectedStatus: 'CREATED',
                     events: [],
@@ -213,6 +311,8 @@
                     calendarElem: null,
                     currentMonth: null,
                     currentYear: null,
+                    measurementFilterStatus: 'ALL',
+                    measurements: {!! json_encode($pro->getMeasurements()) !!}
                 },
                 methods: {
                     formatDate: function (date) {
@@ -330,6 +430,65 @@
                                 _callback.call(self);
                             }, 'json');
                         }
+                    },
+                    updateMeasurements: function() {
+                        $.get('/pro-dashboard-measurements/' + this.measurementFilterStatus, (_data) => {
+                            this.measurements = _data;
+                            Vue.nextTick(() => {
+                                // this.initCMRTE();
+                                $('#pro-dashboard-container').find('[moe][initialized]').removeAttr('initialized');
+                                initMoes();
+                            });
+                        }, 'json');
+                    },
+                    setMeasurementStatus: function(_uid, _status) {
+                        $.post('/api/measurement/updateStatus', {
+                            uid: _uid,
+                            status: _status
+                        }, (_data) => {
+                            this.updateMeasurements();
+                        }, 'json');
+                    },
+                    initCMRTE: function() {
+                        $('#pro-dashboard-container [cm-rte]').each(function() {
+
+                            $(this).wrap(
+                                $('<div class="border-left border-right rte-holder"/>')
+                                    .attr('data-shortcuts', '')
+                            );
+
+                            // give a unique id to this editor instance
+                            var editorID = Math.ceil(Math.random() * 99999), fieldName = $(this).attr('data-name');
+
+                            var el = this;
+                            var existingContent = $(el).attr('data-content');
+                            var quill = new Quill(el, {
+                                theme: 'snow',
+                                modules: stagQuillConfig
+                            });
+
+                            var toolbar = $(quill.container).prev('.ql-toolbar');
+
+                            // add button for new shortcut
+                            var newSCButton = $('<button class="btn bg-white btn-sm btn-default text-primary w-auto px-2 border py-0 ' +
+                                'text-sm add-shortcut" data-editor-id="' + editorID + '">+ Shortcut</button>');
+                            toolbar.append(newSCButton);
+
+                            quill.root.innerHTML = existingContent;
+
+                            $('<input type="hidden" name="' + fieldName + '">').val(existingContent).insertAfter(el);
+
+                            quill.on('text-change', function(delta, oldDelta, source) {
+                                $(el).next('[name="' + fieldName + '"]').val(quill.root.innerHTML);
+                            });
+
+                            $(quill.container)
+                                .find('.ql-editor[contenteditable]')
+                                .attr('data-field', fieldName)
+                                .attr('data-editor-id', editorID)
+                                .attr('with-shortcuts', 1);
+
+                        })
                     }
                 },
                 mounted: function () {
@@ -346,6 +505,10 @@
 
                     // this.loadEvents();
                     $('.datepicker-days .day.active').trigger('click');
+
+                    // this.initCMRTE();
+                    $('#pro-dashboard-container').find('[moe][initialized]').removeAttr('initialized');
+                    initMoes();
                 }
             });
         }

+ 3 - 0
routes/web.php

@@ -146,6 +146,9 @@ Route::middleware('pro.auth')->group(function () {
     // pro dashboard events (ajax)
     Route::get('pro-dashboard-events/{from}/{to}', 'HomeController@dashboardAppointments')->name('pro-dashboard-events');
 
+    // pro dashboard measurements
+    Route::get('pro-dashboard-measurements/{filter}', 'HomeController@dashboardMeasurements')->name('pro-dashboard-measurements');
+
     // events for fc
     Route::get('/appointment/getAllAppointmentsForPros', 'AppointmentController@events')->name('events');