Widget:VisitSchedulerRedux: Difference between revisions

Jump to navigation Jump to search
(Created page with "<includeonly> <link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jq...")
 
No edit summary
 
(106 intermediate revisions by 2 users not shown)
Line 3: Line 3:
   <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
   <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
   <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
   <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  <script src="https://s3.amazonaws.com/static.wd7.us/includes/ics.js"></script>
    <script src="https://s3.amazonaws.com/static.wd7.us/includes/FileSaver.js"></script>
<script>
<script>
$(document).ready(function(){
$.noConflict();
jQuery( document ).ready(function( $ ) {


$( "#indexEvent" ).val(new Date(2018, 10, 24));
$( "#patientID, #assigned, #indexEvent, #indexEventTime").css({"display":"flex","flex-direction":"column","align-items":"flex-end"});
$( "#indexEvent, #indexEventTime, #visit-1, #visitTime-1" ).val("");
$( "#indexEvent" ).datepicker();
$( "#indexEvent" ).datepicker();
$( "#visit-1" ).datepicker({minDate: new Date()});
$( "#indexEvent" ).change(function(){
$( "#appointments" ).html("<tr><th>Visit Number</th><th>Visit Date</th><th>Delayed Infusion?</th><th>Visit Description</th></tr>");
$( "#delayedInfusionNote, #appointments, #save, #print" ).css('visibility','visible');
var schedule = visitSchedule($("patientID").val(),$("#assigned").val(),new Date($( "#indexEvent" ).val()));
});
function visitSchedule(patient, assigned, index){
function visitSchedule(patient, assigned, index){
var timeConstraints = {
var timeConstraints = {
// VisitNum : [Days from Infusion 1, Window + Days, Window - Days, Window + Hours, Window - Hours, Visit, Visit Description, Short Visit Description]
// VisitNum : [Days from Infusion 1, Window + Days, Window - Days, Window + Hours, Window - Hours, Visit, Visit Description, Short Visit Description]
1: [0, 5, 0, 0, 0, "Visit 1", "Infusion 1 of investigational product should occur no earlier than 12 h after IV contrast.  Subjects who are to undergo angiography and, therefore, receive IV contrast agent must have stable renal function.", "Infusion 1"],
1 : [1, 4, 1, 12, 0, "Visit 2", "Infusion 1 of investigational product should occur <b>no earlier than 12 h after IV contrast or first medical contact</b> and be dosed within 5 days of First Medical Contact.  Subjects who are to undergo angiography and, therefore, receive IV contrast agent must have stable renal function.", "Infusion 1"],
2: [1, 1, 0, 6, 6, "Visit 2", "This follow-up visit should occur 24-48 h (± 6 h) following Infusion 1", "Follow-up after Infusion 1"],
2 : [7, 1, 2, 0, 0, "Visit 3", "Infusion 2 should occur approximately 7 (-2/+1) days  after the 1st infusion (Visit 2) with a minimum window between infusions of at least 5 days.", "Infusion 2"],
3: [7, 3, 0, 0, 0, "Visit 3", "Infusion 2 should occur 7 days (+3) after the 1st infusion (Visit 2), with at least 7 days elapsing between the end of the 1st infusion and the beginning of the 2nd infusion.", "Infusion 2"],
3 : [7, 1, 2, 0, 0, "Visit 4", "Infusion 3 should occur approximately 7 (-2/+1) days after the 2nd infusion (Visit 3) with a minimum window between infusions of at least 5 days.", "Infusion 3"],
4: [14, 3, 0, 0, 0, "Visit 4", "Infusion 3 should occur 7 days (+3) after the 2nd infusion, with at least 7 days elapsing between the end of the 2nd infusion and the beginning of the 3rd infusion.", "Infusion 3"],
4 : [7, 1, 2, 0, 0, "Visit 5", "Infusion 4 should occur approximately 7 (-2/+1) days after the 3rd infusion (Visit 4) with a minimum window between infusions of at least 5 days. This infusion must be given within 30 days of the 1st infusion.", "Infusion 4"],
5: [21, 3, 0, 0, 0, "Visit 5", "Infusion 4 should occur 7 days (+3) after the 3rd infusion, with at least 7 days elapsing between the end of the 3rd infusion and the beginning of the 4th infusion.", "Infusion 4"],
5 : [8, 3, 1, 0, 0, "Visit 6", "Visit 6 (Day 29) is the end of the Active Treatment Period and should occur approximately 7 (± 2) days after infusion 4 (or last infusion) of investigational product.", "1st Follow-Up After Infusion 4"],
6: [28, 3, 0, 0, 0, "Visit 6", "This follow-up visit is the last visit of the active treatment period. It should occur 7 days (+3) following Infusion 4", "Follow-up after Infusion 4"],
6 : [31, 10, 10, 0, 0, "Visit 7", "This follow-up visit should occur approximately on day 60 (&plusmn;10) after the 1st infusion (Visit 2).", "2nd Follow-Up After Infusion 4"],
7: [60, 7, 0, 0, 0, "Visit 7", "Final Safety Visit. Visit 8 should occur approximately 60 days [+ 7 days] after Infusion 1. The visit should not occur less that 25 days after the last infusion (Infusion 4)", "Final Safety Visit"]
7 : [30, 10, 10, 0, 0, "Visit 8", "This follow-up visit should occur approximately on day 90 (&plusmn;10) after the 1st infusion (Visit 2).", "3rd Follow-Up After Infusion 4"],
8 : [90, 10, 10, 0, 0, "Visit 9", "This follow-up visit should occur approximately on day 180 (&plusmn;10) after the 1st infusion (Visit 2).", "4th Follow-Up After Infusion 4"],
9 : [90, 10, 10, 0, 0, "Visit 10", "This follow-up visit should occur approximately on day 270 (&plusmn;10) after the 1st infusion (Visit 2).", "5th Follow-Up After Infusion 4"],
10 : [95, 14, 14, 0, 0, "Visit 11", "This follow-up visit should occur approximately on day 365 (+14) after the 1st infusion (Visit 2).", "End Of Study Visit"],
};
};
this.patientID = patient;
this.patientID = patient;
this.assigned = assigned;
this.assigned = assigned;
var currentAppointment = new Date($("#indexEvent").val());
$.each(timeConstraints, function(key, value){
$.each(timeConstraints, function(key, value){
if(key == 1){
currentAppointment = new Date($( "#indexEvent" ).val());
} else {
currentAppointment = new Date($("#visit-"+(key-1)).val());
}
currentAppointment = new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()+value[0]);
currentAppointment = new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()+value[0]);
$("#appointments").append("<tr><td>"+value[5]+"</td><td><input type='text' class='appointment' id='visit-"+key+"' value='"+currentAppointment+"' /></td><td><input type='checkbox' class='delayedInfusion' value='"+key+"' /></td><td>"+value[6]+"</td></tr>");
if(key <= 4){
$("#visit-"+key).datepicker({minDate: currentAppointment, maxDate:new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()+value[1])});
$("#appointments").append("<tr><td style='text-align:center;'>"+value[5]+"</td><td><input type='text' class='appointment' id='visit-"+key+"' value='"+currentAppointment.toDateString()+"' /></td><td style='text-align:center;'><input type='checkbox' class='delayedInfusion' value='"+key+"' /></td><td>"+value[6]+"</td></tr>");
} else {
$("#appointments").append("<tr><td style='text-align:center;'>"+value[5]+"</td><td><input type='text'  id='visit-"+key+"' value='"+currentAppointment.toDateString()+"' /></td><td></td><td>"+value[6]+"</td></tr>");
}
$("#visit-"+key).datepicker({minDate: new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()-value[2]), maxDate:new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()+value[1])});
});
});
validateConstraints();
$(".appointment").change(function(){
$(".appointment").change(function(){
var modId = $(this).attr("id").split("-")[1];
var modId = $(this).attr("id").split("-")[1];
alert($(this).val());
var updatedAppointment = new Date($(this).val());
var updatedAppointment = new Date($(this).val());
$(this).val(updatedAppointment);
$(this).val(updatedAppointment);
$.each(timeConstraints, function(key, value){
$.each(timeConstraints, function(key, value){
if(key > modId){
                                $("#visit-"+key).css("border", "1px solid black");
if(key > modId && key <= 5){
updatedAppointment = new Date(updatedAppointment.getFullYear(), updatedAppointment.getMonth(), updatedAppointment.getDate()+value[0]);
updatedAppointment = new Date(updatedAppointment.getFullYear(), updatedAppointment.getMonth(), updatedAppointment.getDate()+value[0]);
$("#visit-"+key).val(updatedAppointment);
$("#visit-"+key).val(updatedAppointment.toDateString());
$("#visit-"+key).datepicker('destroy');
$("#visit-"+key).datepicker('destroy');
$("#visit-"+key).datepicker({minDate: updatedAppointment, maxDate:new Date(updatedAppointment.getFullYear(), updatedAppointment.getMonth(), updatedAppointment.getDate()+value[1])});
$("#visit-"+key).datepicker({minDate: new Date(updatedAppointment.getFullYear(), updatedAppointment.getMonth(), updatedAppointment.getDate()-value[2]), maxDate:new Date(updatedAppointment.getFullYear(), updatedAppointment.getMonth(), updatedAppointment.getDate()+value[1])});
} else if(key == modId){
} else if(key == modId){
$("#visit-"+key).val(updatedAppointment);
$("#visit-"+key).val(updatedAppointment.toDateString());
}
}
});
});
validateConstraints();
});
});
$(".delayedInfusion").change(function(){
$(".delayedInfusion").change(function(){
$("#visit-"+$(this).val()).datepicker('destroy');
$("#visit-"+$(this).val()).datepicker('destroy');
$("#visit-"+$(this).val()).datepicker();
$("#visit-"+$(this).val()).datepicker();
});
$("#visitTime-1").change(function(){validateConstraints();});
$( "#indexEventTime" ).change(function(){validateConstraints();});
$("#visit-1").change(function(){
currentAppointment = new Date($("#visit-1").val());
$("#visit-6").datepicker('destroy');
$("#visit-6").val(new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()+60).toDateString());
$("#visit-6").datepicker({minDate: new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()-10), maxDate:new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()+10)});
$("#visit-7").datepicker('destroy');
$("#visit-7").val(new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()+90).toDateString());
$("#visit-7").datepicker({minDate: new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()-10), maxDate:new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()+10)});
$("#visit-8").datepicker('destroy');
$("#visit-8").val(new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()+180).toDateString());
$("#visit-8").datepicker({minDate: new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()-10), maxDate:new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()+10)});
$("#visit-9").datepicker('destroy');
$("#visit-9").val(new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()+270).toDateString());
$("#visit-9").datepicker({minDate: new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()-10), maxDate:new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()+10)});
$("#visit-10").datepicker('destroy');
$("#visit-10").val(new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()+365).toDateString());
$("#visit-10").datepicker({minDate: new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()-10), maxDate:new Date(currentAppointment.getFullYear(), currentAppointment.getMonth(), currentAppointment.getDate()+10)});
});
function validateConstraints(){
var errorFlag = false;
if($( "#visitTime-1" ).length){
var splitTime = $( "#indexEventTime" ).val().split(":");
var hours = splitTime[0]*60*60*1000;
var minutes = splitTime[1]*60*1000;
var visit1 = $( "#visitTime-1" ).val().split(":");
var visit1hours = visit1[0]*60*60*1000;
var visit1minutes = visit1[1]*60*1000;
if((new Date($("#visit-2").val()).getTime() - new Date($("#visit-1").val()).getTime()) > (24*60*60*1000*30)){
errorFlag = true;
                        $("#visit-2").css("border", "1px solid red");
$("#visit-2").addClass("invalid");
}
if((new Date($("#visit-3").val()).getTime() - new Date($("#visit-1").val()).getTime()) > (24*60*60*1000*30)){
errorFlag = true;
                        $("#visit-3").css("border", "1px solid red");
$("#visit-3").addClass("invalid");
}
if((new Date($("#visit-4").val()).getTime() - new Date($("#visit-1").val()).getTime()) > (24*60*60*1000*30)){
errorFlag = true;
                        $("#visit-4").css("border", "1px solid red");
$("#visit-4").addClass("invalid");
}
if(errorFlag){alert("Visits in red fall out of the 30 day window and infusions may not be scheduled on those dates. For help with this matter, call the AEGIS II Hotline");}
}};
$("#print").click(function(){
var newWin = window.open("");
newWin.document.write($("#appointments").prop('outerHTML'));
newWin.print();
newWin.close();
});
$("#save").click(function(){
var cal = ics();
var appointmentDateAndTime = new Date();
$.each(timeConstraints, function(key, value){
if(!$("#visit-"+key).hasClass("invalid")){
cal.addEvent(value[5]+" for "+$("#patientID").val(),value[6],"Office of "+$("#assigned").val(),$("#visit-"+key).val()+" 8:00:00",$("#visit-"+key).val()+" 20:00:00");
}
});
cal.download();
});
});
};
};


