From 718bdf6f09921657b1c1f82d9944d757cd0c3b4c Mon Sep 17 00:00:00 2001
From: Himabindu T
Date: Mon, 30 Aug 2021 11:12:04 +0530
Subject: [PATCH] Tarun, Gopi | BAH-1170 | Add support to create surgical
blocks across days (#51) (#354) (#370)
* Tarun | MOBN-1628 | Add confirmation popup for creating surgical block across multiple days
* Tarun | MOBN-1628 | Fix day view to show surgical blocks created across days
* Gopi ,Tarun | MOBN-1628 | Removed Syntax Error Which Is Causing Error PopUp on OT Page Load
* Tarun, Gopi | MOBN-1628 | Fix week view to show surgical blocks created across days
* Tarun, Gopi | MOBN-1628 | Fix list view to show surgical appointments created across days
* Gopi,Tarun | MOBN-1628 | Fixed Existing UI Tests
* Tarun, Gopi | MOBN-1628 | Show both startdate and enddate in surgical block dialog if both dates are different
* Gopi,Tarun | MOBN-1628 | Fixed Remaining UI Tests
* Tarun, Gopi | MOBN-1628 | Add date input field in actual time dialog
* Tarun, Gopi | MOBN-1628 | Add date in est & actual time fields in appointment details dialog
* Tarun, Gopi | MOBN-1628 | Show surgical block end date if block end on a different date
* Tarun, Gopi | MOBN-1628 | Correct typo issue
* Tarun, Gopi | MOBN-1628 | Handle code review changes
* Tarun, Gopi | MOBN-1628 | Handle code review changes
Co-authored-by: gopikrishna-yaramothu <65332533+gopikrishna-yaramothu@users.noreply.github.com>
Co-authored-by: gopikrishna-yaramothu
Co-authored-by: gopikrishna-yaramothu <65332533+gopikrishna-yaramothu@users.noreply.github.com>
Co-authored-by: gopikrishna-yaramothu
Co-authored-by: tarunkumar-tw <58736833+tarunkumar-tw@users.noreply.github.com>
Co-authored-by: gopikrishna-yaramothu <65332533+gopikrishna-yaramothu@users.noreply.github.com>
Co-authored-by: gopikrishna-yaramothu
---
ui/app/i18n/ot/locale_en.json | 4 +-
.../ot/controller/calendarViewController.js | 2 +
ui/app/ot/controller/listViewController.js | 11 ++++-
ui/app/ot/controller/otCalendarController.js | 9 +++-
.../ot/controller/surgicalBlockController.js | 43 ++++++++++++++-----
.../otCalendarSurgicalAppointment.js | 2 +-
.../ot/directives/otCalendarSurgicalBlock.js | 35 ++++++++++++---
.../ot/services/surgicalAppointmentService.js | 3 +-
ui/app/ot/views/addActualTimeDialog.html | 12 ++++--
ui/app/ot/views/calendarSurgicalBlock.html | 2 +-
ui/app/ot/views/otCalendar.html | 1 +
ui/app/ot/views/otWeeklyCalendar.html | 1 +
.../ot/views/surgicalAppointmentDialog.html | 9 ++--
ui/app/ot/views/surgicalBlockDialog.html | 10 +++--
.../surgicalBlockMultipleDaysDialog.html | 13 ++++++
ui/app/styles/ot/_ot.scss | 5 ++-
.../ot/controller/listViewController.spec.js | 7 ++-
.../controller/otCalendarController.spec.js | 19 ++++----
.../surgicalBlockController.spec.js | 2 +
.../otCalendarSurgicalAppointment.spec.js | 3 +-
.../otCalendarSurgicalBlock.spec.js | 6 ++-
.../surgicalAppointmentService.spec.js | 4 +-
22 files changed, 154 insertions(+), 49 deletions(-)
create mode 100644 ui/app/ot/views/surgicalBlockMultipleDaysDialog.html
diff --git a/ui/app/i18n/ot/locale_en.json b/ui/app/i18n/ot/locale_en.json
index e28eb4726d..97029a8246 100644
--- a/ui/app/i18n/ot/locale_en.json
+++ b/ui/app/i18n/ot/locale_en.json
@@ -95,5 +95,7 @@
"OT_SURGICAL_BLOCK_DIALOG_DURATION": "Duration",
"OT_FILTER_KEY": "Filter",
"OT_SURGICAL_APPOINTMENT_DIALOG_DETAILS": "Surgical Appointment Details",
- "OT_SURGICAL_APPOINTMENT_ACTUAL_TIME": "Actual Time"
+ "OT_SURGICAL_APPOINTMENT_ACTUAL_TIME": "Actual Time",
+ "OT_SAVE_ANYWAY_KEY": "Save Anyway",
+ "OT_SURGICAL_BLOCK_MULTIPLE_DAYS_DIALOG_TITLE": "Warning - Creating Surgical Block"
}
diff --git a/ui/app/ot/controller/calendarViewController.js b/ui/app/ot/controller/calendarViewController.js
index d3378e418d..1862efc9ff 100644
--- a/ui/app/ot/controller/calendarViewController.js
+++ b/ui/app/ot/controller/calendarViewController.js
@@ -214,6 +214,7 @@ angular.module('bahmni.ot')
$scope.cancelDisabled = true;
$scope.surgicalBlockSelected = surgicalBlock;
$scope.surgicalAppointmentSelected = {};
+ $scope.showEndDate = (Bahmni.Common.Util.DateUtil.diffInDaysRegardlessOfTime(surgicalBlock.startDatetime, surgicalBlock.endDatetime) != 0);
var surgicalBlockWithCompletedAppointments = function () {
return _.find(surgicalBlock.surgicalAppointments, function (appointment) {
@@ -241,6 +242,7 @@ angular.module('bahmni.ot')
$scope.addActualTimeDisabled = true;
$scope.surgicalBlockSelected = {};
$scope.surgicalAppointmentSelected = {};
+ $scope.showEndDate = false;
};
$scope.$on("event:surgicalBlockDeselect", function (event) {
diff --git a/ui/app/ot/controller/listViewController.js b/ui/app/ot/controller/listViewController.js
index bec32eb520..b2b66e8581 100644
--- a/ui/app/ot/controller/listViewController.js
+++ b/ui/app/ot/controller/listViewController.js
@@ -77,6 +77,15 @@ angular.module('bahmni.ot')
}
return mappedAppointment;
});
+ surgicalBlock.surgicalAppointments = _.filter(surgicalBlock.surgicalAppointments, function (surgicalAppointment) {
+ if (surgicalAppointment.derivedAttributes.expectedStartTime) {
+ var surgicalAppointmentStartDateTime = surgicalAppointment.derivedAttributes.expectedStartTime;
+ var surgicalAppointmentEndDateTime = Bahmni.Common.Util.DateUtil.addMinutes(surgicalAppointmentStartDateTime, surgicalAppointment.derivedAttributes.duration);
+ return surgicalAppointmentStartDateTime < endDatetime && surgicalAppointmentEndDateTime > startDatetime;
+ }
+ return surgicalAppointment.derivedAttributes.expectedStartDate <= endDatetime
+ && surgicalAppointment.derivedAttributes.expectedStartDate >= startDatetime;
+ });
return surgicalBlock;
});
@@ -100,7 +109,7 @@ angular.module('bahmni.ot')
$scope.cancelDisabled = true;
$scope.reverseSort = false;
$scope.sortColumn = "";
- return $q.all([surgicalAppointmentService.getSurgicalBlocksInDateRange(startDatetime, endDatetime, true)]).then(function (response) {
+ return $q.all([surgicalAppointmentService.getSurgicalBlocksInDateRange(startDatetime, endDatetime, true, true)]).then(function (response) {
$scope.surgicalBlocks = response[0].data.results;
filterSurgicalBlocksAndMapAppointmentsForDisplay($scope.surgicalBlocks);
});
diff --git a/ui/app/ot/controller/otCalendarController.js b/ui/app/ot/controller/otCalendarController.js
index 146a55f483..84076d4658 100644
--- a/ui/app/ot/controller/otCalendarController.js
+++ b/ui/app/ot/controller/otCalendarController.js
@@ -27,7 +27,7 @@ angular.module('bahmni.ot')
updateBlocksStartDatetimeAndBlocksEndDatetime();
$scope.rows = $scope.getRowsForCalendar();
return $q.all([locationService.getAllByTag('Operation Theater'),
- surgicalAppointmentService.getSurgicalBlocksInDateRange($scope.blocksStartDatetime, $scope.blocksEndDatetime)]).then(function (response) {
+ surgicalAppointmentService.getSurgicalBlocksInDateRange($scope.blocksStartDatetime, $scope.blocksEndDatetime, false, true)]).then(function (response) {
$scope.locations = response[0].data.results;
$scope.weekDates = $scope.getAllWeekDates();
$scope.surgicalBlocksByLocation = _.map($scope.locations, function (location) {
@@ -37,13 +37,18 @@ angular.module('bahmni.ot')
});
$scope.surgicalBlocksByDate = _.map($scope.weekDates, function (weekDate) {
return _.filter(response[1].data.results, function (surgicalBlock) {
- return Bahmni.Common.Util.DateUtil.isSameDate(moment(surgicalBlock.startDatetime).startOf('day').toDate(), weekDate);
+ return $scope.isSurgicalBlockActiveOnGivenDate(surgicalBlock, weekDate);
});
});
$scope.blockedOtsOfTheWeek = getBlockedOtsOfTheWeek();
});
};
+ $scope.isSurgicalBlockActiveOnGivenDate = function (surgicalBlock, weekDate) {
+ return Bahmni.Common.Util.DateUtil.isSameDate(moment(surgicalBlock.startDatetime).startOf('day').toDate(), weekDate)
+ || moment(surgicalBlock.endDatetime).toDate() > weekDate;
+ };
+
$scope.intervals = function () {
var dayStart = ($scope.dayViewStart || '00:00').split(':');
var dayEnd = ($scope.dayViewEnd || '23:59').split(':');
diff --git a/ui/app/ot/controller/surgicalBlockController.js b/ui/app/ot/controller/surgicalBlockController.js
index ade02c3952..d73aeebaae 100644
--- a/ui/app/ot/controller/surgicalBlockController.js
+++ b/ui/app/ot/controller/surgicalBlockController.js
@@ -65,6 +65,18 @@ angular.module('bahmni.ot')
return true;
};
+ $scope.closeDialog = function () {
+ ngDialog.close();
+ };
+
+ $scope.saveAnywaysFlag = false;
+
+ $scope.saveAnyways = function (surgicalForm) {
+ $scope.saveAnywaysFlag = true;
+ $scope.save(surgicalForm);
+ ngDialog.close();
+ };
+
$scope.save = function (surgicalForm) {
if (!$scope.isFormValid()) {
messagingService.showMessage('error', "{{'OT_ENTER_MANDATORY_FIELDS' | translate}}");
@@ -74,16 +86,27 @@ angular.module('bahmni.ot')
messagingService.showMessage('error', "{{'OT_SURGICAL_APPOINTMENT_EXCEEDS_BLOCK_DURATION' | translate}}");
return;
}
- $scope.updateSortWeight(surgicalForm);
- var surgicalBlock = new Bahmni.OT.SurgicalBlockMapper().mapSurgicalBlockUIToDomain(surgicalForm);
- var saveOrupdateSurgicalBlock = _.isEmpty(surgicalBlock.uuid) ? surgicalAppointmentService.saveSurgicalBlock : surgicalAppointmentService.updateSurgicalBlock;
- spinner.forPromise(saveOrupdateSurgicalBlock(surgicalBlock)).then(function (response) {
- $scope.surgicalForm = new Bahmni.OT.SurgicalBlockMapper().map(response.data, $scope.attributeTypes, $scope.surgeons);
- $scope.surgicalForm.surgicalAppointments = surgicalAppointmentHelper.filterSurgicalAppointmentsByStatus(
- $scope.surgicalForm.surgicalAppointments, [Bahmni.OT.Constants.scheduled, Bahmni.OT.Constants.completed]);
- messagingService.showMessage('info', "{{'OT_SAVE_SUCCESS_MESSAGE_KEY' | translate}}");
- $state.go('editSurgicalAppointment', {surgicalBlockUuid: response.data.uuid});
- });
+ if ($scope.saveAnywaysFlag || Bahmni.Common.Util.DateUtil.isSameDate(surgicalForm.startDatetime, surgicalForm.endDatetime)) {
+ $scope.updateSortWeight(surgicalForm);
+ var surgicalBlock = new Bahmni.OT.SurgicalBlockMapper().mapSurgicalBlockUIToDomain(surgicalForm);
+ var saveOrupdateSurgicalBlock = _.isEmpty(surgicalBlock.uuid) ? surgicalAppointmentService.saveSurgicalBlock : surgicalAppointmentService.updateSurgicalBlock;
+ spinner.forPromise(saveOrupdateSurgicalBlock(surgicalBlock)).then(function (response) {
+ $scope.surgicalForm = new Bahmni.OT.SurgicalBlockMapper().map(response.data, $scope.attributeTypes, $scope.surgeons);
+ $scope.surgicalForm.surgicalAppointments = surgicalAppointmentHelper.filterSurgicalAppointmentsByStatus(
+ $scope.surgicalForm.surgicalAppointments, [Bahmni.OT.Constants.scheduled, Bahmni.OT.Constants.completed]);
+ messagingService.showMessage('info', "{{'OT_SAVE_SUCCESS_MESSAGE_KEY' | translate}}");
+ $state.go('editSurgicalAppointment', {surgicalBlockUuid: response.data.uuid});
+ });
+ $scope.saveAnywaysFlag = false;
+ } else {
+ ngDialog.open({
+ template: 'views/surgicalBlockMultipleDaysDialog.html',
+ className: 'ngdialog-theme-default',
+ closeByNavigation: true,
+ data: { surgicalForm: surgicalForm },
+ scope: $scope
+ });
+ }
};
var addOrUpdateTheSurgicalAppointment = function (surgicalAppointment) {
diff --git a/ui/app/ot/directives/otCalendarSurgicalAppointment.js b/ui/app/ot/directives/otCalendarSurgicalAppointment.js
index 4c1e69e5a1..7d2676f805 100644
--- a/ui/app/ot/directives/otCalendarSurgicalAppointment.js
+++ b/ui/app/ot/directives/otCalendarSurgicalAppointment.js
@@ -31,7 +31,7 @@ angular.module('bahmni.ot')
};
var getHeightForSurgicalAppointment = function () {
- return $scope.surgicalAppointment.derivedAttributes.duration * $scope.heightPerMin;
+ return $scope.surgicalAppointment.derivedAttributes.height * $scope.heightPerMin;
};
$scope.selectSurgicalAppointment = function ($event) {
diff --git a/ui/app/ot/directives/otCalendarSurgicalBlock.js b/ui/app/ot/directives/otCalendarSurgicalBlock.js
index cfd5fb6224..7d72a27382 100644
--- a/ui/app/ot/directives/otCalendarSurgicalBlock.js
+++ b/ui/app/ot/directives/otCalendarSurgicalBlock.js
@@ -18,7 +18,7 @@ angular.module('bahmni.ot')
left: $scope.weekOrDay === 'week' ? getLeftPositionForSurgicalBlock() : 0,
color: getColorForProvider(),
appointmentHeightPerMin: (surgicalBlockHeight - heightForSurgeonName) / Bahmni.Common.Util.DateUtil.diffInMinutes(
- $scope.surgicalBlock.startDatetime, $scope.surgicalBlock.endDatetime)
+ getSurgicalBlockStartDateTimeBasedOnCalendarStartDateTime(), getSurgicalBlockEndDateTimeBasedOnCalendarEndDateTime())
};
};
@@ -50,12 +50,13 @@ angular.module('bahmni.ot')
};
var getHeightForSurgicalBlock = function () {
return Bahmni.Common.Util.DateUtil.diffInMinutes(
- $scope.surgicalBlock.startDatetime, $scope.surgicalBlock.endDatetime) * surgicalBlockHeightPerMin;
+ getSurgicalBlockStartDateTimeBasedOnCalendarStartDateTime(), getSurgicalBlockEndDateTimeBasedOnCalendarEndDateTime()) * surgicalBlockHeightPerMin;
};
var getTopForSurgicalBlock = function () {
- return Bahmni.Common.Util.DateUtil.diffInMinutes(
- getCalendarStartDateTime($scope.surgicalBlock.startDatetime), $scope.surgicalBlock.startDatetime) * surgicalBlockHeightPerMin;
+ var top = Bahmni.Common.Util.DateUtil.diffInMinutes(
+ getCalendarStartDateTime($scope.viewDate), $scope.surgicalBlock.startDatetime) * surgicalBlockHeightPerMin;
+ return top > 0 ? top : 0;
};
var getCalendarStartDateTime = function (date) {
var dayStart = ($scope.dayViewStart || Bahmni.OT.Constants.defaultCalendarStartTime).split(':');
@@ -66,6 +67,17 @@ angular.module('bahmni.ot')
var dayEnd = ($scope.dayViewEnd || Bahmni.OT.Constants.defaultCalendarEndTime).split(':');
return Bahmni.Common.Util.DateUtil.addMinutes(moment(date).startOf('day'), (dayEnd[0] * 60 + parseInt(dayEnd[1])));
};
+
+ var getSurgicalBlockStartDateTimeBasedOnCalendarStartDateTime = function () {
+ return moment($scope.surgicalBlock.startDatetime).toDate() < getCalendarStartDateTime($scope.viewDate)
+ ? getCalendarStartDateTime($scope.viewDate) : $scope.surgicalBlock.startDatetime;
+ };
+
+ var getSurgicalBlockEndDateTimeBasedOnCalendarEndDateTime = function () {
+ return getCalendarEndDateTime($scope.viewDate) < moment($scope.surgicalBlock.endDatetime).toDate()
+ ? getCalendarEndDateTime($scope.viewDate) : $scope.surgicalBlock.endDatetime;
+ };
+
var calculateEstimatedAppointmentDuration = function () {
var surgicalAppointments = _.filter($scope.surgicalBlock.surgicalAppointments, function (surgicalAppointment) {
return $scope.isValidSurgicalAppointment(surgicalAppointment);
@@ -78,6 +90,12 @@ angular.module('bahmni.ot')
surgicalAppointment.derivedAttributes.expectedStartDatetime = nextAppointmentStartDatetime;
surgicalAppointment.derivedAttributes.expectedEndDatetime = Bahmni.Common.Util.DateUtil.addMinutes(nextAppointmentStartDatetime,
surgicalAppointment.derivedAttributes.duration);
+ surgicalAppointment.derivedAttributes.height = Bahmni.Common.Util.DateUtil.diffInMinutes(
+ surgicalAppointment.derivedAttributes.expectedStartDatetime < getCalendarStartDateTime($scope.viewDate)
+ ? getCalendarStartDateTime($scope.viewDate) : surgicalAppointment.derivedAttributes.expectedStartDatetime,
+ getCalendarEndDateTime($scope.viewDate) < surgicalAppointment.derivedAttributes.expectedEndDatetime
+ ? getCalendarEndDateTime($scope.viewDate) : surgicalAppointment.derivedAttributes.expectedEndDatetime
+ );
nextAppointmentStartDatetime = surgicalAppointment.derivedAttributes.expectedEndDatetime;
return surgicalAppointment;
});
@@ -87,6 +105,12 @@ angular.module('bahmni.ot')
return surgicalAppointment.status !== Bahmni.OT.Constants.cancelled && surgicalAppointment.status !== Bahmni.OT.Constants.postponed;
};
+ $scope.canShowInCalendarView = function (surgicalAppointment) {
+ return $scope.isValidSurgicalAppointment(surgicalAppointment)
+ && surgicalAppointment.derivedAttributes.expectedStartDatetime < getCalendarEndDateTime($scope.viewDate)
+ && surgicalAppointment.derivedAttributes.expectedEndDatetime > getCalendarStartDateTime($scope.viewDate);
+ };
+
$scope.selectSurgicalBlock = function ($event) {
$scope.$emit("event:surgicalBlockSelect", $scope.surgicalBlock);
$event.stopPropagation();
@@ -119,7 +143,8 @@ angular.module('bahmni.ot')
dayViewEnd: "=",
dayViewSplit: "=",
filterParams: "=",
- weekOrDay: "="
+ weekOrDay: "=",
+ viewDate: "="
},
templateUrl: "../ot/views/calendarSurgicalBlock.html"
};
diff --git a/ui/app/ot/services/surgicalAppointmentService.js b/ui/app/ot/services/surgicalAppointmentService.js
index 60ed62c73d..fdd9e91918 100644
--- a/ui/app/ot/services/surgicalAppointmentService.js
+++ b/ui/app/ot/services/surgicalAppointmentService.js
@@ -50,13 +50,14 @@ angular.module('bahmni.ot')
});
};
- this.getSurgicalBlocksInDateRange = function (startDatetime, endDatetime, includeVoided) {
+ this.getSurgicalBlocksInDateRange = function (startDatetime, endDatetime, includeVoided, activeBlocks) {
return $http.get(Bahmni.OT.Constants.addSurgicalBlockUrl, {
method: "GET",
params: {
startDatetime: Bahmni.Common.Util.DateUtil.parseLongDateToServerFormat(startDatetime),
endDatetime: Bahmni.Common.Util.DateUtil.parseLongDateToServerFormat(endDatetime),
includeVoided: includeVoided || false,
+ activeBlocks: activeBlocks || false,
v: "custom:(id,uuid," +
"provider:(uuid,person:(uuid,display),attributes:(attributeType:(display),value,voided))," +
"location:(uuid,name),startDatetime,endDatetime,surgicalAppointments:(id,uuid,patient:(uuid,display,person:(age))," +
diff --git a/ui/app/ot/views/addActualTimeDialog.html b/ui/app/ot/views/addActualTimeDialog.html
index f7aa887620..07e8334d69 100644
--- a/ui/app/ot/views/addActualTimeDialog.html
+++ b/ui/app/ot/views/addActualTimeDialog.html
@@ -2,12 +2,18 @@
{{'OT_SURGICAL_APPOINTMENT_ADD_ACTUAL_TIME_FOR' | translate}} {{patientDisplayLabel}}
{{'OT_START_TIME_KEY' | translate}}
-
+
+
+
+
{{'OT_END_TIME_KEY' | translate}}
-
+
+
+
+
{{'OT_SURGICAL_APPOINTMENT_NOTES' | translate}}
@@ -18,4 +24,4 @@
{{'OT_SURGICAL_APPOINTMENT_ADD_ACTUAL
-
\ No newline at end of file
+
diff --git a/ui/app/ot/views/calendarSurgicalBlock.html b/ui/app/ot/views/calendarSurgicalBlock.html
index 6f10317f15..cb4769f63a 100644
--- a/ui/app/ot/views/calendarSurgicalBlock.html
+++ b/ui/app/ot/views/calendarSurgicalBlock.html
@@ -10,7 +10,7 @@
week-or-day="weekOrDay"
operation-theatre="operationTheatre"
background-color="blockDimensions.color"
- ng-if="isValidSurgicalAppointment(surgicalAppointment)"
+ ng-if="canShowInCalendarView(surgicalAppointment)"
height-per-min="blockDimensions.appointmentHeightPerMin"
filter-params="filterParams">
diff --git a/ui/app/ot/views/otCalendar.html b/ui/app/ot/views/otCalendar.html
index 0041cb81eb..fc68b694bc 100644
--- a/ui/app/ot/views/otCalendar.html
+++ b/ui/app/ot/views/otCalendar.html
@@ -25,6 +25,7 @@
day-view-split="::dayViewSplit"
filter-params="filterParams"
week-or-day="::weekOrDay"
+ view-date="::viewDate"
>
{{'OT_SURGICAL_APPOINTMENT_DIALOG_DETAILS' | translate}}
{{'OT_PATIENT' | translate}}: {{getPatientDisplayLabel(ngDialogData)}}
{{'OT_SURGICAL_BLOCK_DIALOG_LOCATION' | translate}}: {{surgicalBlockSelected.location.name}}
- {{'OT_SURGICAL_APPOINTMENT_ESTIMATED_TIME' |
- translate}}: {{ngDialogData.derivedAttributes.expectedStartDatetime | bahmniTime}} -
- {{ngDialogData.derivedAttributes.expectedEndDatetime | bahmniTime}}
+ {{'OT_SURGICAL_APPOINTMENT_ESTIMATED_TIME' | translate}}:
+ {{ngDialogData.derivedAttributes.expectedStartDatetime | date : 'dd MMM, '}}{{ngDialogData.derivedAttributes.expectedStartDatetime | bahmniTime}} -
+ {{ngDialogData.derivedAttributes.expectedEndDatetime | date : 'dd MMM, '}}{{ngDialogData.derivedAttributes.expectedEndDatetime | bahmniTime}}
{{'OT_SURGICAL_APPOINTMENT_PROCEDURE' | translate}}: {{attributes.procedure}}
{{'OT_SURGICAL_APPOINTMENT_ANAESTHETIST' | translate}}:
{{attributes.anaesthetist}}
{{'OT_SURGICAL_APPOINTMENT_NOTES' | translate}}: {{attributes.notes}}
{{'OT_SURGICAL_APPOINTMENT_ACTUAL_TIME' | translate}}:
- {{ngDialogData.actualStartDatetime | bahmniTime}} - {{ngDialogData.actualEndDatetime | bahmniTime}}
+ {{ngDialogData.actualStartDatetime | date : 'dd MMM, '}}{{ngDialogData.actualStartDatetime | bahmniTime}} -
+ {{ngDialogData.actualEndDatetime | date : 'dd MMM, '}}{{ngDialogData.actualEndDatetime | bahmniTime}}
{{'OT_ADD_ACTUAL_TIME_KEY' | translate}}
diff --git a/ui/app/ot/views/surgicalBlockDialog.html b/ui/app/ot/views/surgicalBlockDialog.html
index 135d592f40..1ef864b8bf 100644
--- a/ui/app/ot/views/surgicalBlockDialog.html
+++ b/ui/app/ot/views/surgicalBlockDialog.html
@@ -3,9 +3,13 @@
{{'OT_SURGICAL_BLOCK_DIALOG_DETAILS' | translate}}
{{'OT_SURGICAL_BLOCK_DIALOG_SURGEON' | translate}}: {{ngDialogData.provider.person.display}}
{{'OT_SURGICAL_BLOCK_DIALOG_LOCATION' | translate}}: {{ngDialogData.location.name}}
- {{'OT_SURGICAL_BLOCK_DIALOG_DATE' | translate}}: {{ngDialogData.startDatetime | date : 'dd MMM yyyy, EEE'}}
- {{'OT_SURGICAL_BLOCK_DIALOG_DURATION' | translate}}: {{ngDialogData.startDatetime | bahmniTime}} -
+
{{'OT_SURGICAL_BLOCK_DIALOG_DATE' | translate}}: {{ngDialogData.startDatetime | date : 'dd MMM yyyy, EEE'}}
+ {{'OT_SURGICAL_BLOCK_DIALOG_DURATION' | translate}}: {{ngDialogData.startDatetime | bahmniTime}} -
{{ngDialogData.endDatetime | bahmniTime}}
+ {{'OT_SURGICAL_BLOCK_DIALOG_DATE' | translate}}:
+ {{ngDialogData.startDatetime | date : 'dd MMM, '}}{{ngDialogData.startDatetime | bahmniTime}} -
+ {{ngDialogData.endDatetime | date : 'dd MMM, '}}{{ngDialogData.endDatetime | bahmniTime}}
+
{{'OT_EDIT_KEY' | translate}}
@@ -14,4 +18,4 @@ {{'OT_SURGICAL_BLOCK_DIALOG_DETAILS' | translate}}
ng-mousedown="cancelSurgicalBlockOrSurgicalAppointment()">{{'OT_CANCEL_BLOCK' | translate}}
-
\ No newline at end of file
+
diff --git a/ui/app/ot/views/surgicalBlockMultipleDaysDialog.html b/ui/app/ot/views/surgicalBlockMultipleDaysDialog.html
new file mode 100644
index 0000000000..221283a56c
--- /dev/null
+++ b/ui/app/ot/views/surgicalBlockMultipleDaysDialog.html
@@ -0,0 +1,13 @@
+
+
+
{{ 'OT_SURGICAL_BLOCK_MULTIPLE_DAYS_DIALOG_TITLE' | translate }}
+
Are you sure you want to create a surgical block across days?
+
+
+ {{ 'OT_SAVE_ANYWAY_KEY' | translate }}
+
+
+ {{ 'OT_CANCEL_KEY' | translate }}
+
+
+
diff --git a/ui/app/styles/ot/_ot.scss b/ui/app/styles/ot/_ot.scss
index 7714c42423..ef97eed751 100644
--- a/ui/app/styles/ot/_ot.scss
+++ b/ui/app/styles/ot/_ot.scss
@@ -277,6 +277,10 @@ div[ng-app="ot"] {
text-align: center;
padding: 15px 0px 3px 0px;
}
+ .ot-actual-datetime-input {
+ text-align: center;
+ display: block;
+ }
.ot-actual-time-input {
word-spacing: 1px;
font-size: 18px;
@@ -284,7 +288,6 @@ div[ng-app="ot"] {
border-radius: 6px;
padding: 0px 10px 0px 30px;
margin: 0px auto 0px !important;
- display: block;
}
.ot-actual-time-notes {
min-height: 100px;
diff --git a/ui/test/unit/ot/controller/listViewController.spec.js b/ui/test/unit/ot/controller/listViewController.spec.js
index 55e14dfedc..f904a8edd4 100644
--- a/ui/test/unit/ot/controller/listViewController.spec.js
+++ b/ui/test/unit/ot/controller/listViewController.spec.js
@@ -368,7 +368,7 @@ describe('listViewController', function () {
it("should sort the appointments by start date and by the location and by start time", function () {
- scope.viewDate = moment('2017-02-22').toDate();
+ scope.viewDate = moment('2017-06-22').toDate();
scope.filterParams = {
providers: [],
locations: {"OT 1": true, "OT 2": true, "OT 3": true},
@@ -376,7 +376,7 @@ describe('listViewController', function () {
statusList: []
};
createController();
- expect(surgicalAppointmentService.getSurgicalBlocksInDateRange).toHaveBeenCalledWith(jasmine.any(Date), jasmine.any(Date), true);
+ expect(surgicalAppointmentService.getSurgicalBlocksInDateRange).toHaveBeenCalledWith(jasmine.any(Date), jasmine.any(Date), true, true);
expect(scope.surgicalAppointmentList.length).toEqual(6);
expect(scope.surgicalAppointmentList[0].id).toEqual(104);
expect(scope.surgicalAppointmentList[1].id).toEqual(105);
@@ -387,6 +387,7 @@ describe('listViewController', function () {
});
it("should set the derived attributes for appointments", function () {
+ scope.viewDate = moment('2017-06-22').toDate();
scope.filterParams = {
providers: [],
locations: {"OT 1": true, "OT 2": false, "OT 3": false},
@@ -455,6 +456,7 @@ describe('listViewController', function () {
});
it("should sort appointments by the sort column", function () {
+ scope.viewDate = moment('2017-06-22').toDate();
scope.filterParams = {
providers: [],
locations: {"OT 1": true, "OT 2": true, "OT 3": true},
@@ -523,6 +525,7 @@ describe('listViewController', function () {
});
it("should reverse sort appointments if sorted on the same column consecutively", function () {
+ scope.viewDate = moment('2017-06-22').toDate();
scope.filterParams = {
providers: [],
locations: {"OT 1": true, "OT 2": true, "OT 3": true},
diff --git a/ui/test/unit/ot/controller/otCalendarController.spec.js b/ui/test/unit/ot/controller/otCalendarController.spec.js
index 916215d466..5b59f6e98b 100644
--- a/ui/test/unit/ot/controller/otCalendarController.spec.js
+++ b/ui/test/unit/ot/controller/otCalendarController.spec.js
@@ -123,7 +123,7 @@ describe("otCalendarController", function () {
});
scope.weekOrDay = 'day';
createController();
- expect(surgicalAppointmentService.getSurgicalBlocksInDateRange).toHaveBeenCalledWith(scope.viewDate, moment(scope.viewDate).endOf('day'));
+ expect(surgicalAppointmentService.getSurgicalBlocksInDateRange).toHaveBeenCalledWith(scope.viewDate, moment(scope.viewDate).endOf('day'), false, true);
expect(scope.surgicalBlocksByLocation.length).toEqual(2);
expect(scope.surgicalBlocksByLocation[0][0]).toEqual(surgicalBlocks[0]);
expect(scope.surgicalBlocksByLocation[1][0]).toEqual(surgicalBlocks[1]);
@@ -171,13 +171,12 @@ describe("otCalendarController", function () {
scope.weekOrDay = 'week';
scope.weekStartDate = moment('2020-04-06').toDate();
createController();
- scope.updateBlockedOtsOfTheDay(4);
expect(scope.blockedOtsOfTheWeek.length).toEqual(7);
- expect(scope.blockedOtsOfTheWeek[0]).toEqual([]);
- expect(scope.blockedOtsOfTheWeek[1]).toEqual([]);
- expect(scope.blockedOtsOfTheWeek[2]).toEqual([]);
- expect(scope.blockedOtsOfTheWeek[3]).toEqual([]);
- expect(scope.blockedOtsOfTheWeek[4]).toEqual(["uuid1"]);
+ expect(scope.blockedOtsOfTheWeek[0]).toEqual(['uuid1', 'uuid2']);
+ expect(scope.blockedOtsOfTheWeek[1]).toEqual(['uuid1', 'uuid2']);
+ expect(scope.blockedOtsOfTheWeek[2]).toEqual(['uuid1', 'uuid2']);
+ expect(scope.blockedOtsOfTheWeek[3]).toEqual(['uuid1', 'uuid2']);
+ expect(scope.blockedOtsOfTheWeek[4]).toEqual(['uuid1', 'uuid2']);
expect(scope.blockedOtsOfTheWeek[5]).toEqual(["uuid2"]);
expect(scope.blockedOtsOfTheWeek[6]).toEqual([]);
@@ -190,7 +189,7 @@ describe("otCalendarController", function () {
scope.weekOrDay = 'week';
scope.weekStartDate = moment('2020-04-06').toDate();
createController();
- expect(surgicalAppointmentService.getSurgicalBlocksInDateRange).toHaveBeenCalledWith(moment(scope.weekStartDate).startOf('day'), moment(Bahmni.Common.Util.DateUtil.getWeekEndDate(scope.weekStartDate)).endOf('day'));
+ expect(surgicalAppointmentService.getSurgicalBlocksInDateRange).toHaveBeenCalledWith(moment(scope.weekStartDate).startOf('day'), moment(Bahmni.Common.Util.DateUtil.getWeekEndDate(scope.weekStartDate)).endOf('day'), false, true);
expect(scope.surgicalBlocksByDate.length).toEqual(7);
expect(scope.surgicalBlocksByDate[4][0]).toEqual(weekSurgicalBlocks[0]);
expect(scope.surgicalBlocksByDate[5][0]).toEqual(weekSurgicalBlocks[1]);
@@ -204,8 +203,8 @@ describe("otCalendarController", function () {
scope.weekStartDate = moment('2020-04-06').toDate();
createController();
scope.updateBlockedOtsOfTheDay(4);
- expect(scope.blockedOtsOfTheDay.length).toEqual(1);
- expect(scope.blockedOtsOfTheDay).toEqual(["uuid1"]);
+ expect(scope.blockedOtsOfTheDay.length).toEqual(2);
+ expect(scope.blockedOtsOfTheDay).toEqual(["uuid1", "uuid2"]);
});
});
diff --git a/ui/test/unit/ot/controller/surgicalBlockController.spec.js b/ui/test/unit/ot/controller/surgicalBlockController.spec.js
index 9e5aab6167..f53987a706 100644
--- a/ui/test/unit/ot/controller/surgicalBlockController.spec.js
+++ b/ui/test/unit/ot/controller/surgicalBlockController.spec.js
@@ -390,6 +390,7 @@ describe("surgicalBlockController", function () {
scope.surgicalForm.location = {uuid: "locationUuid"};
scope.surgicalForm.surgicalAppointments = [{id: "11", patient: {uuid: "patientUuid"}, notes: "need more assistants", sortWeight: 0, surgicalAppointmentAttributes: uiSurgicalAppointmentAttributes}];
+ scope.saveAnywaysFlag = true;
scope.save(scope.surgicalForm);
expect(surgicalAppointmentService.saveSurgicalBlock).toHaveBeenCalled();
@@ -427,6 +428,7 @@ describe("surgicalBlockController", function () {
scope.surgicalForm.location = {uuid: "locationUuid"};
scope.surgicalForm.surgicalAppointments = [{id: "11", patient: {uuid: "patientUuid"}, notes: "need more assistants", sortWeight: 0, surgicalAppointmentAttributes: uiSurgicalAppointmentAttributes}];
+ scope.saveAnywaysFlag = true;
scope.save(scope.surgicalForm);
expect(surgicalAppointmentService.updateSurgicalBlock).toHaveBeenCalled();
diff --git a/ui/test/unit/ot/directives/otCalendarSurgicalAppointment.spec.js b/ui/test/unit/ot/directives/otCalendarSurgicalAppointment.spec.js
index c4548f9301..654c69cf8c 100644
--- a/ui/test/unit/ot/directives/otCalendarSurgicalAppointment.spec.js
+++ b/ui/test/unit/ot/directives/otCalendarSurgicalAppointment.spec.js
@@ -57,7 +57,8 @@ describe("otCalendarSurgicalAppointment", function () {
}],
"derivedAttributes": {
- duration: 136
+ duration: 136,
+ height: 136
}
};
scope.filterParams = {
diff --git a/ui/test/unit/ot/directives/otCalendarSurgicalBlock.spec.js b/ui/test/unit/ot/directives/otCalendarSurgicalBlock.spec.js
index e2decdf890..8a91a8c380 100644
--- a/ui/test/unit/ot/directives/otCalendarSurgicalBlock.spec.js
+++ b/ui/test/unit/ot/directives/otCalendarSurgicalBlock.spec.js
@@ -3,7 +3,7 @@
describe("otCalendarSurgicalBlock", function () {
var simpleHtml = ' ';
+ ' day-view-split="dayViewSplit" filter-params="filterParams" week-or-day="::weekOrDay" view-date="::viewDate" >';
var $compile, element, mockBackend, scope;
beforeEach(module('ngHtml2JsPreprocessor'));
@@ -44,6 +44,7 @@ describe("otCalendarSurgicalBlock", function () {
scope.dayViewEnd = "16:00";
scope.dayViewSplit = 30;
scope.weekOrDay = 'day';
+ scope.viewDate = "2017-05-24 09:00:00";
mockBackend.expectGET('../ot/views/calendarSurgicalBlock.html').respond("dummy
");
element = $compile(simpleHtml)(scope);
@@ -81,6 +82,7 @@ describe("otCalendarSurgicalBlock", function () {
scope.dayViewEnd = "16:00";
scope.dayViewSplit = 30;
scope.weekOrDay = 'day';
+ scope.viewDate = "2017-05-24 09:00:00";
mockBackend.expectGET('../ot/views/calendarSurgicalBlock.html').respond("dummy
");
element = $compile(simpleHtml)(scope);
@@ -231,6 +233,7 @@ describe("otCalendarSurgicalBlock", function () {
scope.dayViewSplit = 30;
scope.weekOrDay = 'week';
scope.blockedOtsOfTheDay = ["3353ccb2-3086-11e7-b60e-0800274a5156"];
+ scope.viewDate = "2017-05-24 09:00:00";
mockBackend.expectGET('../ot/views/calendarSurgicalBlock.html').respond("dummy
");
element = $compile(simpleHtml)(scope);
@@ -255,6 +258,7 @@ describe("otCalendarSurgicalBlock", function () {
scope.dayViewSplit = 30;
scope.weekOrDay = 'week';
scope.blockedOtsOfTheDay = ["3e175fd1-4ce5-11e7-9b35-000c29e530d2", "3353ccb2-3086-11e7-b60e-0800274a5156", "3e1740e5-4ce5-11e7-9b35-000c29e530d2"];
+ scope.viewDate = "2017-05-24 09:00:00";
mockBackend.expectGET('../ot/views/calendarSurgicalBlock.html').respond("dummy
");
element = $compile(simpleHtml)(scope);
diff --git a/ui/test/unit/ot/services/surgicalAppointmentService.spec.js b/ui/test/unit/ot/services/surgicalAppointmentService.spec.js
index 1b78fe5877..4c7ccdc75f 100644
--- a/ui/test/unit/ot/services/surgicalAppointmentService.spec.js
+++ b/ui/test/unit/ot/services/surgicalAppointmentService.spec.js
@@ -90,14 +90,14 @@ describe('surgicalAppointmentService', function () {
mockHttp.get.and.returnValue(specUtil.respondWith(data));
- surgicalAppointmentService.getSurgicalBlocksInDateRange(startDatetime, endDatetime).then(function (response) {
+ surgicalAppointmentService.getSurgicalBlocksInDateRange(startDatetime, endDatetime, false, true).then(function (response) {
expect(response).toEqual(data);
done();
});
expect(mockHttp.get).toHaveBeenCalled();
expect(mockHttp.get.calls.mostRecent().args[0]).toBe("/openmrs/ws/rest/v1/surgicalBlock");
- expect(mockHttp.get.calls.mostRecent().args[1].params).toEqual({ startDatetime : '2039-08-26T12:00:00.000', endDatetime : '2039-08-26T15:00:00.000',includeVoided: false, v: "custom:(id,uuid," +
+ expect(mockHttp.get.calls.mostRecent().args[1].params).toEqual({ startDatetime : '2039-08-26T12:00:00.000', endDatetime : '2039-08-26T15:00:00.000',includeVoided: false, activeBlocks: true, v: "custom:(id,uuid," +
"provider:(uuid,person:(uuid,display),attributes:(attributeType:(display),value,voided))," +
"location:(uuid,name),startDatetime,endDatetime,surgicalAppointments:(id,uuid,patient:(uuid,display,person:(age))," +
"actualStartDatetime,actualEndDatetime,status,notes,sortWeight,bedNumber,bedLocation,surgicalAppointmentAttributes))"});