Skip to content

Commit

Permalink
Merge 96a52eb into d74cc8f
Browse files Browse the repository at this point in the history
  • Loading branch information
fredkingham committed Dec 13, 2018
2 parents d74cc8f + 96a52eb commit 4d50439
Show file tree
Hide file tree
Showing 4 changed files with 227 additions and 79 deletions.
21 changes: 20 additions & 1 deletion elcid/assets/js/elcid/controllers/clinical_advice_form.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
angular.module('opal.controllers').controller(
'ClinicalAdviceForm',
function(
$rootScope, $scope, $window, recordLoader, ngProgressLite, $cookies,
$scope, recordLoader, ngProgressLite, $cookies,
Referencedata, $q
){
"use strict";
Expand All @@ -16,6 +16,24 @@ angular.module('opal.controllers').controller(
})).length;
};

this.getClinicalAdvice = function(){
var result = [];
_.each($scope.patient.episodes, function(episode){
_.each(episode.microbiology_input, function(input){
result.push(input)
});
});
this.clinicalAdvice = _.sortBy(result, "when").reverse();
};

this.getClinicalAdvice();

this.editItem = function(episode, item){
episode.recordEditor.openEditItemModal(item, 'microbiology_input').then(function(){
self.getClinicalAdvice();
});
};

$q.all([Referencedata.load(), recordLoader.load()]).then(function(datasets){
angular.extend($scope, datasets[0].toLookuplists());
var item = $scope.episode.newItem("microbiology_input");
Expand All @@ -33,6 +51,7 @@ angular.module('opal.controllers').controller(
item = $scope.episode.newItem('microbiology_input');
self.editing.microbiology_input = item.makeCopy();
self.changed = false;
self.getClinicalAdvice();
});
};
});
Expand Down
112 changes: 107 additions & 5 deletions elcid/assets/js/elcidtest/clinical_advice.controller.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ describe('ClinicalAdviceFormTest', function() {
Episode = $injector.get('Episode');
});

$scope.episode = new Episode(episodedata);
$scope.patient = opalTestHelper.newPatient($rootScope);
$scope.episode = $scope.patient.episodes[0];