var schedule = visitSchedule("Dave","Dr. Phil",);
 
});
});
</script>
</script>
<div id="visitScheduler" style="position:relative; float:left; width:100%;>
Welcome to the AEGIS II Trial Visit Scheduler!
Enter the date and time of First Medical Contact to get a full suggested schedule. Click the "Print" button to print the schedule for each patient OR Click "Save to Outlook" to save to your electronic calendar, if you use Microsoft Outlook email service.<br /><br />


<form>
<b>Please Note: Clicking the "Delayed infusion" button for Visits 3, 4, and 5  will allow you to select more date options for those visits.</b><br /><br />
 
If you have any specific questions about patient scheduling criteria according to the protocol, feel free to contact the AEGIS II Hotline <a href="https://aegis2.bidmc.org/index.php/Hotline_Contact">here</a><br /><br />
<div style="position:relative; float:left; width:20%;">
<form id="visitForm" autocomplete="off" >
<input autocomplete="false" name="hidden" type="text" style="display:none;">
<label for="patientID">Patient ID</label>
<label for="patientID">Patient ID</label>
<input type="text" name="patientID" id="patientID" /><br />
<input type="text" name="patientID" id="patientID" /><br />
<label for="assigned"> Doctor Assigned</label>
<label for="assigned"> Enrolling Staff Member</label>
<input type="text" name="assigned" id="assigned" /><br />
<input type="text" name="assigned" id="assigned" /><br />
<label for="indexEvent">Index Event</label>
<label for="indexEvent">First Medical Contact Date</label>
<input type="text" id="indexEvent" name="indexEvent" /><br />
<input type="text" id="indexEvent" name="indexEvent" /><br />
<input type="button" value="Go" id="go" />
<p style="font-weight: bold;">
<table id="appointments">
Please Note:  Visit 1 is not displayed in the Visit Scheduler as Visit 1 is the Screening Visit in which Subject eligibility will be determined.  Should the Subject be deemed eligible to participate in AEGIS-II, please randomize the Subject in IRT.  This Visit Scheduler is to be used as an aid to calculate the remaining visits once randomization in IRT has occurred.  Please enter the same dates from IRT used for First Medical Contact (FMC) and Visit 2 into this Visit Scheduler to calculate the remaining Visits. 
<tr><th>Visit Number</th><th>Visit Date</th><th>Delayed Infusion?</th><th>Visit Description</th></tr>
</p>
<img src="/images/9/93/AEGISII_Logo_FINAL_portal_resize.png" style="width:100%;" />
 
</div>
<div style="position:relative; float:right; width:80%;">
<p id="delayedInfusionNote" style="visibility:hidden;"><b>Please Note:</b> If your Subject missed an appointment for one of the infusion visits, you should adjust their visit schedule to ensure all 4 infusions are given wherever possible according to the Schedule of Assessments, and avoid skipping any doses by the end of the Active Treatment Period.  To adjust the visit schedule due to a delayed infusion (Infusions 2, 3, or 4), you may select the “Delayed Infusion” button to allow you to enter the date the respective delayed infusion was given.  As a reminder, all 4 infusions must be given within 30 days of the first infusion and no less than 5 days apart from each other. </p>
<table id="appointments" style="visibility:hidden; padding-bottom:10px;">
</table>
</table>
<input type="button" id="print" style="visibility:hidden;" value="Print" />
<input type="button" id="save" style="visibility:hidden;" value="Save to Outlook" />
</div>
</form>
</form>
</div>
<br /><br />&nbsp;
</includeonly>
</includeonly>

Latest revision as of 20:30, 24 July 2019