diff --git a/WNPRC_EHR/resources/queries/study/WaterScheduleWithWeight.sql b/WNPRC_EHR/resources/queries/study/WaterScheduleWithWeight.sql index 44e7abf98..3107a1a86 100644 --- a/WNPRC_EHR/resources/queries/study/WaterScheduleWithWeight.sql +++ b/WNPRC_EHR/resources/queries/study/WaterScheduleWithWeight.sql @@ -20,6 +20,7 @@ SELECT frequencyMeaning AS frequencyMeaningCoalesced, timeofday AS timeofday, displaytimeofday AS displaytimeofday, + actionRequired AS actionRequired, qcstate AS qcstate, --(SELECT max(wg.qcstate) as label FROM study.waterGiven wg WHERE WCO.objectid = wg.treatmentid AND WCO.dateOrdered = wg.dateordered ) AS waterStatus, diff --git a/WNPRC_EHR/resources/queries/study/WaterScheduleWithWeight/.qview.xml b/WNPRC_EHR/resources/queries/study/WaterScheduleWithWeight/.qview.xml index 94d6b88d0..22cd5484f 100644 --- a/WNPRC_EHR/resources/queries/study/WaterScheduleWithWeight/.qview.xml +++ b/WNPRC_EHR/resources/queries/study/WaterScheduleWithWeight/.qview.xml @@ -20,6 +20,7 @@ + diff --git a/WNPRC_EHR/resources/queries/study/deaths.js b/WNPRC_EHR/resources/queries/study/deaths.js index a8ca9fa94..d5b85a5aa 100644 --- a/WNPRC_EHR/resources/queries/study/deaths.js +++ b/WNPRC_EHR/resources/queries/study/deaths.js @@ -16,8 +16,35 @@ function onComplete(event, errors, helper) { var ids = helper.getRows().map(function (row) { return row.row.id; }); + var animalDateMap= []; + let clientRows = helper.getRows(); + + console.log("number of rows "+ clientRows.length); + if (clientRows){ + + for (var i= 0; i < clientRows.length; i++){ + console.log("animalId "+clientRows[i].row.id); + + animalDateMap.push({ + animalId: clientRows[i].row.id, + endDate : clientRows[i].row.date + }); + + } + + } + /*console.log("array line 37 " + Object.values(animalDateMap).length); + + for (var i = 0; i < animalDateMap.length; i++){ + console.log("array value " + animalDateMap[i]); + }*/ + + WNPRC.Utils.getJavaHelper().removeWaterAmounts(animalDateMap); //Sends notification. var hostName = 'https://' + LABKEY.serverName; WNPRC.Utils.getJavaHelper().sendDeathNotification(ids, hostName); + + + } \ No newline at end of file diff --git a/WNPRC_EHR/resources/queries/study/waterGiven.js b/WNPRC_EHR/resources/queries/study/waterGiven.js index e72858ff3..d623ac973 100644 --- a/WNPRC_EHR/resources/queries/study/waterGiven.js +++ b/WNPRC_EHR/resources/queries/study/waterGiven.js @@ -85,36 +85,19 @@ function onInit(event, helper){ } function onUpsert(helper, scriptErrors, row, oldRow) { - /*if (row.volume == null){ - EHR.Server.Utils.addError(scriptErrors, 'volume', 'This field is required', 'WARN'); - console.log ("value of QCState "+ row.QCState) - }*/ - if (row.QCStateLabel == 'Scheduled'){ EHR.Server.Validation.verifyDate(row, scriptErrors, helper); } if (row.Id && row.date) { - // volume is handled differently for requestsvs actual draws var errorQC = 'ERROR'; - //if (EHR.Server.Security.getQCStateByLabel(row.QCStateLabel)['isRequest'] && !row.taskid) - // errorQC = 'ERROR'; - //else - // errorQC = 'INFO'; var map = helper.getProperty('waterInTransaction'); var waters = []; if (map && map[row.Id]) { waters = map[row.Id]; - /*for (var i=0;ihusbandry_fruit value - - - Water Source @@ -59,6 +56,9 @@ value title + + + Water Location diff --git a/WNPRC_EHR/resources/queries/study/waterOrders.js b/WNPRC_EHR/resources/queries/study/waterOrders.js index 53760c8fd..9d037b697 100644 --- a/WNPRC_EHR/resources/queries/study/waterOrders.js +++ b/WNPRC_EHR/resources/queries/study/waterOrders.js @@ -7,7 +7,8 @@ let allowUsersMap = {}; function onInit(event, helper){ helper.setScriptOptions({ allowFutureDates: true, - allowDatesInDistantPast: true + allowDatesInDistantPast: true, + skipWaterRegulationCheck: false }); LABKEY.Query.selectRows({ requiredVersion: 9.1, @@ -35,9 +36,40 @@ function onInit(event, helper){ }); } +function onInsert(helper, scriptErrors, row){ + if (row.frequency !== 4 && row.waterSource === 'lixit'){ + EHR.Server.Utils.addError(scriptErrors,"frequency", "Frequency should be 'Daily - Any Time' when selecting Lixit/Ad Lib", "ERROR"); + } -function onUpsert(helper, scriptErrors, row, oldRow){ + if (row.id && row.waterSource === 'regulated' && row.frequency && row.assignedTo && row.provideFruit && row.date){ + let lixitOrderMap = WNPRC.Utils.getJavaHelper().checkWaterLixit(row.id, row.date); + let lixitStartDate; + let lixitOrderObjectid; + let latestWaterSource; + + if (lixitOrderMap != null){ + lixitStartDate = new Date(lixitOrderMap.date); + lixitOrderObjectid = lixitOrderMap.objectid; + latestWaterSource = lixitOrderMap.waterSource; + + if(latestWaterSource === "lixit" ) { + let lixitEndDate = new Date(row.date); + console.log(lixitEndDate) + lixitEndDate.setDate(lixitEndDate.getDate()-1); + console.log("startdate " + lixitStartDate + " objectid " + lixitOrderObjectid + "enddate " + lixitEndDate + " watersource " +row.waterSource); + let jsonArray = WNPRC.Utils.getJavaHelper().closeWaterOrder(row.id, lixitStartDate, lixitEndDate, row.project, lixitOrderObjectid, true); + if (jsonArray != null) { + for (var i = 0; i < jsonArray.length; i++) { + var errorObject = jsonArray[i]; + EHR.Server.Utils.addError(scriptErrors, errorObject.field, errorObject.message, errorObject.severity); + } + } + } + } + } +} +function onUpsert(helper, scriptErrors, row, oldRow){ if (row.Id){ EHR.Server.Utils.findDemographics({ participant: row.Id, @@ -54,13 +86,9 @@ function onUpsert(helper, scriptErrors, row, oldRow){ }); var animalRestricted = {}; animalRestricted = WNPRC.Utils.getJavaHelper().checkIfAnimalInCondition(row.Id, row.date); - //console.log (animalRestricted); if (!animalRestricted && !row.skipWaterRegulationCheck){ EHR.Server.Utils.addError(scriptErrors,'Id', 'Animal not assigned to water restriction protocol or is already in ' + row.waterSource + ' condition.', 'ERROR'); } - - - } @@ -84,27 +112,31 @@ function onUpsert(helper, scriptErrors, row, oldRow){ if (rowDate.getTime() > endDate.getTime()){ EHR.Server.Utils.addError(scriptErrors,'endDate', 'EndDate cannot be before StartDate', 'ERROR'); } - - if (!row.frequency && row.waterSource == 'regulated'){ + if (!row.frequency && row.waterSource === 'regulated'){ EHR.Server.Utils.addError(scriptErrors, 'frequency', 'Frequency is required when entering regulated water orders.', 'ERROR'); } - if (!row.volume && row.waterSource == 'regulated'){ + if (!row.volume && row.waterSource === 'regulated'){ //console.log ("water vol "+ row.volume); EHR.Server.Utils.addError(scriptErrors, 'volume', 'Volume is required when entering regulated water orders.', 'ERROR'); } - - if (!row.assignedTo && row.waterSource == 'regulated'){ + if (!row.assignedTo && row.waterSource === 'regulated'){ EHR.Server.Utils.addError(scriptErrors, 'assignedTo', 'Assigned To is required when entering regulated water orders.', 'ERROR'); } - + if (!row.provideFruit && row.waterSource === 'regulated'){ + EHR.Server.Utils.addError(scriptErrors, 'provideFruit', 'Provide Fruit is required when entering regulated water orders.', 'INFO'); + } if (!row.waterSource){ EHR.Server.Utils.addError(scriptErrors, 'waterSource', 'Water Source is required when entering new orders.', 'ERROR'); } + if (row.volume !== undefined && row.volume!== null && row.waterSource === 'lixit'){ + EHR.Server.Utils.addError(scriptErrors,"volume", "Volume should be blank when selecting Lixit/Ad Lib for Water Source", "ERROR"); + } + if (row.frequency !== 4 && row.waterSource === 'lixit'){ + EHR.Server.Utils.addError(scriptErrors,"frequency", "Frequency should be 'Daily - Any Time' when selecting Lixit/Ad Lib", "ERROR"); + } + - //console.log ("value of ObjectId "+oldRow.objectid + " Value of new objectId "+ row.objectid); - //console.log ('skipWaterRegulation '+ row.skipWaterRegulationCheck); - // if (oldRow && row.date && row.Id && row.frequency && (oldRow.objectid != row.objectid)) { - if (row.project && row.objectid && row.Id && row.date && row.frequency && row.assignedTo && row.waterSource != 'lixit' && !row.skipWaterRegulationCheck) { + if (row.project && row.objectid && row.Id && row.date && row.frequency && row.assignedTo && row.waterSource !== 'lixit' && !row.skipWaterRegulationCheck && !row.closingRecord ) { let jsonArray = WNPRC.Utils.getJavaHelper().checkWaterRegulation(row.id, row.date, row.enddate ? row.enddate : null, row.frequency, row.waterSource, row.objectid, row.project, this.extraContext); if (jsonArray != null) { for (var i = 0; i < jsonArray.length; i++) { @@ -115,35 +147,19 @@ function onUpsert(helper, scriptErrors, row, oldRow){ row.date = rowDate; } - //if (oldRow && oldRow.waterSource == 'regulated' && row.waterSource == 'lixit'){ - //TODO: by pass water regulation to change water order to lixit and also chnage the water regulated animals data - if ( row.waterSource == 'lixit' && !row.skipWaterRegulationCheck && !oldRow){ - - let jsonArray = WNPRC.Utils.getJavaHelper().changeWaterScheduled(row.id,row.date,row.waterSource, row.project, row.objectid,this.extraContext); - let jsonExtraContext = this.extraContext.extraContextArray; - - if (jsonArray != null){ - for (var i=0; i < jsonArray.length; i++){ - let errorObject = JSON.parse(jsonArray[i]); - EHR.Server.Utils.addError(scriptErrors,errorObject.field, errorObject.message, errorObject.severity); - - } - if (jsonExtraContext != null){ - for (var i = 0; i < jsonExtraContext.length; i++){ - let extraContextObject = jsonExtraContext[i]; - let date = extraContextObject.date; - let dateOnly = new Date(date.getTime()); - dateOnly = dateOnly.getFullYear()+ "-" +dateOnly.getMonth()+ "-" + dateOnly.getDate(); - let infoMessage = "Water Order for "+ row.Id + " started on " + dateOnly + " with frequency of " + extraContextObject.frequency + " and volume of " + extraContextObject.volume + "ml will close."; - EHR.Server.Utils.addError(scriptErrors,"waterSource",infoMessage,"INFO") - - } - + if (row.Id && row.date && row.enddate && row.project && row.objectid && row.closingRecord){ + let jsonArray = WNPRC.Utils.getJavaHelper().closeWaterOrder(row.id, row.date, row.enddate, row.project, row.objectid, row.closingRecord); + if (jsonArray != null) { + for (var i = 0; i < jsonArray.length; i++) { + var errorObject = jsonArray[i]; + EHR.Server.Utils.addError(scriptErrors, errorObject.field, errorObject.message, errorObject.severity); } - } } + if ( row.waterSource === 'lixit' && row.volume === undefined && row.project && row.assignedTo && !row.skipWaterRegulationCheck){ + changeWaterScheduled(row, scriptErrors); + } } function onUpdate(helper, scriptErrors, row, oldRow){ @@ -211,17 +227,40 @@ function onUpdate(helper, scriptErrors, row, oldRow){ } } } + } - - if (row.id !== oldRow.id || row.date !== oldRow.date || row.volume !== oldRow.volume) - { - //EHR.Server.Utils.addError(scriptErrors,'date'); - - } - + if ( row.waterSource === 'lixit' && row.project && row.volume === undefined && row.assignedTo && !row.skipWaterRegulationCheck){ + changeWaterScheduled(row, scriptErrors); } } function addErrorMessage(key,scriptErrors){ EHR.Server.Utils.addError(scriptErrors, key, 'User does not have permission to modify this field.', 'ERROR'); } + +function changeWaterScheduled(row, scriptErrors){ + + let jsonArray = WNPRC.Utils.getJavaHelper().changeWaterScheduled(row.id,row.date,row.waterSource, row.project, row.objectid,this.extraContext); + let jsonExtraContext = this.extraContext.extraContextArray; + + if (jsonArray != null){ + for (var i=0; i < jsonArray.length; i++){ + let errorObject = jsonArray[i]; + EHR.Server.Utils.addError(scriptErrors,errorObject.field, errorObject.message, errorObject.severity); + } + if (jsonExtraContext != null){ + for (var j = 0; j < jsonExtraContext.length; j++){ + let extraContextObject = jsonExtraContext[j]; + let date = extraContextObject.date; + let dateOnly = new Date(date.getTime()); + let monthString = dateOnly.getMonth(); + monthString++; + + dateOnly = dateOnly.getFullYear()+ "-" + monthString + "-" + dateOnly.getDate(); + let infoMessage = "Water Order for "+ row.Id + " started on " + dateOnly + " with frequency of " + extraContextObject.frequency + " and volume of " + extraContextObject.volume + "ml will close."; + EHR.Server.Utils.addError(scriptErrors,"waterSource",infoMessage,"INFO"); + } + } + } + +} diff --git a/WNPRC_EHR/resources/queries/study/waterSchedule.sql b/WNPRC_EHR/resources/queries/study/waterSchedule.sql index 9c921b9c0..fcc232cbe 100644 --- a/WNPRC_EHR/resources/queries/study/waterSchedule.sql +++ b/WNPRC_EHR/resources/queries/study/waterSchedule.sql @@ -10,9 +10,9 @@ d.calculated_status AS calculated_status, s.*, s.objectid as treatmentid, --(SELECT max(d.qcstate) as label FROM study.drug d WHERE s.objectid = d.treatmentid AND s.date = d.timeordered) as treatmentStatus, -COALESCE((SELECT max(wg.qcstate) as label FROM study.waterGiven wg WHERE wg.treatmentid LIKE '%' || s.objectid || '%' AND s.date = wg.dateordered AND wg.volume IS NOT NULL ),10) as waterStatus, +COALESCE((SELECT max(wg.qcstate) as label FROM study.waterGiven wg WHERE wg.treatmentid LIKE '%' || s.objectid || '%' AND s.date = wg.dateordered AND (wg.volume IS NOT NULL OR wg.waterSource = 'lixit') ),10) as waterStatus, --COALESCE((SELECT max(wg.qcstate) as label FROM study.waterGiven wg WHERE s.objectid IN (wg.treatmentid) AND s.date = wg.dateordered AND wg.volume IS NOT NULL ),10) as waterStatus, -COALESCE((SELECT max(wg.treatmentid) as treatmentIds FROM study.waterGiven wg WHERE s.date = wg.dateordered AND wg.volume IS NOT NULL ),'objectId') as watertreatment +COALESCE((SELECT max(wg.treatmentid) as treatmentIds FROM study.waterGiven wg WHERE s.date = wg.dateordered AND (wg.volume IS NOT NULL OR wg.waterSource = 'lixit') ),'objectId') as watertreatment FROM study.demographics d diff --git a/WNPRC_EHR/resources/queries/study/waterScheduleCoalesced/Treatments AM.qview.xml b/WNPRC_EHR/resources/queries/study/waterScheduleCoalesced/Treatments AM.qview.xml index 11fffa874..d8c25f4f9 100644 --- a/WNPRC_EHR/resources/queries/study/waterScheduleCoalesced/Treatments AM.qview.xml +++ b/WNPRC_EHR/resources/queries/study/waterScheduleCoalesced/Treatments AM.qview.xml @@ -21,6 +21,7 @@ + \ No newline at end of file diff --git a/WNPRC_EHR/resources/queries/study/waterScheduleCoalesced/Treatments PM.qview.xml b/WNPRC_EHR/resources/queries/study/waterScheduleCoalesced/Treatments PM.qview.xml index 25edae2bc..afb012fed 100644 --- a/WNPRC_EHR/resources/queries/study/waterScheduleCoalesced/Treatments PM.qview.xml +++ b/WNPRC_EHR/resources/queries/study/waterScheduleCoalesced/Treatments PM.qview.xml @@ -21,6 +21,7 @@ + \ No newline at end of file diff --git a/WNPRC_EHR/resources/queries/study/waterScheduleCoalesced/Treatments.qview.xml b/WNPRC_EHR/resources/queries/study/waterScheduleCoalesced/Treatments.qview.xml index 70db97c06..518868d7f 100644 --- a/WNPRC_EHR/resources/queries/study/waterScheduleCoalesced/Treatments.qview.xml +++ b/WNPRC_EHR/resources/queries/study/waterScheduleCoalesced/Treatments.qview.xml @@ -25,7 +25,8 @@ - - + + + \ No newline at end of file diff --git a/WNPRC_EHR/resources/web/wnprc_ehr/animalWaterCalendar.js b/WNPRC_EHR/resources/web/wnprc_ehr/animalWaterCalendar.js index 3b73b342c..a062785fc 100644 --- a/WNPRC_EHR/resources/web/wnprc_ehr/animalWaterCalendar.js +++ b/WNPRC_EHR/resources/web/wnprc_ehr/animalWaterCalendar.js @@ -15,6 +15,7 @@ EHR.reports.animalWaterCalendar = function (panel, tab){ } else if (panel.getFilterArray(tab).nonRemovable.length === 0){ entireColony = true; panel.resolveSubjectsFromHousing(tab,renderCalendar,this); + calendarRender++; //renderCalendar('null', tab) } else{ diff --git a/WNPRC_EHR/resources/web/wnprc_ehr/ext4/components/buttons/husbandryButtons.js b/WNPRC_EHR/resources/web/wnprc_ehr/ext4/components/buttons/husbandryButtons.js index 942ca3c9f..e543bdc1e 100644 --- a/WNPRC_EHR/resources/web/wnprc_ehr/ext4/components/buttons/husbandryButtons.js +++ b/WNPRC_EHR/resources/web/wnprc_ehr/ext4/components/buttons/husbandryButtons.js @@ -250,4 +250,69 @@ Ext4.define('EHR.window.SubmitForReviewWindowHusbandry', { this.callParent(arguments); }, -}); \ No newline at end of file +}); + + +EHR.DataEntryUtils.registerDataEntryFormButton('SUBMIT_WATER', { + text: 'Submit Final', + name: 'submit', + requiredQC: 'Completed', + targetQC: 'Completed', + errorThreshold: 'WARN', + successURL: LABKEY.ActionURL.getParameter('srcURL') || LABKEY.ActionURL.buildURL('wnprc_ehr', 'dataEntry.view'), + disabled: true, + itemId: 'submitWtrBtn', + disableOn: 'WARN', + handler: function(btn){ + //this.onSubmit(btn); + // let waterGiven = btn.up('gridpanel').store; + // if (store.getFields().get('waterSource')){ + // + // } + + let waterStore = this.storeCollection.getServerStoreForQuery("study", "waterGiven"); + + if (waterStore){ + var animalIds = []; + for (var idx=0; idx1){ + animalIds.forEach((animalId)=> animalString+=animalId+','); + }else{ + animalString = animalIds[0]; + } + + Ext4.MessageBox.show({ + title: 'Lixit Confirmation', + msg: 'Is the water line connected for animal '+ animalString, + width: '300', + buttons: Ext4.MessageBox.YESNO, + icon: Ext4.MessageBox.QUESTION, + scope: this, + fn: function proceed(resp){ + if (resp === 'yes'){ + this.onSubmit(btn); + }else{ + Ext4.MessageBox.hide(); + } + } + }); + }else { + this.onSubmit(btn); + } + } + + + + //var panel = btn.up('ehr-dataentrypanel'); + + + } + +}); diff --git a/WNPRC_EHR/resources/web/wnprc_ehr/ext4/utils/DataEntryButtons.js b/WNPRC_EHR/resources/web/wnprc_ehr/ext4/utils/DataEntryButtons.js index 953f5569c..2078018f6 100644 --- a/WNPRC_EHR/resources/web/wnprc_ehr/ext4/utils/DataEntryButtons.js +++ b/WNPRC_EHR/resources/web/wnprc_ehr/ext4/utils/DataEntryButtons.js @@ -120,52 +120,6 @@ tooltip: "Set the status of this record to Complete, save the record, and leave this page." })); - var SubmitWaterButtonName = 'WNPRC_SUBMIT_WATER'; - registerBtn(SubmitWaterButtonName, _.extend(getBtn("SUBMIT"), { - text: "Submit Water", - name: "submit_water", - successURL: getReturnURL() || LABKEY.ActionURL.buildURL('wnprc_ehr', 'dataEntry.view'), - hideOnQCState: "Scheduled", - tooltip: "Set the status of this record to Complete, save the record, and leave this page.", - handler: function (btn){ - var storeCollection = this.storeCollection; - let waterStore = storeCollection.getServerStoreForQuery("study", "waterGiven"); - - if (waterStore){ - var animalIds = []; - for (var idx=0; idx1){ - animalIds.forEach((animalId)=> animalString+=animalId+','); - }else{ - animalString = animalIds[0]; - } - - Ext4.MessageBox.show({ - title: 'Lixit Confirmation', - msg: 'Is the water line connected for animal '+ animalString, - width: '300', - buttons: Ext4.MessageBox.YESNO, - icon: Ext4.MessageBox.QUESTION, - fn: function proceed(resp){ - if (resp == 'yes'){ - this.onSubmit(btn); - }else{ - Ext4.MessageBox.hide(); - } - } - }); - } - } - } - })); - /* * Prompt the user for a yes or no answer. Resolves on "yes" and rejects with an error with a * message of "canceled" if "no" is selected. diff --git a/WNPRC_EHR/resources/web/wnprc_ehr/ext4/windows/AddScheduleWaterWindow.js b/WNPRC_EHR/resources/web/wnprc_ehr/ext4/windows/AddScheduleWaterWindow.js index d272d0435..f9667ed98 100644 --- a/WNPRC_EHR/resources/web/wnprc_ehr/ext4/windows/AddScheduleWaterWindow.js +++ b/WNPRC_EHR/resources/web/wnprc_ehr/ext4/windows/AddScheduleWaterWindow.js @@ -312,11 +312,15 @@ Ext4.define('wnprc_ehr.window.AddScheduledWaterWindow', { } waterObjects[Id].push(waterObject); + let volumeText = null; + if (row.getValue('volume') !== null){ + volumeText = row.getValue('volume') + previousVolume + } var tempModel = this.targetStore.createModel({ Id: row.getValue('Id'), date: modelDate, - volume: row.getValue('volume') + previousVolume, + volume: volumeText, project: row.getValue('project'), assignedto: row.getValue('assignedTo'), waterSource: row.getValue('waterSource'), diff --git a/WNPRC_EHR/resources/web/wnprc_ehr/model/sources/Encounter.js b/WNPRC_EHR/resources/web/wnprc_ehr/model/sources/Encounter.js index 20591606d..81e748e23 100644 --- a/WNPRC_EHR/resources/web/wnprc_ehr/model/sources/Encounter.js +++ b/WNPRC_EHR/resources/web/wnprc_ehr/model/sources/Encounter.js @@ -51,7 +51,7 @@ EHR.model.DataModelManager.registerMetadata('Encounter', { waterSource:{ editable: false, allowBlank: false, - shownInGrid: false + shownInGrid: true }, remarks :{ diff --git a/WNPRC_EHR/resources/web/wnprc_ehr/model/sources/WaterOrderTask.js b/WNPRC_EHR/resources/web/wnprc_ehr/model/sources/WaterOrderTask.js index 6364a0864..225e2abb0 100644 --- a/WNPRC_EHR/resources/web/wnprc_ehr/model/sources/WaterOrderTask.js +++ b/WNPRC_EHR/resources/web/wnprc_ehr/model/sources/WaterOrderTask.js @@ -98,7 +98,7 @@ EHR.model.DataModelManager.registerMetadata('WaterOrderTask', { }, provideFruit:{ defaultValue: 'none', - allowBlank: false, + allowBlank: true, lookup:{ schemaName: 'ehr_lookups', queryName: 'husbandry_fruit', diff --git a/WNPRC_EHR/resources/web/wnprc_ehr/reports/IncompleteTreatmentsReport.js b/WNPRC_EHR/resources/web/wnprc_ehr/reports/IncompleteTreatmentsReport.js index 57ac0fae9..f065e374e 100644 --- a/WNPRC_EHR/resources/web/wnprc_ehr/reports/IncompleteTreatmentsReport.js +++ b/WNPRC_EHR/resources/web/wnprc_ehr/reports/IncompleteTreatmentsReport.js @@ -10,6 +10,8 @@ EHR.reports.IncompleteTreatmentsReport = function (panel, tab) { let reportStartDate = new Date(); reportStartDate.setDate(reportStartDate.getDate()-40); reportStartDate = reportStartDate.format(LABKEY.extDefaultDateFormat) + var reportEndDate = new Date(); + reportEndDate = reportEndDate.format(LABKEY.extDefaultDateFormat) let config = panel.getQWPConfig({ title: 'Incomplete Water Treatments', @@ -27,7 +29,7 @@ EHR.reports.IncompleteTreatmentsReport = function (panel, tab) { schemaName: 'study', queryName: 'waterTotalByDateWithWeight', viewName: 'tooLittleWater', - //parameters: {'NumDays': '180', 'StartDate': reportStartDate}, + parameters: {'STARTTARGET': reportStartDate, 'ENDTARGETDATE': reportEndDate}, filters: filterArray.nonRemovable, removeableFilters: filterArray.removable, frame: true diff --git a/WNPRC_EHR/resources/web/wnprc_ehr/wnprcHusbandryReports.js b/WNPRC_EHR/resources/web/wnprc_ehr/wnprcHusbandryReports.js index 605134192..3110516f6 100644 --- a/WNPRC_EHR/resources/web/wnprc_ehr/wnprcHusbandryReports.js +++ b/WNPRC_EHR/resources/web/wnprc_ehr/wnprcHusbandryReports.js @@ -24,8 +24,40 @@ EHR.reports.waterGridCalendar = function (panel, tab) { tab.add({ xtype: 'ldk-querypanel', style: 'margin-bottom:20px;', - queryConfig: config + queryConfig: config, + height: 3000 }); }; + +EHR.reports.totalWaterByDay = function (panel, tab) { + var filterArray = panel.getFilterArray(tab); + var title = panel.getTitleSuffix(); + + var target = tab.add({tag: 'span', style: 'padding-bottom: 20px'}); + tab.doLayout(); + var reportStartDate = new Date("1947-02-10"); + reportStartDate = reportStartDate.format(LABKEY.extDefaultDateFormat); + var reportEndDate = new Date(); + reportEndDate = reportEndDate.format(LABKEY.extDefaultDateFormat); + + var config = panel.getQWPConfig({ + title: 'Total Water By Date', + schemaName: 'study', + queryName: 'waterTotalByDateWithWeight', + parameters: {'STARTTARGET': reportStartDate, 'ENDTARGETDATE': reportEndDate}, + filters: filterArray.nonRemovable, + removeableFilters: filterArray.removable, + frame: true + + }); + + tab.add({ + xtype: 'ldk-querypanel', + style: 'margin-bottom:20px;', + queryConfig: config + + }); + +}; diff --git a/WNPRC_EHR/src/org/labkey/wnprc_ehr/TriggerScriptHelper.java b/WNPRC_EHR/src/org/labkey/wnprc_ehr/TriggerScriptHelper.java index b2929a3c0..fd7b70a6d 100644 --- a/WNPRC_EHR/src/org/labkey/wnprc_ehr/TriggerScriptHelper.java +++ b/WNPRC_EHR/src/org/labkey/wnprc_ehr/TriggerScriptHelper.java @@ -4,10 +4,11 @@ import com.google.common.collect.Maps; import org.apache.commons.beanutils.ConversionException; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.apache.commons.lang3.time.DateUtils; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.json.JSONArray; import org.json.JSONObject; import org.labkey.api.announcements.api.Announcement; @@ -17,16 +18,16 @@ import org.labkey.api.data.CompareType; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerManager; -import org.labkey.api.data.Results; -import org.labkey.api.data.SimpleFilter; import org.labkey.api.data.ConvertHelper; import org.labkey.api.data.JdbcType; +import org.labkey.api.data.Results; import org.labkey.api.data.Selector; +import org.labkey.api.data.SimpleFilter; import org.labkey.api.data.Sort; import org.labkey.api.data.Table; import org.labkey.api.data.TableInfo; -import org.labkey.api.ehr.EHRDemographicsService; import org.labkey.api.data.TableSelector; +import org.labkey.api.ehr.EHRDemographicsService; import org.labkey.api.ehr.EHRService; import org.labkey.api.ehr.demographics.AnimalRecord; import org.labkey.api.ehr.security.EHRDataAdminPermission; @@ -39,14 +40,15 @@ import org.labkey.api.query.FieldKey; import org.labkey.api.query.InvalidKeyException; import org.labkey.api.query.QueryHelper; -import org.labkey.api.query.QueryUpdateServiceException; import org.labkey.api.query.QueryService; +import org.labkey.api.query.QueryUpdateServiceException; import org.labkey.api.query.UserSchema; import org.labkey.api.security.User; import org.labkey.api.security.UserManager; +import org.labkey.api.study.security.SecurityEscalator; +import org.labkey.api.util.DateUtil; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.view.ActionURL; -import org.labkey.api.study.security.SecurityEscalator; import org.labkey.dbutils.api.SimpleQueryFactory; import org.labkey.dbutils.api.SimpleQueryUpdater; import org.labkey.dbutils.api.SimplerFilter; @@ -62,11 +64,12 @@ import org.labkey.wnprc_ehr.notification.ProjectRequestNotification; import org.labkey.wnprc_ehr.notification.VvcNotification; +import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; -import java.sql.ResultSet; import java.text.SimpleDateFormat; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; @@ -84,7 +87,6 @@ import java.util.Set; import java.util.TreeMap; import java.util.UUID; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -1421,11 +1423,11 @@ public JSONArray checkWaterRegulation(String animalId, Date clientStartDate, Dat JSONArray extraContextArray = new JSONArray(); boolean existingOrder = false; + // boolean closingWaterRecord = closingRecord; Map majorErrorMap = new HashMap<>(); Map errorMap = new HashMap<>(); - //TODO: Check is the animal is at least one time in the WaterSchedule Table if(checkIfAnimalInCondition(animalId,clientStartDate).size()==0){ JSONObject returnErrors = new JSONObject(); returnErrors.put("field", "Id"); @@ -1460,10 +1462,11 @@ public JSONArray checkWaterRegulation(String animalId, Date clientStartDate, Dat SimpleFilter filter = new SimpleFilter(FieldKey.fromString("Id"), animalId); filter.addCondition(FieldKey.fromString("date"), startDate.getTime(),CompareType.DATE_GTE); filter.addCondition(FieldKey.fromString("waterSource"),"regulated"); - //filter.addCondition(FieldKey.fromString("frequency"), frequency); + filter.addCondition(FieldKey.fromString("QCState"), EHRService.get().getQCStates(container).get(EHRService.QCSTATES.Scheduled.getLabel()).getRowId(), CompareType.EQUAL); + //Adding all the water records from database to a list of waterRecord objects that can be compared - TableSelector waterOrdersFromDatabase = new TableSelector(waterSchedule, PageFlowUtil.set( "taskId","objectid","lsid","Id", "date", "startDateCoalesced","endDateCoalescedFuture","dataSource","project","frequency", "assignedTo","volume","waterOrderObjectId"), filter, null); + TableSelector waterOrdersFromDatabase = new TableSelector(waterSchedule, PageFlowUtil.set( "taskId","objectid","lsid","Id", "date", "qcstate","startDateCoalesced","endDateCoalescedFuture","dataSource","project","frequency", "assignedTo","volume","waterOrderObjectId"), filter, null); waterOrdersFromDatabase.setNamedParameters(parameters); waterRecords.addAll(waterOrdersFromDatabase.getArrayList(WaterDataBaseRecord.class)); @@ -1500,10 +1503,10 @@ public JSONArray checkWaterRegulation(String animalId, Date clientStartDate, Dat if (loopDate.compareTo(convertToLocalDateViaSqlDate(waterRecord.getDate()))==0){ - String serverMeaning = getMeaningFromRowid( waterRecord.getFrequency(), "husbandry_frequency", "wnprc" ); + String serverFrequencyMeaning = getMeaningFromRowid( waterRecord.getFrequency(), "husbandry_frequency", "wnprc" ); //Check frequency compatibility with water orders in the server - if (!checkFrequencyCompatibility(serverMeaning, meaningFrequency)) + if (!checkFrequencyCompatibility(serverFrequencyMeaning, meaningFrequency)) { //Formatting the dates to return a legible date for error message @@ -1556,7 +1559,7 @@ else if (Date.from(endOfLoop.atStartOfDay(ZoneId.systemDefault()).toInstant()).g //Adding dataSource, objetcId, severity and message to the exception in case of error returnErrors.put("dataSource", waterRecord.getDataSource()); returnErrors.put("message", "Overlapping Water Order already in the system. Start date: " + startFormatDate + - " End Date: " + endFormattedDate +" Frequency: "+waterRecord.getFrequency() +" Source: " + waterRecord.getDataSource() + " EDIT"); + " End Date: " + endFormattedDate +" Frequency: "+serverFrequencyMeaning +" Source: " + waterRecord.getDataSource() + " EDIT"); returnErrors.put("objectId", waterRecord.getObjectId()); returnErrors.put("severity", "ERROR"); @@ -1619,7 +1622,8 @@ else if (Date.from(endOfLoop.atStartOfDay(ZoneId.systemDefault()).toInstant()).g } } if (!returnErrors.isEmpty() && checkIfAnimalInCondition(animalId,clientStartDate).size()>0){ - errorMap.put(waterRecord.getObjectId(), returnErrors); + JSONObject returnErrorsExport = new JSONObject(returnErrors,JSONObject.getNames(returnErrors)); + errorMap.put(waterRecord.getObjectId(), returnErrorsExport); extraContext.put("extraContextArray", extraContextArray); } } @@ -1838,38 +1842,190 @@ public JSONArray checkWaterSchedule(String animalId, Date clientDate, String ob + } + + public JSONArray closeWaterOrder(String animalId, Date clientStartDate, Date clientEndDate, Integer project, String objectId, boolean closingRecord){ + JSONArray arrayOfErrors = new JSONArray(); + Map majorErrorMap = new HashMap<>(); + Map errorMap = new HashMap<>(); + + if(checkIfAnimalInCondition(animalId,clientStartDate).size()==0){ + JSONObject returnErrors = new JSONObject(); + returnErrors.put("field", "Id"); + returnErrors.put("severity","ERROR"); + returnErrors.put("message","Animal not in waterScheduledAnimals table, contact compliance staff to enter new animals into the water monitoring system"); + majorErrorMap.put(objectId, returnErrors); + + } + + if (majorErrorMap.isEmpty()){ + //Closing existing lixit order in the system and adding a record in the waterScheduleAnimals table + TableInfo waterOrders = getTableInfo("study","waterOrders"); + SimpleFilter filterOrders = new SimpleFilter (FieldKey.fromString("objectid"), objectId); + filterOrders.addCondition(FieldKey.fromString("Id"), animalId, CompareType.EQUAL); + + TableSelector waterOrderRecords = new TableSelector(waterOrders, PageFlowUtil.set("lsid", "id", "date","frequency","enddate"),filterOrders,null); + Map [] waterOrderObject = waterOrderRecords.getMapArray(); + + + if (waterOrderObject.length > 0){ + List> toUpdate = new ArrayList<>(); + List> oldKeys = new ArrayList<>(); + + for (Map waterOrderMap : waterOrderObject){ + String lsid = ConvertHelper.convert(waterOrderMap.get("lsid"), String.class); + Map updateWaterOrder = new CaseInsensitiveHashMap<>(); + updateWaterOrder.put("lsid", lsid); + updateWaterOrder.put("enddate",clientEndDate); + updateWaterOrder.put("skipWaterRegulationCheck", true); + toUpdate.add(updateWaterOrder); + Map keyMap = new CaseInsensitiveHashMap<>(); + keyMap.put("lsid", lsid); + oldKeys.add(keyMap); + } + try + { + if (!toUpdate.isEmpty()) + { + Container container = getContainer(); + User user = getUser(); + BatchValidationException errors = new BatchValidationException(); + List> updateRows = waterOrders.getUpdateService().updateRows(user, container, toUpdate, oldKeys, errors, null, null); + if (updateRows.isEmpty() || errors.hasErrors()) + { + JSONObject returnErrors = new JSONObject(); + returnErrors.put("field", "Id"); + returnErrors.put("severity", "ERROR"); + returnErrors.put("message", "Error closing water orders."); + + errorMap.put(objectId, returnErrors); + } + } + } + catch(Exception e){ + JSONObject returnErrors = new JSONObject(); + returnErrors.put("field", "project"); + returnErrors.put("severity", "ERROR"); + returnErrors.put("message", "Error closing water order."); + + errorMap.put(objectId, returnErrors); + + } + } + errorMap.forEach((objectIdString, JSONObject)->{ + arrayOfErrors.put(JSONObject); + }); + } + majorErrorMap.forEach((objectIdString, JSONObject)->{ + arrayOfErrors.put(JSONObject); + }); + + return arrayOfErrors; + } public LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) { return new java.sql.Date(dateToConvert.getTime()).toLocalDate(); } - public boolean checkFrequencyCompatibility(String serverRecord, String clientRecord){ + public boolean checkFrequencyCompatibility(String serverRecord, String clientRecord) + { boolean validation = true; - if (clientRecord.compareTo(serverRecord) == 0){ + if (clientRecord.compareTo(serverRecord) == 0) + { validation = false; return validation; - } else if (clientRecord.compareTo("Daily - AM")==0){ - if (serverRecord.compareTo("Daily - Anytime")==0){ + } + else if (clientRecord.compareTo("Daily - AM") == 0) + { + if (serverRecord.compareTo("Daily - Anytime") == 0) + { + validation = false; + return validation; + } + else if (serverRecord.compareTo("Daily - AM/PM") == 0) + { + validation = false; + return validation; + } + } + else if (clientRecord.compareTo("Daily - PM") == 0) + { + if (serverRecord.contains("PM")) + { + validation = false; + return validation; + } + } + else if (clientRecord.compareTo("Daily - Anytime") == 0) + { + if (serverRecord.contains("PM") || serverRecord.contains("AM")) + { + validation = false; + return validation; + } + } + else if (clientRecord.compareTo("Daily - AM/PM") == 0) + { + if (serverRecord.contains("PM") || serverRecord.contains("AM") || serverRecord.compareTo("Daily - Anytime") == 0) + { + validation = false; + return validation; + } + } + else if (clientRecord.compareTo("Sunday - PM") == 0) + { + if (serverRecord.compareTo("Daily - PM") == 0) + { + validation = false; + return validation; + } + } + else if (clientRecord.compareTo("Monday - PM") == 0) + { + if (serverRecord.compareTo("Daily - PM") == 0) + { + validation = false; + return validation; + } + } + else if (clientRecord.compareTo("Tuesday - PM") == 0) + { + if (serverRecord.compareTo("Daily - PM") == 0) + { validation = false; return validation; - }else if (serverRecord.compareTo("Daily - AM/PM")==0){ + } + } + else if (clientRecord.compareTo("Wednesday - PM") == 0) + { + if (serverRecord.compareTo("Daily - PM") == 0) + { validation = false; return validation; } - } else if (clientRecord.contains("PM")){ - if (serverRecord.contains("PM")){ + } + else if (clientRecord.compareTo("Thursday - PM") == 0) + { + if (serverRecord.compareTo("Daily - PM") == 0) + { validation = false; return validation; } - } else if (clientRecord.compareTo("Daily - Anytime")==0){ - if (serverRecord.contains("PM") || serverRecord.contains("AM")){ + } + else if (clientRecord.compareTo("Friday - PM") == 0) + { + if (serverRecord.compareTo("Daily - PM") == 0) + { validation = false; return validation; } - } else if (clientRecord.compareTo("Daily - AM/PM")==0){ - if (serverRecord.contains("PM") || serverRecord.contains("AM") || serverRecord.compareTo("Daily - Anytime")==0){ + } + else if (clientRecord.compareTo("Saturday - PM") == 0) + { + if (serverRecord.compareTo("Daily - PM") == 0) + { validation = false; return validation; } @@ -2170,6 +2326,35 @@ public Map checkIfAnimalInCondition(String animalId, Date clientD } return returnCondition; } + public Map checkWaterLixit(String animalId, Date clientDate) + { + Map returnMap = new HashMap<>(); + + Calendar filterDate = Calendar.getInstance(); + filterDate.setTime(clientDate); + + TableInfo waterOrders = getTableInfo("study", "waterOrders"); + SimpleFilter filter = new SimpleFilter(FieldKey.fromString("Id"), animalId); + filter.addCondition(FieldKey.fromString("date"), filterDate.getTime(),CompareType.DATE_LT); + + Sort sort = new Sort(); + sort.appendSortColumn(FieldKey.fromString("date"), Sort.SortDirection.DESC, true); + + TableSelector ts = new TableSelector(waterOrders, PageFlowUtil.set("objectid", "date", "waterSource"),filter, sort); + ts.setMaxRows(1); + Map[] waterOrderFromServer = ts.getMapArray(); + + if (waterOrderFromServer.length>0){ + for (Map openWaterOrder : waterOrderFromServer) + { + returnMap.put("objectid", ConvertHelper.convert(openWaterOrder.get("objectid"), String.class)); + returnMap.put("date", ConvertHelper.convert(openWaterOrder.get("date"), Date.class)); + returnMap.put("waterSource", ConvertHelper.convert(openWaterOrder.get("waterSource"), String.class)); + + } + } + return returnMap; + } public static List filterBloodDraws(List bloodRecords, Integer limit) @@ -2177,17 +2362,14 @@ public static List filterBloodDraws(List bloodRecords, Integer l return null; } //This function will always have lixit as the waterSource - public JSONArray changeWaterScheduled(String animalId, Date startDate, String waterSource, Integer project, String objectId, Map extraContext) throws Exception + public JSONArray changeWaterScheduled(String animalId, Date startDate, String waterSource, Integer project, String objectId, @Nullable Map extraContext) throws Exception { JSONArray arrayOfErrors = new JSONArray(); JSONArray extraContextArray = new JSONArray(); JSONObject returnErrors = new JSONObject(); - - - Map errorMap = new HashMap<>(); - if(checkIfAnimalInCondition(animalId,startDate).size()==0 || checkIfAnimalInCondition(animalId,startDate).get(animalId).equals("lixit")){ + if(checkIfAnimalInCondition(animalId, startDate).isEmpty() || checkIfAnimalInCondition(animalId,startDate).get(animalId).equals("lixit")){ returnErrors.put("field","waterSource"); returnErrors.put("severity", "ERROR"); returnErrors.put("message", "Error animal not in WaterScheduleAnimal table or is already in "+waterSource +" condition"); @@ -2199,12 +2381,14 @@ public JSONArray changeWaterScheduled(String animalId, Date startDate, String wa TableInfo waterOrders = getTableInfo("study","waterOrders"); SimpleFilter filter = new SimpleFilter (FieldKey.fromString("id"), animalId); filter.addCondition(FieldKey.fromString("waterSource"),"regulated"); + //filter.addCondition(FieldKey.fromString("date"),startDate,CompareType.DATE_LT); filter.addCondition(FieldKey.fromString("enddateCoalescedFuture"),startDate,CompareType.DATE_GT); TableSelector waterOrderRecords = new TableSelector(waterOrders, PageFlowUtil.set("lsid", "objectid","id", "date","volume","frequency","enddateCoalescedFuture"),filter,null); Map [] waterOrderObjects = waterOrderRecords.getMapArray(); List> toUpdate = new ArrayList<>(); List> oldKeys = new ArrayList<>(); + List> waterAmounts = new ArrayList<>(); if (waterOrderObjects.length >0) { @@ -2220,8 +2404,15 @@ public JSONArray changeWaterScheduled(String animalId, Date startDate, String wa updateWaterOrder.put("lsid", lsid); //closing water order the day before, new lixit orders have to be completed the first time. java.time.LocalDateTime newEndDate = java.time.LocalDateTime.ofInstant(startDate.toInstant(),ZoneId.systemDefault()); - newEndDate.minusDays(1); - updateWaterOrder.put("enddate", Date.from(newEndDate.atZone(ZoneId.systemDefault()).toInstant())); + newEndDate = newEndDate.minusDays(1); + if (ConvertHelper.convert(waterOrderMap.get("date"), Date.class).before(startDate)){ + updateWaterOrder.put("enddate", Date.from(newEndDate.atZone(ZoneId.systemDefault()).toInstant())); + + }else if(ConvertHelper.convert(waterOrderMap.get("date"), Date.class).after(startDate)){ + updateWaterOrder.put("qcstate", EHRService.QCSTATES.DeleteRequested.getQCState(getContainer()).getRowId()); + } + + updateWaterOrder.put("skipWaterRegulationCheck", true); toUpdate.add(updateWaterOrder); @@ -2244,6 +2435,14 @@ public JSONArray changeWaterScheduled(String animalId, Date startDate, String wa } } + Map keyMapAmount = new CaseInsensitiveHashMap<>(); + keyMapAmount.put("animalId", animalId); + Timestamp timestamp = new Timestamp(startDate.getTime()); + keyMapAmount.put("endDate", timestamp); + waterAmounts.add(keyMapAmount); + + removeWaterAmounts(waterAmounts, arrayOfErrors); + List> rowToAdd = null; Map scheduledAnimalRecord = new HashMap<>(); @@ -2258,7 +2457,7 @@ public JSONArray changeWaterScheduled(String animalId, Date startDate, String wa //service = ti.getUpdateService(); //if(errorMap.get(animalId)!= null && !"ERROR".equals(errorMap.get(animalId).get("severity"))) - if( arrayOfErrors.length() > 0 && !"ERROR".equals(returnHighestError(arrayOfErrors))) + if(!arrayOfErrors.isEmpty() && !"ERROR".equals(returnHighestError(arrayOfErrors))) { try { @@ -2289,7 +2488,7 @@ public JSONArray changeWaterScheduled(String animalId, Date startDate, String wa } } - if (extraContextArray.length()>0){ + if (!extraContextArray.isEmpty()){ extraContext.put("extraContextArray", extraContextArray); } @@ -2621,4 +2820,72 @@ public void exec(ResultSet rs) throws SQLException return StringUtils.join(errors, "<>"); } + + public void removeWaterAmounts ( List> animalDateMap) throws SQLException, BatchValidationException, QueryUpdateServiceException, InvalidKeyException{ + removeWaterAmounts(animalDateMap, null); + } + + public void removeWaterAmounts ( List> animalDateMap, @Nullable JSONArray errorArray) throws SQLException, BatchValidationException, QueryUpdateServiceException, InvalidKeyException + { + + + + if (animalDateMap != null){ + for (Map record : animalDateMap){ + String Id = (String)record.get("animalId"); + Date animalDeath = (Timestamp)record.get("endDate"); + //Date animalDeath = new Date(DateUtil.parseISODateTime((String)record.get("deathDate"))); + if (!checkIfAnimalInCondition(Id, animalDeath).isEmpty()){ + Calendar filterDate = Calendar.getInstance(); + filterDate.setTime(animalDeath); + + TableInfo waterAmount= getTableInfo("study", "waterAmount"); + SimpleFilter filter = new SimpleFilter(FieldKey.fromString("Id"), Id); + filter.addCondition(FieldKey.fromString("date"), filterDate.getTime(),CompareType.DATE_GTE); + filter.addCondition(FieldKey.fromString("QCState/label"), "Scheduled", CompareType.EQUAL); + + Sort sort = new Sort(); + sort.appendSortColumn(FieldKey.fromString("date"), Sort.SortDirection.ASC, false); + + TableSelector ts = new TableSelector(waterAmount, filter,sort); + final List> rowTobeUpdated = new ArrayList<>(); + final List> oldKeys = new ArrayList<>(); + + ts.forEach(new Selector.ForEachBlock() + { + @Override + public void exec(ResultSet rs) throws SQLException + { + JSONObject returnErrors = new JSONObject(); + returnErrors.put("field", "waterSource"); + returnErrors.put("severity", "INFO"); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime waterDate = LocalDateTime.parse(rs.getString("date"),formatter); + DateTimeFormatter formatterDate = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + DateTimeFormatter formatterTime = DateTimeFormatter.ofPattern("HH:mm"); + returnErrors.put("message", "Water Amount for " + rs.getString("id") + " on " + waterDate.format(formatterDate) + " at " + waterDate.format(formatterTime) + " will be deleted."); + if (errorArray != null){ + errorArray.put(returnErrors); + } + String objectid =rs.getString("objectId"); + Map toUpdate = new CaseInsensitiveHashMap<>(); + Map keyMap = new CaseInsensitiveHashMap<>(); + toUpdate.put("qcstate", EHRService.QCSTATES.DeleteRequested.getQCState(getContainer()).getRowId()); + toUpdate.put("objectid",objectid); + rowTobeUpdated.add(toUpdate); + + keyMap.put("objectid", objectid); + oldKeys.add(keyMap); + + } + }); + //Table.update(getUser(),waterAmount,toUpdate, objectid); + if (waterAmount.getUpdateService()!=null){ + BatchValidationException errors = new BatchValidationException(); + waterAmount.getUpdateService().updateRows(user, container,rowTobeUpdated,oldKeys,errors,null,null); + } + } + } + } + } } diff --git a/WNPRC_EHR/src/org/labkey/wnprc_ehr/WNPRC_EHRController.java b/WNPRC_EHR/src/org/labkey/wnprc_ehr/WNPRC_EHRController.java index 4742774b7..9a0636135 100644 --- a/WNPRC_EHR/src/org/labkey/wnprc_ehr/WNPRC_EHRController.java +++ b/WNPRC_EHR/src/org/labkey/wnprc_ehr/WNPRC_EHRController.java @@ -1552,6 +1552,7 @@ public Object execute (WaterOrderRecord event, BindException errors) throws Exce waterOrderRecord.put("taskid", woRow.get("taskid")); waterOrderRecord.put("objectid", event.getObjectId()); waterOrderRecord.put("enddate", event.getEndDate()); + waterOrderRecord.put("closingRecord", event.isCloseRecord()); if (event.isSkipWaterRegulationCheck()){ waterOrderRecord.put("skipWaterRegulationCheck", true); } @@ -1737,6 +1738,7 @@ public static class WaterOrderRecord { private String frequency; private String assignedTo; private String action; + private boolean closeRecord; private boolean skipWaterRegulationCheck; @@ -1893,6 +1895,15 @@ public String getAction() return action; } + public boolean isCloseRecord() + { + return closeRecord; + } + + public void setCloseRecord(boolean closeRecord){ + this.closeRecord= closeRecord; + } + public boolean isSkipWaterRegulationCheck() { return skipWaterRegulationCheck; diff --git a/WNPRC_EHR/src/org/labkey/wnprc_ehr/dataentry/forms/WaterMonitoring/EnterMultipleWater.java b/WNPRC_EHR/src/org/labkey/wnprc_ehr/dataentry/forms/WaterMonitoring/EnterMultipleWater.java index d23c207d3..b58796a2a 100644 --- a/WNPRC_EHR/src/org/labkey/wnprc_ehr/dataentry/forms/WaterMonitoring/EnterMultipleWater.java +++ b/WNPRC_EHR/src/org/labkey/wnprc_ehr/dataentry/forms/WaterMonitoring/EnterMultipleWater.java @@ -29,6 +29,8 @@ public EnterMultipleWater(DataEntryFormContext ctx, Module owner) this.addClientDependency(ClientDependency.supplierFromPath("wnprc_ehr/model/sources/Encounter.js")); this.addClientDependency(ClientDependency.supplierFromPath("wnprc_ehr/ext4/data/SingleAnimal/WaterServerStore.js")); this.addClientDependency(ClientDependency.supplierFromPath("wnprc_ehr/ext4/data/SingleAnimal/WaterStoreCollection.js")); + this.addClientDependency(ClientDependency.supplierFromPath("wnprc_ehr/ext4/components/buttons/husbandryButtons.js")); + for (FormSection section : this.getFormSections()){ // section.addConfigSource("Husbandry"); @@ -41,7 +43,7 @@ public EnterMultipleWater(DataEntryFormContext ctx, Module owner) @Override protected List getButtonConfigs(){ List buttons = super.getButtonConfigs(); - buttons.add("WNPRC_SUBMIT_FINAL"); + buttons.add("SUBMIT_WATER"); buttons.remove("WNPRC_SAVE"); buttons.remove("WNPRC_SAVE_AND_EXIT"); diff --git a/WNPRC_EHR/src/org/labkey/wnprc_ehr/notification/WaterMonitoringNotification.java b/WNPRC_EHR/src/org/labkey/wnprc_ehr/notification/WaterMonitoringNotification.java index 41d515309..56d3dd131 100644 --- a/WNPRC_EHR/src/org/labkey/wnprc_ehr/notification/WaterMonitoringNotification.java +++ b/WNPRC_EHR/src/org/labkey/wnprc_ehr/notification/WaterMonitoringNotification.java @@ -135,8 +135,16 @@ protected void findAnimalsWithEnoughWater(final Container c, final User u, final final Map columns = QueryService.get().getColumns(waterTotalByDateWithWeightReport, colKeys); + LocalDate date = LocalDate.now(); + LocalDate startDate = date.minusDays(1); + LocalDate endDate = LocalDate.now(); + Map parameters = new CaseInsensitiveHashMap<>(); + parameters.put("STARTTARGET", startDate); + parameters.put("ENDTARGETDATE", endDate); + TableSelector ts = new TableSelector(waterTotalByDateWithWeightReport, columns.values(), filter, null); + ts.setNamedParameters(parameters); //TableSelector ts = new TableSelector(getStudySchema(c, u).getTable("waterTotalByDateWithWeight"),PageFlowUtil.set("Id","date","mlsPerKg","TotalWater","project","currentWaterCondition"), filter, null); long count = ts.getRowCount(); if (count > 0) diff --git a/WNPRC_EHR/src/org/labkey/wnprc_ehr/pages/husbandry/WaterCalendar.jsp b/WNPRC_EHR/src/org/labkey/wnprc_ehr/pages/husbandry/WaterCalendar.jsp index 852a8ab04..ac51dd106 100644 --- a/WNPRC_EHR/src/org/labkey/wnprc_ehr/pages/husbandry/WaterCalendar.jsp +++ b/WNPRC_EHR/src/org/labkey/wnprc_ehr/pages/husbandry/WaterCalendar.jsp @@ -594,6 +594,8 @@ } }); $(document).ready(function(){ + //Map of animals added for each day in the calendar + //This map is used by loadWaterTotal to show or hide the total water for the day const calendarDates = new Map(); const currentTime = new Date().setHours(0,0,0,0); @@ -612,10 +614,7 @@ { events: function (fetchInfo, successCallback, failureCallback) { console.log(" startStr " + fetchInfo.startStr); - console.log(" startStr " + fetchInfo.endStr); - - //TODO:Knockout not working when animalId is sent - //have to troubleshot error "in"when sending $animalId + console.log(" endtStr " + fetchInfo.endStr); if ($animalId === 'undefined' || $animalId === "null" || $animalId === ''){ let queryConfig ={}; @@ -627,42 +626,45 @@ successCallback( events.map(function (row) { - if (moment(row.date).isSameOrAfter(currentTime) && !calendarDates.get(row.date)){ - var animalIds = []; - animalIds.push(row.Id); - calendarDates.set(row.date,animalIds); - }else { - calendarDates.get(row.date).push(row.Id); - } - var volume; - if (row.volume != null) { - volume = row.volume + 'mL'; - } - else { - volume = "On Lixit"; - } - var eventObj = { - id : LABKEY.Utils.generateUUID(), - title: row.Id + ' ' + volume, - start: new Date(row.date), - allDay: true, - groupId : groupId(row), - rawRowData: row, - textColor: '#000000', - //editable: true, - description: 'Water for animal ' + row.Id - }; - - if (row.assignedToCoalesced in husbandryAssignmentLookup) { - eventObj.color = husbandryAssignmentLookup[row.assignedToCoalesced].color; - - } - else { - eventObj.color = '#F78181'; - } - - console.log("event from waterSchedule"); - return eventObj; + //creating an array per day to store animalIds + //there are cases where the water amount do not get completed on the day. + //The calendar should display even if the water amount was not complete it. + var dateIndex = new Date(row.date); + dateIndex=dateIndex.getFullYear() +'-'+dateIndex.getMonth()+'-'+dateIndex.getDate(); + if (!calendarDates.get(dateIndex)){ + var animalIds = []; + animalIds.push(row.Id); + calendarDates.set(dateIndex,animalIds); + }else { + calendarDates.get(dateIndex).push(row.Id); + } + var volume; + if (row.volume != null) { + volume = row.volume + 'mL'; + } + else { + volume = "On Lixit"; + } + var eventObj = { + id : LABKEY.Utils.generateUUID(), + title: row.Id + ' ' + volume, + start: new Date(row.date), + allDay: true, + groupId : groupId(row), + rawRowData: row, + textColor: '#000000', + //editable: true, + description: 'Water for animal ' + row.Id + }; + + if (row.assignedToCoalesced in husbandryAssignmentLookup && row.actionRequired) { + eventObj.color = husbandryAssignmentLookup[row.assignedToCoalesced].color; + + } + else { + eventObj.color = '#FFFFFF'; + } + return eventObj; }) ); @@ -684,51 +686,55 @@ else{ let queryConfig ={}; queryConfig = queryConfigFunc(fetchInfo,isSuperUser, isAnimalCare, $animalId); - console.log("fetching single animal schedule"); WebUtils.API.selectRows("study", "waterScheduleWithWeight", queryConfig).then(function (data) { var events = data.rows; - successCallback(events.map(function (row) { - if (moment(row.date).isSameOrAfter(currentTime) && !calendarDates.get(row.date)){ - var animalIds = []; - animalIds.push(row.Id); - calendarDates.set(row.date, animalIds); - }else{ - calendarDates.get(row.date).push(row.Id); - } - var volume; - if (row.volume != null) { - volume = row.volume+ 'ml'; - } - else { - volume = ' On Lixit'; - } - - var eventObj = { - id : LABKEY.Utils.generateUUID(), - title: row.Id + ' ' + volume, - start: new Date(row.date), - allDay: true, - textColor: '#000000', - groupId : groupId(row), - rawRowData: row, - //editable: true, - description: 'Water for animal ' + row.Id - }; - - if (row.assignedToCoalesced in husbandryAssignmentLookup) { - eventObj.color = husbandryAssignmentLookup[row.assignedToCoalesced].color; - - } - else { - eventObj.color = '#F78181'; - } - console.log("event from waterSchedule"); - return eventObj; - - })) + successCallback( + events.map(function (row) { + var dateIndex = new Date(row.date); + dateIndex=dateIndex.getFullYear() +'-'+dateIndex.getMonth()+'-'+dateIndex.getDate(); + if (!calendarDates.get(dateIndex)){ + var animalIds = []; + animalIds.push(row.Id); + calendarDates.set(dateIndex, animalIds); + }else{ + calendarDates.get(dateIndex).push(row.Id); + } + var volume; + if (row.volume != null) { + volume = row.volume+ 'ml'; + } + else { + volume = ' On Lixit'; + } + + var eventObj = { + id : LABKEY.Utils.generateUUID(), + title: row.Id + ' ' + volume, + start: new Date(row.date), + allDay: true, + textColor: '#000000', + groupId : groupId(row), + rawRowData: row, + //editable: true, + description: 'Water for animal ' + row.Id + }; + + if (row.assignedToCoalesced in husbandryAssignmentLookup && row.actionRequired) { + eventObj.color = husbandryAssignmentLookup[row.assignedToCoalesced].color; + + } + else { + eventObj.color = '#FFFFFF'; + } + return eventObj; + + }) + ); + failureCallback((function(data){ + console.log ("Error retriving waterScheduleWithWeight"); + })); }).then(function (data){ - debugger; if(!loadWaterTotalOnce){ loadWaterTotal($animalId,calendarDates,calendar,currentTime); loadWaterTotalOnce=true; @@ -775,7 +781,7 @@ //This updates all the fields that can be change in this form //We also have to reset the dirty flag to track any change after the event is loaded into //the form to be able to change. - if (info.event.source.id == "totalWater") { + if (info.event.source.id === "totalWater") { $('#collapseOne').collapse('hide'); $('#collapseTwo').collapse('show'); WebUtils.VM.taskDetails["volume"](info.event.extendedProps.rawRowData.TotalWater.toString()); @@ -789,7 +795,12 @@ }else{ $('#collapseOne').collapse('show'); $('#collapseTwo').collapse('hide'); - WebUtils.VM.form.volumeForm.value(info.event.extendedProps.rawRowData.volume.toString()); + if ( info.event.extendedProps.rawRowData.volume !== null){ + WebUtils.VM.form.volumeForm.value(info.event.extendedProps.rawRowData.volume.toString()); + }else{ + WebUtils.VM.taskDetails["volume"](info.event.extendedProps.rawRowData.conditionAtTime.toString()); + } + } WebUtils.VM.form.volumeForm.dirtyFlag.reset(); @@ -942,7 +953,8 @@ rawDate: ko.observable(), mlsPerKg: ko.observable(), conditionAtTime: ko.observable(), - animalStatus: ko.observable() + animalStatus: ko.observable(), + actionRequired: ko.observable() }, form: { lsidForm: ko.observable(), @@ -985,13 +997,14 @@ LABKEY.Ajax.request({ url: LABKEY.ActionURL.buildURL("wnprc_ehr", "CloseWaterOrder", null, { - lsid: waterOrder.lsid, - taskId: waterOrder.taskid, - objectId: waterOrder.objectIdCoalesced, - animalId: waterOrder.Id, - endDate: waterOrder.date, - dataSource: waterOrder.dataSource, - skipWaterRegulationCheck: true + lsid: waterOrder.lsid, + taskId: waterOrder.taskid, + objectId: waterOrder.objectIdCoalesced, + animalId: waterOrder.Id, + endDate: waterOrder.date, + dataSource: waterOrder.dataSource, + closeRecord: "true", + skipWaterRegulationCheck: 'true' }), success: LABKEY.Utils.getCallbackWrapper(function (response) @@ -1076,6 +1089,7 @@ objectId: waterOrder.objectIdCoalesced, animalId: waterOrder.Id, endDate: waterOrder.date, + closeRecord: true, dataSource: waterOrder.dataSource }), @@ -1268,9 +1282,7 @@ WebUtils.VM.taskDetails.conditionAtTimeValue = ko.pureComputed(function(){ if (WebUtils.VM.taskDetails.calculatedStatusValue() === 'Alive' ){ - debugger; return WebUtils.VM.taskDetails.conditionAtTime(); - } else if(WebUtils.VM.taskDetails.calculatedStatusValue() === 'Dead' ){ return 'dead'; @@ -1543,24 +1555,29 @@ function queryConfigFunc (fetchInfo, isSuperUser, isAnimalCare, animalId){ let today = new Date(); - let momentStarDate = fetchInfo.start.format('Y-m-d'); + let momentStartDate = fetchInfo.start.format('Y-m-d'); let momentEndDate = fetchInfo.end.format('Y-m-d'); let numOfDate; let startCalendarDate; - if (moment(today).isBetween(momentStarDate, momentEndDate)){ + //Calculate if today is between the calendar start date and the calendar end date + //If the user navigates to the next month we only calculate the dates for that month and + //ignore the current date. + if (moment(today).isBetween(momentStartDate, momentEndDate)){ numOfDate = moment(momentEndDate).diff(today, "days", false); startCalendarDate = today.format(LABKEY.extDefaultDateFormat) - }else{ - numOfDate = moment(momentEndDate).diff(momentStarDate,"days",false); + }else if(moment(momentStartDate).isBefore(today) || moment(momentEndDate).isAfter(today)) { + numOfDate = moment(momentEndDate).diff(momentStartDate, "days", false); startCalendarDate = fetchInfo.start.format(LABKEY.extDefaultDateFormat); } + console.log("value of numofDate " + numOfDate) let configObject = { - "date~gte": fetchInfo.start.format('Y-m-d'), - "date~lte": fetchInfo.end.format('Y-m-d'), "parameters": {NumDays: numOfDate + 1, StartDate: startCalendarDate}, - "qcstate/label~eq": "Scheduled" + "qcstate/label~eq": "Scheduled", + "date~dategte": fetchInfo.start.format('Y-m-d'), + "date~datelte": fetchInfo.end.format('Y-m-d') + //"Id/Demographics/calculated_status~eq": "Alive" }; @@ -1655,8 +1672,9 @@ function loadWaterTotal(animalId, calendarDates, calendar, currentTime){ calendar.addEventSource( { - events:function (fetchInfo, successCallback, failureCallback) { - if (animalId === 'undefined' || animalId === "null" || animalId === ''){ + events:function (fetchInfo, successCallback, failureCallback) { + + if (animalId === 'undefined' || animalId === "null" || animalId === '') { let momentStarDate = fetchInfo.start.format('Y-m-d'); let momentEndDate = fetchInfo.end.format('Y-m-d'); @@ -1664,7 +1682,7 @@ WebUtils.API.selectRows("study", "waterTotalByDateWithWeight", { "date~gte": fetchInfo.start.format('Y-m-d'), "date~lte": fetchInfo.end.format('Y-m-d'), - "parameters": {STARTTARGET: momentStarDate, ENDTARGETDATE: momentEndDate} + "parameters": { STARTTARGET: momentStarDate, ENDTARGETDATE: momentEndDate } }).then(function (data) { var events = data.rows; @@ -1673,79 +1691,81 @@ events.map(function (row) { let parsedTotalWater = 0; let eventTitle = row.Id; - row.animalStatus=row['Id/Demographics/calculated_status']; - if( row.conditionAtTime === 'regulated' ) { + row.animalStatus = row['Id/Demographics/calculated_status']; + let dateIndexWaterTotal = new Date(row.date); + dateIndexWaterTotal = dateIndexWaterTotal.getFullYear() + '-' + dateIndexWaterTotal.getMonth() + '-' + dateIndexWaterTotal.getDate(); + let animalInDay = false + if (calendarDates.has(dateIndexWaterTotal)) { + let animalIdArray = []; + animalIdArray = calendarDates.get(dateIndexWaterTotal); + for (var i = 0; i < animalIdArray.length; i++) { + if (animalIdArray[i] === row.Id) { + animalInDay = true; + break; + } + } + } + if (row.conditionAtTime === 'regulated') { if (row['Id/Demographics/calculated_status'] === 'Alive') { - if (row.TotalWater === null) { + if (row.TotalWater === null && !animalInDay) { row.TotalWater = ' none'; parsedTotalWater = row.TotalWater; - } - else if (row.TotalWater !== null) { + } else if (row.TotalWater !== null) { parsedTotalWater = row.TotalWater; eventTitle += " Total: "; } - - } - else { - row.TotalWater = row['Id/Demographics/calculated_status']; + } else { + row.TotalWater = ' ' + row['Id/Demographics/calculated_status']; parsedTotalWater = row.TotalWater; } - } - else { + } else { if (row['Id/Demographics/calculated_status'] === 'Alive') { row.TotalWater = ' on Lixit'; parsedTotalWater = row.TotalWater; - } - else { - row.TotalWater = row['Id/Demographics/calculated_status']; + } else { + row.TotalWater = ' ' + row['Id/Demographics/calculated_status']; parsedTotalWater = row.TotalWater; - } } eventTitle += parsedTotalWater; var eventObj = { - id : LABKEY.Utils.generateUUID(), + id: LABKEY.Utils.generateUUID(), title: eventTitle, start: new Date(row.date), allDay: true, - groupId : row.Id, + groupId: row.Id, textColor: '#000000', rawRowData: row }; - if (row.mlsPerKg >= row.InnerMlsPerKg || row.conditionAtTime === 'lixit'){ + if (row.mlsPerKg >= row.InnerMlsPerKg || row.conditionAtTime === 'lixit') { eventObj.color = '#FFFFFF'; - } - else if (row.mlsPerKg >= '10' && row.mlsPerKg < row.InnerMlsPerKg){ + } else if (row.mlsPerKg >= '10' && row.mlsPerKg < row.InnerMlsPerKg) { eventObj.color = '#FF7F50'; - } - else{ + } else { eventObj.color = '#EE2020' } - debugger; - if (calendarDates.has(row.date) && calendarDates.get(row.date).includes(row.Id) ){ + if (animalInDay) { eventObj.display = 'none'; - }else{ + } else { eventObj.display = 'auto'; } - debugger; - console.log("event from waterTotal"); return eventObj; }) ); - failureCallback((function (data){ + failureCallback((function (data) { console.log("error from waterTotalByDateWithWeight"); })) }) - }else{ + } else { let momentStarDate = fetchInfo.start.format('Y-m-d'); let momentEndDate = fetchInfo.end.format('Y-m-d'); WebUtils.API.selectRows("study", "waterTotalByDateWithWeight", { "date~gte": fetchInfo.start.format('Y-m-d'), "date~lte": fetchInfo.end.format('Y-m-d'), - "parameters": {STARTTARGET: momentStarDate, ENDTARGETDATE: momentEndDate}, + "parameters": { STARTTARGET: momentStarDate, ENDTARGETDATE: momentEndDate }, "Id~in": animalId }).then(function (data) { var events = data.rows; @@ -1753,69 +1773,74 @@ successCallback( events.map(function (row) { - let parsedTotalWater = 0; - let eventTitle = row.Id; - row.animalStatus=row['Id/Demographics/calculated_status']; - if( row.conditionAtTime === 'regulated' ) { - if (row['Id/Demographics/calculated_status'] === 'Alive') { - if (row.TotalWater === null) { - row.TotalWater = ' none'; - parsedTotalWater = row.TotalWater; - } - else if (row.TotalWater !== null) { - parsedTotalWater = row.TotalWater; - eventTitle += " Total: "; - } - - } - else { - row.TotalWater = row.TotalWater; - parsedTotalWater += row.TotalWater; - eventTitle += " Total: "; + let parsedTotalWater = 0; + let eventTitle = row.Id; + row.animalStatus = row['Id/Demographics/calculated_status']; + let dateIndexWaterTotal = new Date(row.date); + dateIndexWaterTotal = dateIndexWaterTotal.getFullYear() + '-' + dateIndexWaterTotal.getMonth() + '-' + dateIndexWaterTotal.getDate(); + let animalInDay = false + if (calendarDates.has(dateIndexWaterTotal)) { + let animalIdArray = []; + animalIdArray = calendarDates.get(dateIndexWaterTotal); + for (var i = 0; i < animalIdArray.length; i++) { + if (animalIdArray[i] === row.Id) { + animalInDay = true; + break; } } - else { - if (row['Id/Demographics/calculated_status'] === 'Alive') { - row.TotalWater = ' on Lixit'; + } + if (row.conditionAtTime === 'regulated') { + if (row['Id/Demographics/calculated_status'] === 'Alive') { + if (row.TotalWater === null && !animalInDay) { + row.TotalWater = ' none'; parsedTotalWater = row.TotalWater; - } - else { - row.TotalWater = ' on Lixit'; + } else if (row.TotalWater !== null) { parsedTotalWater = row.TotalWater; - + eventTitle += " Total: "; } + } else { + row.TotalWater = ' ' + row['Id/Demographics/calculated_status']; + parsedTotalWater += row.TotalWater; } - eventTitle += parsedTotalWater; - - var eventObj = { - id : LABKEY.Utils.generateUUID(), - title: eventTitle, - start: new Date(row.date), - textColor: '#000000', - allDay: true, - groupId : row.Id, - rawRowData: row - }; - if (row.mlsPerKg >= row.InnerMlsPerKg || row.conditionAtTime === 'lixit'){ - eventObj.color = '#FFFFFF'; - }else if (row.mlsPerKg >= '10' && row.mlsPerKg < row.InnerMlsPerKg){ - eventObj.color = '#FF7F50'; - } - else{ - eventObj.color = '#EE2020' - } - if (calendarDates.has(row.date) && calendarDates.get(row.date).includes(row.Id)){ - eventObj.display = 'none'; - }else{ - eventObj.display = 'auto'; + } else { + if (row['Id/Demographics/calculated_status'] === 'Alive') { + row.TotalWater = ' on Lixit'; + parsedTotalWater = row.TotalWater; + } else { + row.TotalWater = ' ' + row['Id/Demographics/calculated_status']; + ; + parsedTotalWater = row.TotalWater; } - console.log("event from waterTotal"); - return eventObj; + } + eventTitle += parsedTotalWater; + + var eventObj = { + id: LABKEY.Utils.generateUUID(), + title: eventTitle, + start: new Date(row.date), + textColor: '#000000', + allDay: true, + groupId: row.Id, + rawRowData: row + }; + if (row.mlsPerKg >= row.InnerMlsPerKg || row.conditionAtTime === 'lixit') { + eventObj.color = '#FFFFFF'; + } else if (row.mlsPerKg >= '10' && row.mlsPerKg < row.InnerMlsPerKg) { + eventObj.color = '#FF7F50'; + } else { + eventObj.color = '#EE2020' + } + if (calendarDates.has(dateIndexWaterTotal) && calendarDates.get(dateIndexWaterTotal).includes(row.Id)) { + eventObj.display = 'none'; + } else { + eventObj.display = 'auto'; + } + return eventObj; }) ); - failureCallback((function (data){ + failureCallback((function (data) { console.log("error from waterTotalByDateWithWeight"); })) }) diff --git a/WebUtils/src/org/labkey/webutils/view/JspPage.jsp b/WebUtils/src/org/labkey/webutils/view/JspPage.jsp index 8c1bcba2e..b10629329 100644 --- a/WebUtils/src/org/labkey/webutils/view/JspPage.jsp +++ b/WebUtils/src/org/labkey/webutils/view/JspPage.jsp @@ -170,7 +170,17 @@ // Use a try block to ensure that we always show the hidden div. try { if ($numberOfRenders == 0){ - ko.applyBindings(WebUtils.VM); + if (unBindComponents.length == 0){ + ko.applyBindings(WebUtils.VM); + }else{ + for(var i =0; i