mkcontroller = function(){
ctrl = $controller('ClinicalAdviceForm', {
Expand All @@ -57,12 +58,57 @@ describe('ClinicalAdviceFormTest', function() {
expect(!!ctrl.editing.microbiology_input).toBe(true)
});

it('should set chagned to false', function(){
it('should set changed to false', function(){
mkcontroller();
$rootScope.$apply();
$httpBackend.flush();
expect(ctrl.changed).toBe(false);
})
});

it('should set clinical advice to empty if there are no clinical advice', function(){
$scope.episode.microbiology_input = [];
mkcontroller();
$rootScope.$apply();
$httpBackend.flush();
expect(ctrl.clinicalAdvice).toEqual([]);
});

it("should combine clinical advice from multiple episodes in date order", function(){
var episodeData = opalTestHelper.getEpisodeData()
episodeData["id"] = 124;
$scope.patient.episodes.push(opalTestHelper.newEpisode(episodeData));
var advice1 = {
reason_for_interaction: "first date",
initials: "TTT",
when: moment(new Date(2018, 12, 1))
}

var advice2 = {
reason_for_interaction: "middle date",
initials: "TTT",
when: moment(new Date(2018, 13, 1))
}

var advice3 = {
reason_for_interaction: "last date",
initials: "TTT",
when: moment(new Date(2018, 14, 1))
}
$scope.patient.episodes[0].microbiology_input = [
advice1, advice3
];

$scope.patient.episodes[1].microbiology_input = [
advice2
];
mkcontroller();
$httpBackend.flush();
expect(ctrl.clinicalAdvice).toEqual(
[advice3, advice2, advice1]
)
});


});

describe('it should save', function(){
Expand All @@ -78,7 +124,7 @@ describe('ClinicalAdviceFormTest', function() {
"/api/v0.1/microbiology_input/",
{
reason_for_interaction: "something",
episode_id: 1
episode_id: 123
}
).respond({});
ctrl.save();
Expand All @@ -92,7 +138,7 @@ describe('ClinicalAdviceFormTest', function() {
"/api/v0.1/microbiology_input/",
{
reason_for_interaction: "something",
episode_id: 1
episode_id: 123
}
).respond({});
ctrl.changed = true;
Expand All @@ -102,6 +148,22 @@ describe('ClinicalAdviceFormTest', function() {
expect(ctrl.changed).toBe(false);
});

it('should call through to update the clinical advice', function(){
spyOn(ctrl, "getClinicalAdvice");
$httpBackend.expectPOST(
"/api/v0.1/microbiology_input/",
{
reason_for_interaction: "something",
episode_id: 123
}
).respond({});
ctrl.changed = true;
ctrl.save();
$rootScope.$apply();
$httpBackend.flush();
expect(ctrl.getClinicalAdvice).toHaveBeenCalledWith();
})

it('should always save for the episode that is currently on scope', function(){
var episode2 = new Episode(opalTestHelper.getEpisodeData());
$scope.episode = episode2;
Expand Down Expand Up @@ -144,4 +206,44 @@ describe('ClinicalAdviceFormTest', function() {
});
});

describe("editItem", function(){
beforeEach(function(){
mkcontroller();
$rootScope.$apply();
$httpBackend.flush();
});

it("should update the clinical advice after edit item is called", function(){
var fakeEpisode = {
recordEditor: {
openEditItemModal: function(){
return {then: function(x){x()}}
}
}
}
spyOn(ctrl, "getClinicalAdvice");
ctrl.editItem(fakeEpisode, null);
expect(ctrl.getClinicalAdvice).toHaveBeenCalledWith();
});

it("should push the correct variables though to the record editor", function(){
var fakeEpisode = {
recordEditor: {
openEditItemModal: function(){
return {then: function(x){x()}}
}
}
}
spyOn(ctrl, "getClinicalAdvice");
spyOn(fakeEpisode.recordEditor, "openEditItemModal").and.callThrough();
var microInput = {
reason_for_interaction: "middle date",
initials: "TTT",
when: moment(new Date(2018, 13, 1))
}
ctrl.editItem(fakeEpisode, microInput);
expect(fakeEpisode.recordEditor.openEditItemModal).toHaveBeenCalledWith(microInput, "microbiology_input");
});
})

});
74 changes: 1 addition & 73 deletions elcid/templates/detail/infection_service.html
Original file line number Diff line number Diff line change
Expand Up @@ -34,77 +34,5 @@
{% record_panel models.FinalDiagnosis %}
</div>
<div class="col-md-6">
<div ng-show="episode.microbiology_input.length" class="panel panel-default hidden-print">
<div class="panel-body">
<div class="patient-timeline-container">
<div class="row">
<div class="col-md-3 patient-timeline">
<div class="patient-timeline-now">
<div class="patient-timeline-now-text bg-secondary">
Now
</div>
</div>
</div>
</div>
<svg class="speech-bubble-timeline-container">
<line class="speech-bubble-timeline hidden-sm hidden-xs" x1="13%" y1="0" x2="13%" y2="500%" />
<line class="speech-bubble-timeline hidden-md hidden-lg" x1="50%" y1="0" x2="50%" y2="500%" />
</svg>
<div ng-repeat="item in episode.microbiology_input | orderBy:orderByDate" class="row content-offset-20">

<div class="col-md-3 patient-timeline">
<div class="patient-timeline-speech-bubble">
<i class="fa fa-comments patient-timeline-speech-bubble-icon"></i>
</div>
<div ng-show="item.when">
<div class="patient-timeline-date">
[[ item.when | momentDateFormat:'DD MMM YYYY' ]]
</div>
</div>
</div>
<div class="col-md-9">
<div class="patient-timeline-discussion">
<div class="row">
<div class="col-sm-10 timeline-data-[[ $index ]]">
<span ng-show="item.initials && item.initials.trim().length">
<p>
<b>By: </b> [[item.initials]]
<span ng-show="item.discussed_with">(discussed with [[ item.discussed_with ]])</span>
</p>
</span>
<span ng-show="item.reason_for_interaction">
<p>
<b>Reason For Interaction: </b><br/>[[item.reason_for_interaction]]
</p>
</span>
<span ng-show="item.clinical_discussion">
<b>Clinical Discussion: </b><div markdown="clinical_discussion"></div>
</span>
<span ng-show="item.infection_control">
<b>Infection control: </b><div markdown="infection_control"></div>
</span>
<span ng-show="item.agreed_plan">
<b>Agreed Plan: </b><div markdown="agreed_plan"></div>
</span>
</div>
<div class="col-sm-2">
<div class="row">
<div class="col-md-12">
<i class="fa fa-pencil edit pull-right pointer" ng-click="episode.recordEditor.openEditItemModal(item, 'microbiology_input')"></i>
</div>
</div>
<div class="row content-offset-10">
<div class="col-md-12">
<i class="fa fa-clipboard edit pull-right pointer" clipboard data-clipboard-target=".timeline-data-[[ $index ]]"></i>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% include "inline_forms/clinical_advice.html" %}
{% include "inline_forms/clinical_timeline.html" %}
</div>
99 changes: 99 additions & 0 deletions elcid/templates/inline_forms/clinical_timeline.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
{% load forms %}
<div ng-controller="ClinicalAdviceForm as clinicalAdviceForm">
<div ng-show="clinicalAdviceForm.clinicalAdvice.length" class="panel panel-default hidden-print">
<div class="panel-body">
<div class="patient-timeline-container">
<div class="row">
<div class="col-md-3 patient-timeline">
<div class="patient-timeline-now">
<div class="patient-timeline-now-text bg-secondary">
Now
</div>
</div>
</div>
</div>
<svg class="speech-bubble-timeline-container">
<line class="speech-bubble-timeline hidden-sm hidden-xs" x1="13%" y1="0" x2="13%" y2="500%" />
<line class="speech-bubble-timeline hidden-md hidden-lg" x1="50%" y1="0" x2="50%" y2="500%" />
</svg>
<div ng-repeat="item in clinicalAdviceForm.clinicalAdvice" class="row content-offset-20">

<div class="col-md-3 patient-timeline">
<div class="patient-timeline-speech-bubble">
<i class="fa fa-comments patient-timeline-speech-bubble-icon"></i>
</div>
<div ng-show="item.when">
<div class="patient-timeline-date">
[[ item.when | momentDateFormat:'DD MMM YYYY' ]]
</div>
</div>
</div>
<div class="col-md-9">
<div class="patient-timeline-discussion">
<div class="row">
<div class="col-sm-10 timeline-data-[[ $index ]]">
<span ng-show="item.initials && item.initials.trim().length">
<p>
<b>By: </b> [[item.initials]]
<span ng-show="item.discussed_with">(discussed with [[ item.discussed_with ]])</span>
</p>
</span>
<span ng-show="item.reason_for_interaction">
<p>
<b>Reason For Interaction: </b><br/>[[item.reason_for_interaction]]
</p>
</span>
<span ng-show="item.clinical_discussion">
<b>Clinical Discussion: </b><div markdown="clinical_discussion"></div>
</span>
<span ng-show="item.infection_control">
<b>Infection control: </b><div markdown="infection_control"></div>
</span>
<span ng-show="item.agreed_plan">
<b>Agreed Plan: </b><div markdown="agreed_plan"></div>
</span>
</div>
<div class="col-sm-2">
<div class="row">
<div class="col-md-12">
<i class="fa fa-pencil edit pull-right pointer" ng-click="clinicalAdviceForm.editItem(episode, item)"></i>
</div>
</div>
<div class="row content-offset-10">
<div class="col-md-12">
<i class="fa fa-clipboard edit pull-right pointer" clipboard data-clipboard-target=".timeline-data-[[ $index ]]"></i>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="panel panel-default hidden-print">
<div class="panel-heading"><h3>
<i class="fa fa-comments"></i> Clinical Advice
</div></h3>
<div class="panel-body">
<div class="row">
<div class="col-md-12">
<form class="form-horizontal">
<div ng-repeat="editing in [clinicalAdviceForm.editing]">
{% include models.MicrobiologyInput.get_form_template %}
</div>
</form>
</div>
</div>
<div class="row">
<div class="col-md-12 text-right">
<button ng-disabled="!clinicalAdviceForm.changed" class="btn btn-primary" ng-click="clinicalAdviceForm.save('save')">
<i class="fa fa-save"></i>
Save
</button>
</div>
</div>
</div>
</div>
</div>

0 comments on commit 4d50439

Please sign in to comment.