Ver Fonte

Updated survey forms

Samson Mutunga há 1 ano atrás
pai
commit
8761b0cc03

+ 13 - 38
app/Http/Controllers/GuestController.php

@@ -16,6 +16,7 @@ use Illuminate\Http\Request;
 use Illuminate\Support\Facades\File;
 use Illuminate\Support\Facades\Http;
 use Illuminate\Support\Facades\Response;
+use App\Http\Services\SurveyService;
 
 class GuestController extends Controller
 {
@@ -118,20 +119,17 @@ class GuestController extends Controller
 
         if(!$entity) abort(404);
         $layout = 'app.patient.surveys.partials.form-layout';
-        return view('app.patient.surveys.forms.'.$survey->internal_name, compact('entity', 'survey', 'layout'));
+        return view('app.patient.surveys.forms.form', compact('entity', 'survey', 'layout'));
     }
 
     public function viewSurveyFormSubmit(Request $request, $accessKey){
         $survey = Survey::where('access_key', $accessKey)->where('is_accessible_to_target', true)->where('is_active', true)->first();
         if(!$survey) abort(404);
 
-        $data = $request->all();
-        unset($data['_token']);
-
         $formData = [
             'uid' => $survey->uid,
-            'surveyDataJson' => json_encode($data),
-            'surveyHTML' => (string) $this->viewSurveyFormPreview($request, $survey->uid),
+            'surveyDataJson' => $request->get('data'),
+            'surveyHTML' => $survey->surveyhtml,
         ];
         $url = '/survey/submitData';
         $response = $this->calljava($request, $url, $formData);
@@ -144,44 +142,21 @@ class GuestController extends Controller
         
     }
 
-    public function viewSurveyFormPreview(Request $request, $uid){
-        $survey = Survey::where('uid', $uid)->first();
-        if(!$survey) return null;
-
-        $surveyFormPath = resource_path(Survey::FORM_PATH . '/' . $survey->internal_name . '.blade.php');
-        if(!file_exists($surveyFormPath)) return null;
-
-        $entity = null;
-        if($survey->entity_type === 'Client'){
-            $entity = Client::where('uid', $survey->entity_uid)->first();
-        }
-
-        if(!$entity) return null;
-        $preview = true;
-        $layout = 'app.patient.surveys.partials.preview-layout';
-        $html = (string) view('app.patient.surveys.forms.'.$survey->internal_name, compact('entity', 'survey', 'preview', 'layout'));
-        return $html;
-        
-    }
-
     public function surveyTemplatePreview(Request $request, $internalName){
-        
-        $surveyFormPath = resource_path(Survey::FORM_PATH . '/' . $internalName . '.blade.php');
-        if(!file_exists($surveyFormPath)) return null;
+        $surveyService = new SurveyService($internalName);
+        $defaultHtml = $surveyService->defaultHTML;
+        if(!$defaultHtml) return 'No default HTML template found for ' . $internalName;
 
         $entityType = $request->get('entityType');
         $entityUid = $request->get('entityUid');
-        $entity = null;
-        if($entityType === 'Client'){
-            $entity = Client::where('uid', $entityUid)->first();
-        }
 
-        if(!$entity) return null;
+        $initializedData = $surveyService->getInitializedData($entityType, $entityUid);
+
+        $survey = new Survey;
+        $survey->surveyhtml = $defaultHtml;
+        $survey->survey_data = json_encode($initializedData);    
 
-        $preview = true;
-        $layout = 'app.patient.surveys.partials.preview-layout';
-        $html = (string) view('app.patient.surveys.forms.'.$internalName, compact('entity', 'preview', 'layout'));
-        return $html;
+        return $survey;
         
     }
 }

+ 51 - 1
app/Http/Controllers/PatientController.php

@@ -42,10 +42,11 @@ use App\Models\Point;
 use App\Models\Survey;
 use Illuminate\Support\Facades\Http;
 use PDF;
+use Illuminate\Support\Facades\Validator;
+use App\Http\Services\SurveyService;
 
 class PatientController extends Controller
 {
-
     public function invoicingCompanies(Request $request, Client $patient) {
         return view('app.patient.invoicing.companies', compact('patient'));
     }
@@ -833,6 +834,53 @@ class PatientController extends Controller
         return view('app.patient.surveys.list', compact('forms', 'records', 'entityTypes', 'filters', 'patient', 'layout', 'isPopup'));
     }
 
