From 521d2543c4c51f68c635922bb90c7ffac2b4bb26 Mon Sep 17 00:00:00 2001 From: gaazzopa Date: Thu, 26 Nov 2020 15:52:11 +0100 Subject: [PATCH 01/15] Lunch times must be within activity times --- cara/apps/calculator/static/js/form.js | 123 +++++++++++++----- .../templates/calculator.form.html.j2 | 4 +- 2 files changed, 96 insertions(+), 31 deletions(-) diff --git a/cara/apps/calculator/static/js/form.js b/cara/apps/calculator/static/js/form.js index db3874a7..16e77256 100644 --- a/cara/apps/calculator/static/js/form.js +++ b/cara/apps/calculator/static/js/form.js @@ -282,39 +282,53 @@ function validate_form(form) { }); //Validate all dates - $("input[required].datepicker").each(function() { - if (!validateDate(this)) - submit = false; - }); + if (submit) { + $("input[required].datepicker").each(function() { + if (!validateDate(this)) + submit = false; + }); + } //Validate all times - $("input[required].finish_time").each(function() { - if (!validateFinishTime(this)) - submit = false; - }); + if (submit) { + $("input[required].finish_time").each(function() { + if (!validateFinishTime(this)) + submit = false; + }); + } + + //Validate all lunch breaks + if (submit) { + $("input[required].lunch").each(function() { + if (!validateLunchBreak(this)) + submit = false; + }); + } //Check if breaks length >= activity length - var button = document.getElementById("activity_breaks"); - $(button).next('span').remove(); + if (submit) { + var button = document.getElementById("activity_breaks"); + $(button).next('span').remove(); - var lunch_mins = 0; - if (document.getElementById('lunch_option_yes').checked) { - var lunch_start = document.getElementById("lunch_start"); - var lunch_finish = document.getElementById("lunch_finish"); - lunch_mins = parseTimeToMins(lunch_finish.value) - parseTimeToMins(lunch_start.value); - } - - var coffee_breaks = parseInt(document.querySelector('input[name="coffee_breaks"]:checked').value); - var coffee_duration = parseInt(document.getElementById("break_duration").value); - var coffee_mins = coffee_breaks * coffee_duration; - - var activity_start = document.getElementById("activity_start"); - var activity_finish = document.getElementById("activity_finish"); - var activity_mins = parseTimeToMins(activity_finish.value) - parseTimeToMins(activity_start.value); + var lunch_mins = 0; + if (document.getElementById('lunch_option_yes').checked) { + var lunch_start = document.getElementById("lunch_start"); + var lunch_finish = document.getElementById("lunch_finish"); + lunch_mins = parseTimeToMins(lunch_finish.value) - parseTimeToMins(lunch_start.value); + } + + var coffee_breaks = parseInt(document.querySelector('input[name="coffee_breaks"]:checked').value); + var coffee_duration = parseInt(document.getElementById("break_duration").value); + var coffee_mins = coffee_breaks * coffee_duration; + + var activity_start = document.getElementById("activity_start"); + var activity_finish = document.getElementById("activity_finish"); + var activity_mins = parseTimeToMins(activity_finish.value) - parseTimeToMins(activity_start.value); - if ((lunch_mins + coffee_mins) >= activity_mins) { - insertSpanAfter(button, "Length of breaks >= Length of activity"); - submit = false; + if ((lunch_mins + coffee_mins) >= activity_mins) { + insertSpanAfter(button, "Length of breaks >= Length of activity"); + submit = false; + } } return submit; @@ -364,16 +378,63 @@ function isValidDateOrEmpty(date) { } function validateFinishTime(obj) { - $(obj).removeClass("red_border"); - $(obj).next('span').remove(); + if ($(obj).hasClass("finish_time_error")) { + $(obj).removeClass("red_border"); + $(obj).removeClass("finish_time_error"); + } var startTime = parseValToNumber($(obj).prev().val()); var finishTime = parseValToNumber(obj.value); if (startTime > finishTime) { $(obj).addClass("red_border"); + $(obj).addClass("finish_time_error"); + $(obj).next('span').remove(); insertSpanAfter(obj, "Finish time must be after start"); return false; } + else { + $("input[required].lunch").each(function() {validateLunchBreak(this)}); + } + return true; +} + +function validateLunchBreak(obj) { + + //Span element is only after finish time + var spanObj = obj; + if ($(obj).hasClass("start_time")) + spanObj = obj.nextSibling.nextSibling; + + var time = parseValToNumber(obj.value); + + var otherObj = spanObj; + if ($(obj).hasClass("finish_time")) { + otherObj = obj.previousSibling.previousSibling; + } + + $(obj).removeClass("red_border"); + if (!$(otherObj).hasClass("red_border") && !$(spanObj).hasClass("finish_time_error")) { + $(spanObj).next('span').remove(); + } + + var startID = ""; + var finishID = ""; + if ($(obj).hasClass("activity")) { + startID = "activity_start"; + finishID = "activity_finish"; + } + + var globalStart = parseValToNumber(document.getElementById(startID).value); + var globalFinish = parseValToNumber(document.getElementById(finishID).value); + + if ((time < globalStart) || (time > globalFinish)) { + $(obj).addClass("red_border"); + if (!$(otherObj).hasClass("red_border") && !$(spanObj).hasClass("finish_time_error")) { + insertSpanAfter(spanObj, "Lunch break must be within activity times"); + } + return false; + } + return true; } @@ -423,6 +484,10 @@ $(document).ready(function () { $(".finish_time").change(function() {validateFinishTime(this)}); $(".start_time").change(function() {validateFinishTime(this.nextSibling.nextSibling)}); + //Validate lunch times + $("input[required].lunch").each(function() {validateLunchBreak(this)}); + $("input[required].lunch").change(function() {validateLunchBreak(this)}); + var radioValue = $("input[name='event_type']:checked"); if (radioValue.val()) { require_fields(radioValue.get(0)); diff --git a/cara/apps/calculator/templates/calculator.form.html.j2 b/cara/apps/calculator/templates/calculator.form.html.j2 index 3e12229a..4466b2c1 100644 --- a/cara/apps/calculator/templates/calculator.form.html.j2 +++ b/cara/apps/calculator/templates/calculator.form.html.j2 @@ -178,8 +178,8 @@
- Start:    - Finish:
+ Start:    + Finish:
From f4795a6198db6e5395ce871dd57981452d3f668e Mon Sep 17 00:00:00 2001 From: gaazzopa Date: Thu, 26 Nov 2020 15:57:57 +0100 Subject: [PATCH 02/15] Fixed breaks length error location --- cara/apps/calculator/templates/calculator.form.html.j2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cara/apps/calculator/templates/calculator.form.html.j2 b/cara/apps/calculator/templates/calculator.form.html.j2 index 4466b2c1..d5ad4e6d 100644 --- a/cara/apps/calculator/templates/calculator.form.html.j2 +++ b/cara/apps/calculator/templates/calculator.form.html.j2 @@ -167,9 +167,9 @@