+    public function surveysCreate(Request $request, Client $patient){
+        $validator = Validator::make($request->all(), [
+            'entityType' => 'required|string',
+            'entityUid' => 'required|string',
+            'internalName' => 'required|string'
+        ]);
+        
+        if ($validator->fails()) {
+            return $this->fail('Invalid data provided!');
+        }
+
+        $internalName = $request->get('internalName');
+        $entityType = $request->get('entityType');
+        $entityUid = $request->get('entityUid');
+
+        $surveyService = new SurveyService($internalName);
+        $defaultHtml = $surveyService->defaultHTML;
+        if(!$defaultHtml) return $this->fail('No default HTML template found for ' . $internalName);
+
+        $initializedData = $surveyService->getInitializedData($entityType, $entityUid);
+
+        $data = [
+            'internalName' => $internalName,
+            'title' => $request->get('title'),
+            'entityType' => $entityType,
+            'entityUid' => $entityUid,
+            'surveyHTML' => $defaultHtml,
+            'surveyData' => json_encode($initializedData)
+        ];
+
+        $response = $this->callJavaApi('/survey/create', $data);
+
+        if(!$response['success']){
+            return $this->fail(@$response['message']);
+        }
+
+        //To be replace by java
+        $surveyUid = $response['data'];
+        $survey = Survey::where('uid', $surveyUid)->first();
+        $survey->surveyhtml = $data['surveyHTML'];
+        $survey->survey_data = $data['surveyData'];
+
+        $survey->save();
+        return $this->pass();
+
+    }
+
     public function getEntityRecords(Request $request, Client $patient)
     {
         $term = $request->get('term');
@@ -866,4 +914,6 @@ class PatientController extends Controller
 
         return $this->pass($records);
     }
+
+    
 }

+ 43 - 0
app/Http/Services/SurveyService.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace App\Http\Services;
+
+use Illuminate\Support\Facades\Http;
+use Illuminate\Support\Facades\View;
+
+use App\Models\Survey;
+use App\Models\Client;
+
+class SurveyService
+{
+
+    public $internalName;
+    public $defaultHTML;
+
+    public function __construct($internalName)
+    {
+        $this->internalName = $internalName;
+        $surveyFormPath = resource_path(Survey::FORM_PATH . '/' . $this->internalName . '.blade.php');
+        if(file_exists($surveyFormPath)){
+            $this->defaultHTML = (string) view('app.patient.surveys.forms.templates.'.$this->internalName);
+        }
+    }
+
+    public function getInitializedData($entityType, $entityUid){
+        if($this->internalName === 'sleep'){
+            if($entityType === 'Client'){
+                $client = Client::where('uid', $entityUid)->first();
+                if($client){
+                    return [
+                        'nameFirst' => $client->name_first,
+                        'nameMiddle' => $client->name_middle,
+                        'nameLast' => $client->name_last,
+                        'description' => null
+                    ];
+                }
+            }
+        }
+
+        return null;
+    }
+}

+ 3 - 0
app/Models/Model.php

@@ -13,8 +13,11 @@ use Illuminate\Database\Eloquent\Model as Eloquent;
 
 class Model extends Eloquent
 {
+    public $timestamps = false;
     public function getRouteKeyName()
     {
         return 'uid';
     }
+
+
 }

+ 1 - 1
app/Models/Survey.php