-
+ Activity breaks: -
+
Lunch break:   From 8041cb3da63d6b5162858a1b94eb28abeb839f0d Mon Sep 17 00:00:00 2001 From: gaazzopa Date: Thu, 26 Nov 2020 16:04:26 +0100 Subject: [PATCH 03/15] Remove finish time error when not required --- cara/apps/calculator/static/js/form.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cara/apps/calculator/static/js/form.js b/cara/apps/calculator/static/js/form.js index 16e77256..a48ae32d 100644 --- a/cara/apps/calculator/static/js/form.js +++ b/cara/apps/calculator/static/js/form.js @@ -381,6 +381,9 @@ function validateFinishTime(obj) { if ($(obj).hasClass("finish_time_error")) { $(obj).removeClass("red_border"); $(obj).removeClass("finish_time_error"); + if (!$(obj).hasClass("lunch_break_error")) { + $(obj).next('span').remove(); + } } var startTime = parseValToNumber($(obj).prev().val()); @@ -413,6 +416,7 @@ function validateLunchBreak(obj) { } $(obj).removeClass("red_border"); + $(obj).removeClass("lunch_break_error"); if (!$(otherObj).hasClass("red_border") && !$(spanObj).hasClass("finish_time_error")) { $(spanObj).next('span').remove(); } @@ -429,6 +433,7 @@ function validateLunchBreak(obj) { if ((time < globalStart) || (time > globalFinish)) { $(obj).addClass("red_border"); + $(obj).addClass("lunch_break_error"); if (!$(otherObj).hasClass("red_border") && !$(spanObj).hasClass("finish_time_error")) { insertSpanAfter(spanObj, "Lunch break must be within activity times"); } From 5c111085fb01d987e139bd42ff69526629b141fc Mon Sep 17 00:00:00 2001 From: gaazzopa Date: Thu, 26 Nov 2020 16:14:54 +0100 Subject: [PATCH 04/15] Acknowledge removal of lunch break --- cara/apps/calculator/static/js/form.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/cara/apps/calculator/static/js/form.js b/cara/apps/calculator/static/js/form.js index a48ae32d..0f68ac01 100644 --- a/cara/apps/calculator/static/js/form.js +++ b/cara/apps/calculator/static/js/form.js @@ -145,8 +145,9 @@ function require_lunch(option) { else { document.getElementById("lunch_start").value = ""; document.getElementById("lunch_finish").value = ""; - $("#lunch_finish").removeClass("red_border"); - $("#lunch_time_error").hide(); + $("#lunch_start").removeClass("red_border finish_time_error lunch_break_error"); + $("#lunch_finish").removeClass("red_border finish_time_error lunch_break_error"); + $(document.getElementById("lunch_finish")).next('span').remove(); } } @@ -379,8 +380,7 @@ function isValidDateOrEmpty(date) { function validateFinishTime(obj) { if ($(obj).hasClass("finish_time_error")) { - $(obj).removeClass("red_border"); - $(obj).removeClass("finish_time_error"); + $(obj).removeClass("red_border finish_time_error"); if (!$(obj).hasClass("lunch_break_error")) { $(obj).next('span').remove(); } @@ -389,8 +389,7 @@ function validateFinishTime(obj) { var startTime = parseValToNumber($(obj).prev().val()); var finishTime = parseValToNumber(obj.value); if (startTime > finishTime) { - $(obj).addClass("red_border"); - $(obj).addClass("finish_time_error"); + $(obj).addClass("red_border finish_time_error"); $(obj).next('span').remove(); insertSpanAfter(obj, "Finish time must be after start"); return false; @@ -415,8 +414,7 @@ function validateLunchBreak(obj) { otherObj = obj.previousSibling.previousSibling; } - $(obj).removeClass("red_border"); - $(obj).removeClass("lunch_break_error"); + $(obj).removeClass("red_border lunch_break_error"); if (!$(otherObj).hasClass("red_border") && !$(spanObj).hasClass("finish_time_error")) { $(spanObj).next('span').remove(); } @@ -432,8 +430,7 @@ function validateLunchBreak(obj) { var globalFinish = parseValToNumber(document.getElementById(finishID).value); if ((time < globalStart) || (time > globalFinish)) { - $(obj).addClass("red_border"); - $(obj).addClass("lunch_break_error"); + $(obj).addClass("red_border lunch_break_error"); if (!$(otherObj).hasClass("red_border") && !$(spanObj).hasClass("finish_time_error")) { insertSpanAfter(spanObj, "Lunch break must be within activity times"); } From 2a6a7143bb13e2289a8c8e4d56274eab9dbb7b9c Mon Sep 17 00:00:00 2001 From: gaazzopa Date: Fri, 27 Nov 2020 13:12:55 +0100 Subject: [PATCH 05/15] Added braces --- cara/apps/calculator/static/js/form.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/cara/apps/calculator/static/js/form.js b/cara/apps/calculator/static/js/form.js index 0f68ac01..ece53531 100644 --- a/cara/apps/calculator/static/js/form.js +++ b/cara/apps/calculator/static/js/form.js @@ -136,11 +136,13 @@ function require_lunch(option) { $("#lunch_finish").prop('required', option); if (option) { var start = document.getElementById("lunch_start"); - if (start.value === "") + if (start.value === "") { start.value = "12:30"; + } var finish = document.getElementById("lunch_finish"); - if (finish.value === "") + if (finish.value === "") { finish.value = "13:30"; + } } else { document.getElementById("lunch_start").value = ""; @@ -278,31 +280,35 @@ function validate_form(form) { //Validate all non zero values $("input[required].non_zero").each(function() { - if (!validateValue(this)) + if (!validateValue(this)) { submit = false; + } }); //Validate all dates if (submit) { $("input[required].datepicker").each(function() { - if (!validateDate(this)) + if (!validateDate(this)) { submit = false; + } }); } //Validate all times if (submit) { $("input[required].finish_time").each(function() { - if (!validateFinishTime(this)) + if (!validateFinishTime(this)) { submit = false; + } }); } //Validate all lunch breaks if (submit) { $("input[required].lunch").each(function() { - if (!validateLunchBreak(this)) + if (!validateLunchBreak(this)) { submit = false; + } }); } @@ -404,8 +410,9 @@ function validateLunchBreak(obj) { //Span element is only after finish time var spanObj = obj; - if ($(obj).hasClass("start_time")) + if ($(obj).hasClass("start_time")) { spanObj = obj.nextSibling.nextSibling; + } var time = parseValToNumber(obj.value); From fa60b44966808f5d3c79a9cf38d537f173e65da5 Mon Sep 17 00:00:00 2001 From: gaazzopa Date: Fri, 27 Nov 2020 16:50:01 +0100 Subject: [PATCH 06/15] Added data attributes for time windows --- cara/apps/calculator/static/js/form.js | 52 +++++++++---------- .../templates/calculator.form.html.j2 | 12 ++--- 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/cara/apps/calculator/static/js/form.js b/cara/apps/calculator/static/js/form.js index ece53531..38c533b4 100644 --- a/cara/apps/calculator/static/js/form.js +++ b/cara/apps/calculator/static/js/form.js @@ -385,15 +385,20 @@ function isValidDateOrEmpty(date) { } function validateFinishTime(obj) { - if ($(obj).hasClass("finish_time_error")) { - $(obj).removeClass("red_border finish_time_error"); - if (!$(obj).hasClass("lunch_break_error")) { - $(obj).next('span').remove(); + + var groupID = $(obj).data('time-group'); + var startObj = $(".start_time[data-time-group='"+groupID+"']")[0]; + var finishObj = $(".finish_time[data-time-group='"+groupID+"']")[0]; + + if ($(finishObj).hasClass("finish_time_error")) { + $(finishObj).removeClass("red_border finish_time_error"); + if (!$(finishObj).hasClass("lunch_break_error")) { + $(finishObj).next('span').remove(); } } - var startTime = parseValToNumber($(obj).prev().val()); - var finishTime = parseValToNumber(obj.value); + var startTime = parseValToNumber(startObj.value); + var finishTime = parseValToNumber(finishObj.value); if (startTime > finishTime) { $(obj).addClass("red_border finish_time_error"); $(obj).next('span').remove(); @@ -408,38 +413,31 @@ function validateFinishTime(obj) { function validateLunchBreak(obj) { - //Span element is only after finish time - var spanObj = obj; - if ($(obj).hasClass("start_time")) { - spanObj = obj.nextSibling.nextSibling; - } - + var groupID = $(obj).data('time-group'); + var startObj = $(".start_time[data-time-group='"+groupID+"']")[0]; + var finishObj = $(".finish_time[data-time-group='"+groupID+"']")[0]; var time = parseValToNumber(obj.value); - - var otherObj = spanObj; - if ($(obj).hasClass("finish_time")) { - otherObj = obj.previousSibling.previousSibling; + + var otherObj = startObj; + if ($(obj).hasClass("start_time")) { + otherObj = finishObj; } $(obj).removeClass("red_border lunch_break_error"); - if (!$(otherObj).hasClass("red_border") && !$(spanObj).hasClass("finish_time_error")) { - $(spanObj).next('span').remove(); + if (!$(otherObj).hasClass("red_border") && !$(finishObj).hasClass("finish_time_error")) { + $(finishObj).next('span').remove(); } - var startID = ""; - var finishID = ""; - if ($(obj).hasClass("activity")) { - startID = "activity_start"; - finishID = "activity_finish"; - } + var startID = groupID.split("_")[1] + "_start"; + var finishID = groupID.split("_")[1] + "_finish"; var globalStart = parseValToNumber(document.getElementById(startID).value); var globalFinish = parseValToNumber(document.getElementById(finishID).value); if ((time < globalStart) || (time > globalFinish)) { $(obj).addClass("red_border lunch_break_error"); - if (!$(otherObj).hasClass("red_border") && !$(spanObj).hasClass("finish_time_error")) { - insertSpanAfter(spanObj, "Lunch break must be within activity times"); + if (!$(otherObj).hasClass("red_border") && !$(finishObj).hasClass("finish_time_error")) { + insertSpanAfter(finishObj, "Lunch break must be within activity times"); } return false; } @@ -491,7 +489,7 @@ $(document).ready(function () { //Validate all finish times $("input[required].finish_time").each(function() {validateFinishTime(this)}); $(".finish_time").change(function() {validateFinishTime(this)}); - $(".start_time").change(function() {validateFinishTime(this.nextSibling.nextSibling)}); + $(".start_time").change(function() {validateFinishTime(this)}); //Validate lunch times $("input[required].lunch").each(function() {validateLunchBreak(this)}); diff --git a/cara/apps/calculator/templates/calculator.form.html.j2 b/cara/apps/calculator/templates/calculator.form.html.j2 index d5ad4e6d..5db0526d 100644 --- a/cara/apps/calculator/templates/calculator.form.html.j2 +++ b/cara/apps/calculator/templates/calculator.form.html.j2 @@ -134,11 +134,11 @@
- Start:    - Finish:
+ Start:    + Finish:
Infected person(s) presence:
- Start:    - Finish:
+ Start:    + Finish:

When is the event? @@ -178,8 +178,8 @@
- Start:    - Finish:
+ Start:    + Finish:
From 8ff4ff2878c7a716575b60fcc7a2ae65a73ad35c Mon Sep 17 00:00:00 2001 From: Andre Henriques Date: Mon, 30 Nov 2020 16:02:32 +0000 Subject: [PATCH 07/15] correct report: exposed/infected times --- cara/apps/calculator/templates/report.html.j2 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cara/apps/calculator/templates/report.html.j2 b/cara/apps/calculator/templates/report.html.j2 index 3701f2e2..bd388e93 100644 --- a/cara/apps/calculator/templates/report.html.j2 +++ b/cara/apps/calculator/templates/report.html.j2 @@ -90,10 +90,11 @@ Gym = For comparison only, all persons doing heavy physical exercise, breathing and not talking. {% endif %}

+
  • Presence of exposed occupant(s):

    • Start time: {{ form.activity_start | minutes_to_time }}    End time: {{ form.activity_finish | minutes_to_time }}

    -
  • Exposure time (presence of infected person):

  • +
  • Presence of infected occupant(s):

    • Start time: {{ form.infected_start | minutes_to_time }}    End time: {{ form.infected_finish | minutes_to_time }}

    From 8006f58166ee3cffce55a8a412ee1bcd2dea1279 Mon Sep 17 00:00:00 2001 From: gaazzopa Date: Mon, 30 Nov 2020 17:39:41 +0100 Subject: [PATCH 08/15] Added comment --- cara/apps/calculator/static/js/form.js | 1 + 1 file changed, 1 insertion(+) diff --git a/cara/apps/calculator/static/js/form.js b/cara/apps/calculator/static/js/form.js index 38c533b4..cddbde05 100644 --- a/cara/apps/calculator/static/js/form.js +++ b/cara/apps/calculator/static/js/form.js @@ -428,6 +428,7 @@ function validateLunchBreak(obj) { $(finishObj).next('span').remove(); } + //Check if lunch times within presence times var startID = groupID.split("_")[1] + "_start"; var finishID = groupID.split("_")[1] + "_finish"; From 4a2fc49f106b659ad40f0bec666add07ee3d18e6 Mon Sep 17 00:00:00 2001 From: Gaby Azzopardi Date: Tue, 1 Dec 2020 09:56:47 +0100 Subject: [PATCH 09/15] Fixed error display --- cara/apps/calculator/static/js/form.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cara/apps/calculator/static/js/form.js b/cara/apps/calculator/static/js/form.js index cddbde05..c512c380 100644 --- a/cara/apps/calculator/static/js/form.js +++ b/cara/apps/calculator/static/js/form.js @@ -400,9 +400,9 @@ function validateFinishTime(obj) { var startTime = parseValToNumber(startObj.value); var finishTime = parseValToNumber(finishObj.value); if (startTime > finishTime) { - $(obj).addClass("red_border finish_time_error"); - $(obj).next('span').remove(); - insertSpanAfter(obj, "Finish time must be after start"); + $(finishObj).addClass("red_border finish_time_error"); + $(finishObj).next('span').remove(); + insertSpanAfter(finishObj, "Finish time must be after start"); return false; } else { From a1c61640148eae79bd2556cb2fb9d735516d2028 Mon Sep 17 00:00:00 2001 From: gaazzopa Date: Tue, 1 Dec 2020 11:44:09 +0100 Subject: [PATCH 10/15] Added comments --- cara/apps/calculator/static/js/form.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cara/apps/calculator/static/js/form.js b/cara/apps/calculator/static/js/form.js index cddbde05..b6233204 100644 --- a/cara/apps/calculator/static/js/form.js +++ b/cara/apps/calculator/static/js/form.js @@ -399,12 +399,14 @@ function validateFinishTime(obj) { var startTime = parseValToNumber(startObj.value); var finishTime = parseValToNumber(finishObj.value); + //Check if finish time error (takes presedence over lunch break error) if (startTime > finishTime) { $(obj).addClass("red_border finish_time_error"); $(obj).next('span').remove(); insertSpanAfter(obj, "Finish time must be after start"); return false; } + //If no finish time error -> Display any lunch break error else { $("input[required].lunch").each(function() {validateLunchBreak(this)}); } @@ -428,7 +430,7 @@ function validateLunchBreak(obj) { $(finishObj).next('span').remove(); } - //Check if lunch times within presence times + //Check if exposed/infected lunch times within exposed/infected presence times var startID = groupID.split("_")[1] + "_start"; var finishID = groupID.split("_")[1] + "_finish"; From 7a6f4701e217c5b1c90bc7a8b2ede061ae242f71 Mon Sep 17 00:00:00 2001 From: gaazzopa Date: Wed, 2 Dec 2020 11:42:50 +0100 Subject: [PATCH 11/15] Validate lunch break on activity time change --- cara/apps/calculator/static/js/form.js | 21 ++++++++++++------- .../templates/calculator.form.html.j2 | 8 +++---- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/cara/apps/calculator/static/js/form.js b/cara/apps/calculator/static/js/form.js index b48bc8cd..72d80711 100644 --- a/cara/apps/calculator/static/js/form.js +++ b/cara/apps/calculator/static/js/form.js @@ -431,13 +431,11 @@ function validateLunchBreak(obj) { } //Check if exposed/infected lunch times within exposed/infected presence times - var startID = groupID.split("_")[1] + "_start"; - var finishID = groupID.split("_")[1] + "_finish"; - - var globalStart = parseValToNumber(document.getElementById(startID).value); - var globalFinish = parseValToNumber(document.getElementById(finishID).value); + var activityID = $(obj).data('lunch-for'); + var activityStart = parseValToNumber($(".start_time[data-time-group='"+activityID+"']")[0].value); + var activityFinish = parseValToNumber($(".finish_time[data-time-group='"+activityID+"']")[0].value); - if ((time < globalStart) || (time > globalFinish)) { + if ((time < activityStart) || (time > activityFinish)) { $(obj).addClass("red_border lunch_break_error"); if (!$(otherObj).hasClass("red_border") && !$(finishObj).hasClass("finish_time_error")) { insertSpanAfter(finishObj, "Lunch break must be within activity times"); @@ -495,8 +493,15 @@ $(document).ready(function () { $(".start_time").change(function() {validateFinishTime(this)}); //Validate lunch times - $("input[required].lunch").each(function() {validateLunchBreak(this)}); - $("input[required].lunch").change(function() {validateLunchBreak(this)}); + $("[data-lunch-for]").each(function() {validateLunchBreak(this)}); + $("[data-lunch-for]").change(function() {validateLunchBreak(this)}); + $("[data-lunch-break]").change(function() { + var lunchGroup = $(this).data('lunch-break'); + var lunchStart = $(".start_time[data-time-group='"+lunchGroup+"']")[0]; + var lunchFinish = $(".finish_time[data-time-group='"+lunchGroup+"']")[0]; + validateLunchBreak(lunchStart) + validateLunchBreak(lunchFinish) + }); var radioValue = $("input[name='event_type']:checked"); if (radioValue.val()) { diff --git a/cara/apps/calculator/templates/calculator.form.html.j2 b/cara/apps/calculator/templates/calculator.form.html.j2 index 5db0526d..4691274f 100644 --- a/cara/apps/calculator/templates/calculator.form.html.j2 +++ b/cara/apps/calculator/templates/calculator.form.html.j2 @@ -134,8 +134,8 @@
    - Start:    - Finish:
    + Start:    + Finish:
    Infected person(s) presence:
    Start:    Finish:
    @@ -178,8 +178,8 @@
    - Start:    - Finish:
    + Start:    + Finish:
    From 5282266bce80cebc771d68046c67efa1af3c55e2 Mon Sep 17 00:00:00 2001 From: gaazzopa Date: Wed, 2 Dec 2020 21:18:03 +0100 Subject: [PATCH 12/15] Restructured lunch time validation --- cara/apps/calculator/static/js/form.js | 83 +++++++++---------- .../templates/calculator.form.html.j2 | 4 +- 2 files changed, 40 insertions(+), 47 deletions(-) diff --git a/cara/apps/calculator/static/js/form.js b/cara/apps/calculator/static/js/form.js index 72d80711..41bd3ad8 100644 --- a/cara/apps/calculator/static/js/form.js +++ b/cara/apps/calculator/static/js/form.js @@ -4,13 +4,17 @@ function getChildElement(elem) { return $("#" + elem.data("enables")); } -function insertSpanAfter(referenceNode, text) { +function insertErrorSpanAfter(referenceNode, text) { var element = document.createElement("span"); + element.setAttribute("id", "error_text"); element.classList.add("red_text"); element.innerHTML = "  " + text; referenceNode.parentNode.insertBefore(element, referenceNode.nextSibling); } +function removeErrorSpanAfter(referenceNode) { +} + /* -------Required fields------- */ function require_fields(obj) { switch ($(obj).attr('id')) { @@ -333,7 +337,7 @@ function validate_form(form) { var activity_mins = parseTimeToMins(activity_finish.value) - parseTimeToMins(activity_start.value); if ((lunch_mins + coffee_mins) >= activity_mins) { - insertSpanAfter(button, "Length of breaks >= Length of activity"); + insertErrorSpanAfter(button, "Length of breaks >= Length of activity"); submit = false; } } @@ -347,7 +351,7 @@ function validateValue(obj) { if (!isNonZeroOrEmpty($(obj).val())) { $(obj).addClass("red_border"); - insertSpanAfter(obj, "Value must be > 0"); + insertErrorSpanAfter(obj, "Value must be > 0"); return false; } return true; @@ -366,7 +370,7 @@ function validateDate(obj) { if (!isValidDateOrEmpty($(obj).val())) { $(obj).addClass("red_border"); - insertSpanAfter(obj, "Incorrect date format"); + insertErrorSpanAfter(obj, "Incorrect date format"); return false; } return true; @@ -392,54 +396,49 @@ function validateFinishTime(obj) { if ($(finishObj).hasClass("finish_time_error")) { $(finishObj).removeClass("red_border finish_time_error"); - if (!$(finishObj).hasClass("lunch_break_error")) { - $(finishObj).next('span').remove(); - } + $(finishObj).next('span').remove(); } + //Check if finish time error (takes precedence over lunch break error) var startTime = parseValToNumber(startObj.value); var finishTime = parseValToNumber(finishObj.value); - //Check if finish time error (takes presedence over lunch break error) - if (startTime > finishTime) { + if (startTime >= finishTime) { $(finishObj).addClass("red_border finish_time_error"); $(finishObj).next('span').remove(); - insertSpanAfter(finishObj, "Finish time must be after start"); + insertErrorSpanAfter(finishObj, "Finish time must be after start"); return false; } - //If no finish time error -> Display any lunch break error - else { - $("input[required].lunch").each(function() {validateLunchBreak(this)}); - } return true; } -function validateLunchBreak(obj) { +function validateLunchBreak(lunchGroup) { + var lunchStartObj = $(".start_time[data-time-group='"+lunchGroup+"']")[0]; + var lunchFinishObj = $(".finish_time[data-time-group='"+lunchGroup+"']")[0]; + + //Skip if finish time error present (it takes precedence over lunch break error) + if ($(lunchStartObj).hasClass("finish_time_error") || $(lunchFinishObj).hasClass("finish_time_error")) + return true; + + $(lunchFinishObj).next('span').remove(); + var valid = validateLunchTime(lunchStartObj) & validateLunchTime(lunchFinishObj); + if (!valid) { + insertErrorSpanAfter(lunchFinishObj, "Lunch break must be within activity times"); + } + + return valid; +} + +//Check if exposed/infected lunch time within exposed/infected presence times +function validateLunchTime(obj) { + + var activityGroup = $(obj).data('lunch-for'); + var activityStart = parseValToNumber($(".start_time[data-time-group='"+activityGroup+"']")[0].value); + var activityFinish = parseValToNumber($(".finish_time[data-time-group='"+activityGroup+"']")[0].value); - var groupID = $(obj).data('time-group'); - var startObj = $(".start_time[data-time-group='"+groupID+"']")[0]; - var finishObj = $(".finish_time[data-time-group='"+groupID+"']")[0]; var time = parseValToNumber(obj.value); - - var otherObj = startObj; - if ($(obj).hasClass("start_time")) { - otherObj = finishObj; - } - $(obj).removeClass("red_border lunch_break_error"); - if (!$(otherObj).hasClass("red_border") && !$(finishObj).hasClass("finish_time_error")) { - $(finishObj).next('span').remove(); - } - - //Check if exposed/infected lunch times within exposed/infected presence times - var activityID = $(obj).data('lunch-for'); - var activityStart = parseValToNumber($(".start_time[data-time-group='"+activityID+"']")[0].value); - var activityFinish = parseValToNumber($(".finish_time[data-time-group='"+activityID+"']")[0].value); - if ((time < activityStart) || (time > activityFinish)) { $(obj).addClass("red_border lunch_break_error"); - if (!$(otherObj).hasClass("red_border") && !$(finishObj).hasClass("finish_time_error")) { - insertSpanAfter(finishObj, "Lunch break must be within activity times"); - } return false; } @@ -493,15 +492,9 @@ $(document).ready(function () { $(".start_time").change(function() {validateFinishTime(this)}); //Validate lunch times - $("[data-lunch-for]").each(function() {validateLunchBreak(this)}); - $("[data-lunch-for]").change(function() {validateLunchBreak(this)}); - $("[data-lunch-break]").change(function() { - var lunchGroup = $(this).data('lunch-break'); - var lunchStart = $(".start_time[data-time-group='"+lunchGroup+"']")[0]; - var lunchFinish = $(".finish_time[data-time-group='"+lunchGroup+"']")[0]; - validateLunchBreak(lunchStart) - validateLunchBreak(lunchFinish) - }); + $(".start_time[data-lunch-for]").each(function() {validateLunchBreak($(this).data('time-group'))}); + $("[data-lunch-for]").change(function() {validateLunchBreak($(this).data('time-group'))}); + $("[data-lunch-break]").change(function() {validateLunchBreak($(this).data('lunch-break'))}); var radioValue = $("input[name='event_type']:checked"); if (radioValue.val()) { diff --git a/cara/apps/calculator/templates/calculator.form.html.j2 b/cara/apps/calculator/templates/calculator.form.html.j2 index 4691274f..450bbb3e 100644 --- a/cara/apps/calculator/templates/calculator.form.html.j2 +++ b/cara/apps/calculator/templates/calculator.form.html.j2 @@ -137,8 +137,8 @@ Start:    Finish:
    Infected person(s) presence:
    - Start:    - Finish:
    + Start:    + Finish:

    When is the event? From 485aa3a3b05718b4fd5b52a340769f85be2ab563 Mon Sep 17 00:00:00 2001 From: gaazzopa Date: Wed, 2 Dec 2020 21:46:19 +0100 Subject: [PATCH 13/15] Added ID to error span --- cara/apps/calculator/static/js/form.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/cara/apps/calculator/static/js/form.js b/cara/apps/calculator/static/js/form.js index 41bd3ad8..cb7c6ab7 100644 --- a/cara/apps/calculator/static/js/form.js +++ b/cara/apps/calculator/static/js/form.js @@ -13,6 +13,7 @@ function insertErrorSpanAfter(referenceNode, text) { } function removeErrorSpanAfter(referenceNode) { + $(referenceNode).next('span#error_text').remove(); } /* -------Required fields------- */ @@ -153,7 +154,7 @@ function require_lunch(option) { document.getElementById("lunch_finish").value = ""; $("#lunch_start").removeClass("red_border finish_time_error lunch_break_error"); $("#lunch_finish").removeClass("red_border finish_time_error lunch_break_error"); - $(document.getElementById("lunch_finish")).next('span').remove(); + removeErrorSpanAfter($("#lunch_finish")[0]); } } @@ -197,7 +198,7 @@ function removeInvalid(id) { if ($(id).hasClass("red_border")) { $(id).val(""); $(id).removeClass("red_border"); - $(id).next('span').remove(); + removeErrorSpanAfter(id); } } @@ -318,8 +319,7 @@ function validate_form(form) { //Check if breaks length >= activity length if (submit) { - var button = document.getElementById("activity_breaks"); - $(button).next('span').remove(); + removeErrorSpanAfter($("#activity_breaks")[0]); var lunch_mins = 0; if (document.getElementById('lunch_option_yes').checked) { @@ -337,7 +337,7 @@ function validate_form(form) { var activity_mins = parseTimeToMins(activity_finish.value) - parseTimeToMins(activity_start.value); if ((lunch_mins + coffee_mins) >= activity_mins) { - insertErrorSpanAfter(button, "Length of breaks >= Length of activity"); + insertErrorSpanAfter($("#activity_breaks")[0], "Length of breaks >= Length of activity"); submit = false; } } @@ -347,7 +347,7 @@ function validate_form(form) { function validateValue(obj) { $(obj).removeClass("red_border"); - $(obj).next('span').remove(); + removeErrorSpanAfter(obj); if (!isNonZeroOrEmpty($(obj).val())) { $(obj).addClass("red_border"); @@ -366,7 +366,7 @@ function isNonZeroOrEmpty(value) { function validateDate(obj) { $(obj).removeClass("red_border"); - $(obj).next('span').remove(); + removeErrorSpanAfter(obj); if (!isValidDateOrEmpty($(obj).val())) { $(obj).addClass("red_border"); @@ -396,7 +396,7 @@ function validateFinishTime(obj) { if ($(finishObj).hasClass("finish_time_error")) { $(finishObj).removeClass("red_border finish_time_error"); - $(finishObj).next('span').remove(); + removeErrorSpanAfter(finishObj); } //Check if finish time error (takes precedence over lunch break error) @@ -404,7 +404,7 @@ function validateFinishTime(obj) { var finishTime = parseValToNumber(finishObj.value); if (startTime >= finishTime) { $(finishObj).addClass("red_border finish_time_error"); - $(finishObj).next('span').remove(); + removeErrorSpanAfter(finishObj); insertErrorSpanAfter(finishObj, "Finish time must be after start"); return false; } @@ -419,7 +419,7 @@ function validateLunchBreak(lunchGroup) { if ($(lunchStartObj).hasClass("finish_time_error") || $(lunchFinishObj).hasClass("finish_time_error")) return true; - $(lunchFinishObj).next('span').remove(); + removeErrorSpanAfter(lunchFinishObj); var valid = validateLunchTime(lunchStartObj) & validateLunchTime(lunchFinishObj); if (!valid) { insertErrorSpanAfter(lunchFinishObj, "Lunch break must be within activity times"); From f55dffee60dbee7b66311e6dfb397ce0d5984e2b Mon Sep 17 00:00:00 2001 From: gaazzopa Date: Wed, 2 Dec 2020 21:55:21 +0100 Subject: [PATCH 14/15] Make obj argument consistent --- cara/apps/calculator/static/js/form.js | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/cara/apps/calculator/static/js/form.js b/cara/apps/calculator/static/js/form.js index cb7c6ab7..d5e5d129 100644 --- a/cara/apps/calculator/static/js/form.js +++ b/cara/apps/calculator/static/js/form.js @@ -139,22 +139,23 @@ function require_recurrent_event(option) { function require_lunch(option) { $("#lunch_start").prop('required', option); $("#lunch_finish").prop('required', option); + + var lunchStartObj = document.getElementById("lunch_start"); + var lunchFinishObj = document.getElementById("lunch_finish"); if (option) { - var start = document.getElementById("lunch_start"); - if (start.value === "") { - start.value = "12:30"; + if (lunchStartObj.value === "") { + lunchStartObj.value = "12:30"; } - var finish = document.getElementById("lunch_finish"); - if (finish.value === "") { - finish.value = "13:30"; + if (lunchFinishObj.value === "") { + lunchFinishObj.value = "13:30"; } } else { - document.getElementById("lunch_start").value = ""; - document.getElementById("lunch_finish").value = ""; - $("#lunch_start").removeClass("red_border finish_time_error lunch_break_error"); + lunchStartObj.value = ""; + lunchFinishObj.value = ""; $("#lunch_finish").removeClass("red_border finish_time_error lunch_break_error"); - removeErrorSpanAfter($("#lunch_finish")[0]); + $("#lunch_finish").removeClass("red_border finish_time_error lunch_break_error"); + removeErrorSpanAfter(lunchFinishObj); } } @@ -319,7 +320,8 @@ function validate_form(form) { //Check if breaks length >= activity length if (submit) { - removeErrorSpanAfter($("#activity_breaks")[0]); + var activityBreaksObj= document.getElementById("activity_breaks"); + removeErrorSpanAfter(activityBreaksObj); var lunch_mins = 0; if (document.getElementById('lunch_option_yes').checked) { @@ -337,7 +339,7 @@ function validate_form(form) { var activity_mins = parseTimeToMins(activity_finish.value) - parseTimeToMins(activity_start.value); if ((lunch_mins + coffee_mins) >= activity_mins) { - insertErrorSpanAfter($("#activity_breaks")[0], "Length of breaks >= Length of activity"); + insertErrorSpanAfter(activityBreaksObj, "Length of breaks >= Length of activity"); submit = false; } } From a3054a2d17c8cc0810246376b92066835bdf4fc9 Mon Sep 17 00:00:00 2001 From: gaazzopa Date: Thu, 3 Dec 2020 09:38:21 +0100 Subject: [PATCH 15/15] Renaming and minor updating of code elements --- cara/apps/calculator/static/js/form.js | 36 +++++++++++++------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/cara/apps/calculator/static/js/form.js b/cara/apps/calculator/static/js/form.js index d5e5d129..6203a677 100644 --- a/cara/apps/calculator/static/js/form.js +++ b/cara/apps/calculator/static/js/form.js @@ -4,16 +4,16 @@ function getChildElement(elem) { return $("#" + elem.data("enables")); } -function insertErrorSpanAfter(referenceNode, text) { +function insertErrorFor(referenceNode, text) { var element = document.createElement("span"); - element.setAttribute("id", "error_text"); + element.setAttribute("class", "error_text"); element.classList.add("red_text"); element.innerHTML = "  " + text; referenceNode.parentNode.insertBefore(element, referenceNode.nextSibling); } -function removeErrorSpanAfter(referenceNode) { - $(referenceNode).next('span#error_text').remove(); +function removeErrorFor(referenceNode) { + $(referenceNode).next('span.error_text').remove(); } /* -------Required fields------- */ @@ -155,7 +155,7 @@ function require_lunch(option) { lunchFinishObj.value = ""; $("#lunch_finish").removeClass("red_border finish_time_error lunch_break_error"); $("#lunch_finish").removeClass("red_border finish_time_error lunch_break_error"); - removeErrorSpanAfter(lunchFinishObj); + removeErrorFor(lunchFinishObj); } } @@ -199,7 +199,7 @@ function removeInvalid(id) { if ($(id).hasClass("red_border")) { $(id).val(""); $(id).removeClass("red_border"); - removeErrorSpanAfter(id); + removeErrorFor(id); } } @@ -321,7 +321,7 @@ function validate_form(form) { //Check if breaks length >= activity length if (submit) { var activityBreaksObj= document.getElementById("activity_breaks"); - removeErrorSpanAfter(activityBreaksObj); + removeErrorFor(activityBreaksObj); var lunch_mins = 0; if (document.getElementById('lunch_option_yes').checked) { @@ -339,7 +339,7 @@ function validate_form(form) { var activity_mins = parseTimeToMins(activity_finish.value) - parseTimeToMins(activity_start.value); if ((lunch_mins + coffee_mins) >= activity_mins) { - insertErrorSpanAfter(activityBreaksObj, "Length of breaks >= Length of activity"); + insertErrorFor(activityBreaksObj, "Length of breaks >= Length of activity"); submit = false; } } @@ -349,11 +349,11 @@ function validate_form(form) { function validateValue(obj) { $(obj).removeClass("red_border"); - removeErrorSpanAfter(obj); + removeErrorFor(obj); if (!isNonZeroOrEmpty($(obj).val())) { $(obj).addClass("red_border"); - insertErrorSpanAfter(obj, "Value must be > 0"); + insertErrorFor(obj, "Value must be > 0"); return false; } return true; @@ -368,11 +368,11 @@ function isNonZeroOrEmpty(value) { function validateDate(obj) { $(obj).removeClass("red_border"); - removeErrorSpanAfter(obj); + removeErrorFor(obj); if (!isValidDateOrEmpty($(obj).val())) { $(obj).addClass("red_border"); - insertErrorSpanAfter(obj, "Incorrect date format"); + insertErrorFor(obj, "Incorrect date format"); return false; } return true; @@ -398,7 +398,7 @@ function validateFinishTime(obj) { if ($(finishObj).hasClass("finish_time_error")) { $(finishObj).removeClass("red_border finish_time_error"); - removeErrorSpanAfter(finishObj); + removeErrorFor(finishObj); } //Check if finish time error (takes precedence over lunch break error) @@ -406,8 +406,8 @@ function validateFinishTime(obj) { var finishTime = parseValToNumber(finishObj.value); if (startTime >= finishTime) { $(finishObj).addClass("red_border finish_time_error"); - removeErrorSpanAfter(finishObj); - insertErrorSpanAfter(finishObj, "Finish time must be after start"); + removeErrorFor(finishObj); + insertErrorFor(finishObj, "Finish time must be after start"); return false; } return true; @@ -419,12 +419,12 @@ function validateLunchBreak(lunchGroup) { //Skip if finish time error present (it takes precedence over lunch break error) if ($(lunchStartObj).hasClass("finish_time_error") || $(lunchFinishObj).hasClass("finish_time_error")) - return true; + return false; - removeErrorSpanAfter(lunchFinishObj); + removeErrorFor(lunchFinishObj); var valid = validateLunchTime(lunchStartObj) & validateLunchTime(lunchFinishObj); if (!valid) { - insertErrorSpanAfter(lunchFinishObj, "Lunch break must be within activity times"); + insertErrorFor(lunchFinishObj, "Lunch break must be within activity times"); } return valid;