@@ -6,7 +6,7 @@ class Survey extends Model
 {
     protected $table = 'survey';
 
-    const FORM_PATH = "views/app/patient/surveys/forms";
+    const FORM_PATH = "views/app/patient/surveys/forms/templates";
     const ALLOWED_ENTITIES = [
         'Client',
     ];

+ 41 - 0
resources/views/app/patient/surveys/forms/form.blade.php

@@ -0,0 +1,41 @@
+@extends ($layout)
+@section('survey-header')
+<span>Hi {{ @$entity->displayName() }}</span>
+@endsection
+@section('survey-content')
+  <form id="surveyForm" action="{{ @$survey->access_key ? route('view-survey-form-submit', @$survey->access_key) : '' }}" method="POST" v-cloak>
+    @if(!isset($preview))
+      <input type="hidden" name="data" :value="JSON.stringify(form)" />
+      @csrf
+    @endif
+    
+    <div><?= $survey->surveyhtml ?></div>
+    
+    @if(!isset($preview))
+      <div class="row">      
+          <div class="col-md-12">
+            <button class="btn btn-sm btn-primary px-5 py-2">Submit</button>
+          </div>
+      </div>
+    @endif
+  </form>
+
+<script>
+  var surveyFormComponent = new Vue({
+    el: '#surveyForm',
+    data: {
+      form: <?= json_encode(json_decode($survey->survey_data ?? '{}')) ?>
+    },
+    methods: {
+      init: function(){
+        console.log('Default Data: ', this.form);
+      }
+    },
+    mounted: function(){
+      this.init();
+    }
+  });
+</script>
+
+
+@endsection

+ 0 - 44
resources/views/app/patient/surveys/forms/sleep.blade.php

@@ -1,44 +0,0 @@
-@extends ($layout)
-@section('survey-header')
-<span>Hi {{ @$entity->displayName() }}</span>
-@endsection
-@section('survey-content')
-<fieldset @if(isset($preview)) disabled @endif>
-  <form action="{{ @$survey->access_key ? route('view-survey-form-submit', @$survey->access_key) : '' }}" method="POST">
-    @if(!isset($preview))
-      @csrf
-    @endif
-    <div class="row">
-      <div class="col-md-4">
-        <div class="form-group">
-          <label>First Name</label>
-          <input type="text" class="form-control" name="nameFirst" value="{{ @$survey ? $survey->getFieldValue('nameFirst') : '' }}" />
-        </div>
-      </div>
-      <div class="col-md-4">
-        <div class="form-group">
-          <label>Middle Name</label>
-          <input type="text" class="form-control" name="nameMiddle" value="{{ @$survey ? $survey->getFieldValue('nameMiddle') : '' }}" />
-        </div>
-      </div>
-      <div class="col-md-4">
-        <div class="form-group">
-          <label>Last Name</label>
-          <input type="text" class="form-control" name="nameLast" value="{{ @$survey ? $survey->getFieldValue('nameLast') : '' }}" />
-        </div>
-      </div>
-      <div class="col-md-12">
-        <div class="form-group">
-          <label>Explain your sleep issue</label>
-          <textarea class="form-control" name="description">{{ @$survey ? $survey->getFieldValue('description') : '' }}</textarea>
-        </div>
-      </div>
-      @if(!isset($preview))
-        <div class="col-md-12">
-          <button class="btn btn-sm btn-primary px-5 py-2">Submit</button>
-        </div>
-      @endif
-    </div>
-  </form>
-</fieldset>
-@endsection

+ 26 - 0
resources/views/app/patient/surveys/forms/templates/sleep.blade.php

@@ -0,0 +1,26 @@
+<div class="row">
+    <div class="col-md-4">
+        <div class="form-group">
+            <label>First Name</label>
+            <input type="text" class="form-control" v-model="form.nameFirst" />
+        </div>
+    </div>
+    <div class="col-md-4">
+        <div class="form-group">
+            <label>Middle Name</label>
+            <input type="text" class="form-control" v-model="form.nameMiddle" />
+        </div>
+    </div>
+    <div class="col-md-4">
+        <div class="form-group">
+            <label>Last Name</label>
+            <input type="text" class="form-control" v-model="form.nameLast"  />
+        </div>
+    </div>
+    <div class="col-md-12">
+        <div class="form-group">
+            <label>Explain your sleep issue</label>
+            <textarea class="form-control" v-model="form.description"></textarea>
+        </div>
+    </div>
+</div>

+ 1 - 1
resources/views/app/patient/surveys/list.blade.php

@@ -76,7 +76,7 @@
         (function($){
             $('[show-survey-results]').click(function(){
                 var uid = $(this).attr('show-survey-results');
-                $.get("/survey/"+uid+"/preview", {}, function(response){
+                $.get("/survey/"+uid+"/preview", {disabled: 1}, function(response){
                     $('#'+uid).html(response);
                 });
             });

+ 55 - 41
resources/views/app/patient/surveys/partials/create.blade.php

@@ -1,25 +1,25 @@
 <div moe wide relative center>
     <a href="" start show>+ Create Survey</a>
-    <form url="/api/survey/create" class="mcp-theme-1" right>
+    <form url="{{ route("patients.view.surveys-create", $patient) }}" id="createSurveyForm" class="mcp-theme-1" right>
         <input type="hidden" name="entityType" value="Client">
         <input type="hidden" name="entityUid" value="{{ $patient->uid }}">
-        <div id="createSurveyForm" v-cloak>
+        <div>
             <div class="form-group">
                 <label class="font-weight-bold">Title</label>
                 <input type="text" name="title" class="form-control" />
             </div>
             <div class="form-group">
                 <label class="font-weight-bold">Survey Template</label>
-                <select name="internalName" class="form-control" v-model="form.internalName" @change="onTemplateChange">
+                <select name="internalName" class="form-control">
                     <option value=""></option>
                     @foreach ($forms as $form)
                         <option value="{{ $form }}">{{ formatAsTitle($form) }}</option>
                     @endforeach
                 </select>
             </div>
-             <div v-if="previewHtml" class="form-group">
+             <div id="previewSurveyDefaultHtml" class="form-group d-none">
                 <label class="font-weight-bold">Template Preview</label>
-                <div class="border p-2 d-flex justify-content-center" v-html="previewHtml"></div>
+                <div class="border p-2 d-flex justify-content-center"></div>
             </div>
 
         </div>
@@ -30,41 +30,55 @@
     </form>
 </div>
 <script>
-    new Vue({
-                el: '#createSurveyForm',
-                delimiters: ['@{{ ', ' }}'],
-                data: {
-                    form: {
-                        internalName: null
-                    },
-                    entityRecords: [],
-                    previewHtml: null
-                },
-                methods: {
-                    onTemplateChange: function() {
-                        var self = this;
-                        if (!self.form.internalName.length) return;
-                        self.$nextTick(function() {
-                            self.loadSelectedTemplate();
-                        });
-                    },
-                    loadSelectedTemplate: function() {
-                        var self = this;
-                        var data = {
-                            entityType: "Client",
-                            entityUid: "{{ $patient->uid }}",
-                        };
-                       $.get("/survey/template/preview/"+self.form.internalName, data, function(response){
-                            self.previewHtml = response;
-                        });
-                    },
-                    init: function() {
+    (function($){
+        var createNewSurvey = {
+            form: null,
+            internalName: null,
+            previewHtml: null,
 
-                    },
-                },
-                mounted: function() {
-                    this.init();
-                },
-            });
-</script>
+            initOnInternalNameChange: function(){
+                var self = this;
+                self.form.find('select[name=internalName]').change(function(evt){
+                    var value = evt.target.value;
+                    self.internalName = value;
+                    self.loadSelectedTemplate();
+                });
+            },
+            loadSelectedTemplate: function() {
+                var self = this;
+                var data = {
+                    entityType: "Client",
+                    entityUid: "{{ $patient->uid }}",
+                };
+                $.get("/survey/template/preview/"+self.internalName, data, function(response){
+                    try{
+                        var defaultData = JSON.parse(response.survey_data);
+                        var defaultHTML = response.surveyhtml;
+
+                        self.initializeVueForm(defaultHTML, defaultData);
 
+                    }catch(e){
+                        toastr.error('Unable to preview template. ' + e.message);
+                    }                             
+                });
+            },
+            initializeVueForm: function(defaultHTML, defaultData){
+                var self = this;
+                var container = $('#previewSurveyDefaultHtml');
+                container.find('div').html(defaultHTML);
+                container.removeClass("d-none");
+                new Vue({
+                    el: "#previewSurveyDefaultHtml",
+                    data: {
+                        form: defaultData
+                    }
+                });
+            },
+            init: function(){
+                this.form = $('#createSurveyForm');
+                this.initOnInternalNameChange();
+            }
+        };
+        createNewSurvey.init();
+    })(jQuery);
+</script>

+ 14 - 1
resources/views/app/patient/surveys/partials/survey-results.blade.php

@@ -14,9 +14,22 @@
       </div>
 
       <div class="border p-4">
-        <div id="{{ $record->uid }}">Loading...</div>
+        <div id="survey-{{ $record->uid }}">
+          <fieldset disabled>
+            <?= $record->surveyhtml ?>
+          </fieldset>
+        </div>
       </div>
 
+      <script>
+        new Vue({
+          el: "#survey-{{ $record->uid }}",
+          data: {
+            form: <?= json_encode(json_decode($record->survey_data ?? '{}')) ?>
+          }
+        });
+      </script>
+
     </div>
   </form>
 </div>

+ 1 - 1
routes/web.php

@@ -30,7 +30,6 @@ use App\Http\Controllers\RdController;
  */
 Route::get('survey/{accessKey}', 'GuestController@viewSurveyForm')->name('view-survey-form');
 Route::post('survey/{accessKey}/submit', 'GuestController@viewSurveyFormSubmit')->name('view-survey-form-submit');
-Route::get('survey/{uid}/preview', 'GuestController@viewSurveyFormPreview')->name('view-survey-form-preview');
 Route::get('survey/template/preview/{internalName}', 'GuestController@surveyTemplatePreview')->name('survey-template-preview');
 Route::get('login', 'LoginController@showLoginForm')->name('login');
 Route::post('login', 'LoginController@login');
@@ -578,6 +577,7 @@ Route::middleware('pro.auth')->group(function () {
             Route::get('canvas', 'PatientController@canvas')->name('canvas');
             Route::get('intake', 'PatientController@intake')->name('intake');
             Route::get('surveys', 'PatientController@surveys')->name('surveys');
+            Route::post('surveys/create', 'PatientController@surveysCreate')->name('surveys-create');
             Route::get('surveys/get-entity-records', 'PatientController@getEntityRecords')->name('get-entity-records');
             Route::get('care-plan', 'PatientController@carePlan')->name('care-plan');
             Route::get('medications', 'PatientController@medications')->name('medications');