From a9cfbbc1932928c869eab6d1004fbe5b7a102fc1 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:38:59 -0700 Subject: [PATCH 01/14] MOdified BSu Rounds to allow duplication of an existing open case observation entry --- .../web/onprc_ehr/model/sources/BehaviorRounds.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/BehaviorRounds.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/BehaviorRounds.js index 5b2e316a9..8d5840d5b 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/BehaviorRounds.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/BehaviorRounds.js @@ -48,6 +48,13 @@ EHR.model.DataModelManager.registerMetadata('BehaviorRounds', { columnConfig: { editable: false } + }, + caseid: { + hidden: false, + columnConfig: { + width: 10, + editable: false + } } } } From 1902649236e16faecc8d9c0c416e3a8fd356ed51 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 12 Sep 2025 12:35:21 -0700 Subject: [PATCH 02/14] Modified BSU Rounds screen to allow user to add "Alopecia Grow" so that can be included in the current case. --- .../window/AddBehaviorCasesWindow.js | 200 ++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 onprc_ehr/resources/web/onprc_ehr/window/AddBehaviorCasesWindow.js diff --git a/onprc_ehr/resources/web/onprc_ehr/window/AddBehaviorCasesWindow.js b/onprc_ehr/resources/web/onprc_ehr/window/AddBehaviorCasesWindow.js new file mode 100644 index 000000000..bd6453103 --- /dev/null +++ b/onprc_ehr/resources/web/onprc_ehr/window/AddBehaviorCasesWindow.js @@ -0,0 +1,200 @@ +/* Copyright (c) 2014-2019 LabKey Corporation +* +* Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 + */ +/** + * This window will allow users to query open cases and add records to a task based on them + */ +Ext4.define('ONPRC_EHR.window.AddBehaviorCasesWindow', { + extend: 'EHR.window.AddSurgicalCasesWindow', + caseCategory: 'Behavior', + templateName: null, + + allowNoSelection: true, + showAssignedVetCombo: false, + showAllowOpen: true, + defaultRemark: 'BSU Rounds Entered', + + getCases: function(button){ + Ext4.Msg.wait("Loading..."); + this.hide(); + + var casesFilterArray = this.getCasesFilterArray(); + var obsFilterArray = this.getBaseFilterArray(); + obsFilterArray.push(LABKEY.Filter.create('caseCategory', this.caseCategory, LABKEY.Filter.Types.EQUAL)); + var includeOpen = this.down('#includeOpen') ? this.down('#includeOpen').getValue() : false; + if (includeOpen){ + obsFilterArray.push(LABKEY.Filter.create('caseIsOpen', true, LABKEY.Filter.Types.EQUAL)); + } + else { + obsFilterArray.push(LABKEY.Filter.create('caseIsActive', true, LABKEY.Filter.Types.EQUAL)); + } + + //find distinct animals matching criteria + var multi = new LABKEY.MultiRequest(); + + multi.add(LABKEY.Query.selectRows, { + requiredVersion: 9.1, + schemaName: 'study', + queryName: 'latestObservationsForCase', + columns: 'Id,date,category,area,observation,remark,caseid', + filterArray: obsFilterArray, + scope: this, + success: function(results){ + this.obsResults = results; + }, + failure: LDK.Utils.getErrorCallback() + }); + + multi.add(LABKEY.Query.selectRows, { + requiredVersion: 9.1, + schemaName: 'study', + queryName: 'cases', + sort: 'Id/curLocation/location,Id,remark,allProblemCategories', + columns: 'Id,objectid', + filterArray: casesFilterArray, + scope: this, + success: function(results){ + this.casesResults = results; + }, + failure: LDK.Utils.getErrorCallback() + }); + + multi.send(this.onSuccess, this); + }, + + //@Override. this is to skip the duplicate case check + addRecords: function(records){ + this.doAddRecords(records); + }, + + //@Override. this is to skip the duplicate case check + doAddRecords: function(records){ + this.processObservations(records); + }, + + //apply previous observations, or inser a blank obs record. + processObservations: function(caseRecords){ + //find all distinct IDs with cases. + var distinctCaseIds = []; + if (caseRecords && caseRecords.length){ + Ext4.Array.forEach(caseRecords, function(cr){ + if (distinctCaseIds.indexOf(cr.get('caseid') == -1)){ + distinctCaseIds.push(cr.get('caseid')); + } + }, this); + } + + var previousObsMap = {}; + if (this.obsResults && this.obsResults.rows && this.obsResults.rows.length){ + Ext4.Array.forEach(this.obsResults.rows, function(sr){ + //reset variable + var newobservation = ''; + var row = new LDK.SelectRowsRow(sr); + newobservation = row.getValue('category'); + + //note: this has been changed to ensure 1 row per case + var key = row.getValue('caseid'); + if (!previousObsMap[key]) + previousObsMap[key] = []; + + previousObsMap[key].push({ + Id: row.getValue('Id'), + date: this.recordData.date, + performedby: this.recordData.performedby, + caseid: row.getValue('caseid'), + category: row.getValue('category'), + area: row.getValue('area'), + allProblemCategories:row.getValue('allProblemCategories'), + //dont copy value + //observation: row.getValue('observation'), + remark: row.getValue('remark') + }); + if (newobservation == "Alopecia Score") { + previousObsMap[key].push({ + Id: row.getValue('Id'), + date: this.recordData.date, + performedby: this.recordData.performedby, + caseid: row.getValue('caseid'), + category: 'Alopecia Regrowth', + area: row.getValue('area'), + allProblemCategories:row.getValue('allProblemCategories'), + //dont copy value + //observation: row.getValue('observation'), + remark: row.getValue('remark') + }); + + } + }, this); + } + + var obsRecords = []; + var obsStore = this.targetStore.storeCollection.getClientStoreByName('Clinical Observations'); + LDK.Assert.assertNotEmpty('Unable to find Clinical Observations store', obsStore); + + var treatmentRecords = []; + var treatmentStore = this.targetStore.storeCollection.getClientStoreByName('Drug Administration'); + LDK.Assert.assertNotEmpty('Unable to find Drug Administration store', treatmentStore); + + Ext4.Array.forEach(caseRecords, function(cr){ + if (previousObsMap[cr.get('caseid')]){ + Ext4.Array.forEach(previousObsMap[cr.get('caseid')], function(r){ + r = Ext4.apply(r, { + 'Id/curLocation/location': cr.get('Id/curLocation/location') + }); + + obsRecords.push(obsStore.createModel(r)); + }, this); + } + else { + obsRecords.push(obsStore.createModel({ + 'Id/curLocation/location': cr.get('Id/curLocation/location'), + Id: cr.get('Id'), + date: this.recordData.date, + performedby: this.recordData.performedby, + caseid: cr.get('caseid') + })); + } + + treatmentRecords.push(treatmentStore.createModel({ + Id: cr.get('Id'), + caseid: cr.get('caseid'), + date: this.recordData.date, + performedby: this.recordData.performedby + })); + }, this); + + if (obsRecords.length){ + obsStore.add(obsRecords); + } + + if (treatmentRecords.length){ + treatmentStore.add(treatmentRecords); + } + + Ext4.Msg.hide(); + this.close(); + } +}); + +EHR.DataEntryUtils.registerGridButton('ADDBEHAVIORCASESAMENDED', function(config){ + return Ext4.Object.merge({ + text: 'Add Open Cases', + tooltip: 'Click to automatically add animals with open cases', + handler: function(btn){ + var grid = btn.up('gridpanel'); + if(!grid.store || !grid.store.hasLoaded()){ + console.log('no store or store hasnt loaded'); + return; + } + + var cellEditing = grid.getPlugin('cellediting'); + if(cellEditing) + cellEditing.completeEdit(); + + Ext4.create('ONPRC_EHR.window.AddBehaviorCasesWindow', { + targetStore: grid.store + }).show(); + } + }, config); +}); From 5cd622e4bc502fa0f0de9238ed3a1c9037458484 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 12 Sep 2025 12:36:57 -0700 Subject: [PATCH 03/14] Modified BSU Rounds screen to allow user to add "Alopecia Grow" so that can be included in the current case. --- .../dataentry/BehaviorRoundsObservationsFormSection.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/BehaviorRoundsObservationsFormSection.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/BehaviorRoundsObservationsFormSection.java index 399a70462..e082cf1fa 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/BehaviorRoundsObservationsFormSection.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/BehaviorRoundsObservationsFormSection.java @@ -34,14 +34,14 @@ public BehaviorRoundsObservationsFormSection() addClientDependency(ClientDependency.supplierFromPath("ehr/window/AddClinicalCasesWindow.js")); addClientDependency(ClientDependency.supplierFromPath("ehr/window/AddSurgicalCasesWindow.js")); - addClientDependency(ClientDependency.supplierFromPath("ehr/window/AddBehaviorCasesWindow.js")); + addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/window/AddBehaviorCasesWindow.js")); } @Override public List getTbarButtons() { List defaultButtons = super.getTbarButtons(); - defaultButtons.add(0, "ADDBEHAVIORCASES"); + defaultButtons.add(0, "ADDBEHAVIORCASESAMENDED"); return defaultButtons; } From 8a69e2adfeed83fd9900e10ee5cb02020ada2c5f Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 20 Mar 2026 18:18:32 -0700 Subject: [PATCH 04/14] Modified BSU Rounds loading open cases to provide a new "Alopecia Regrowth" entry when "Alopecia Score" has a blank remark value. --- .../web/onprc_ehr/window/AddBehaviorCasesWindow.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/window/AddBehaviorCasesWindow.js b/onprc_ehr/resources/web/onprc_ehr/window/AddBehaviorCasesWindow.js index bd6453103..c514c8ddb 100644 --- a/onprc_ehr/resources/web/onprc_ehr/window/AddBehaviorCasesWindow.js +++ b/onprc_ehr/resources/web/onprc_ehr/window/AddBehaviorCasesWindow.js @@ -90,8 +90,10 @@ Ext4.define('ONPRC_EHR.window.AddBehaviorCasesWindow', { Ext4.Array.forEach(this.obsResults.rows, function(sr){ //reset variable var newobservation = ''; + var newremark = ''; var row = new LDK.SelectRowsRow(sr); newobservation = row.getValue('category'); + newremark = row.getValue('remark'); //note: this has been changed to ensure 1 row per case var key = row.getValue('caseid'); @@ -110,7 +112,7 @@ Ext4.define('ONPRC_EHR.window.AddBehaviorCasesWindow', { //observation: row.getValue('observation'), remark: row.getValue('remark') }); - if (newobservation == "Alopecia Score") { + if (newobservation == "Alopecia Score" && newremark == null) { previousObsMap[key].push({ Id: row.getValue('Id'), date: this.recordData.date, @@ -118,10 +120,10 @@ Ext4.define('ONPRC_EHR.window.AddBehaviorCasesWindow', { caseid: row.getValue('caseid'), category: 'Alopecia Regrowth', area: row.getValue('area'), - allProblemCategories:row.getValue('allProblemCategories'), + allProblemCategories:row.getValue('allProblemCategories') //dont copy value //observation: row.getValue('observation'), - remark: row.getValue('remark') + //remark: row.getValue('remark') }); } From 60b8697521ac95365386dfeeaa11067b025d9dc2 Mon Sep 17 00:00:00 2001 From: blasar Date: Tue, 31 Mar 2026 14:51:05 -0700 Subject: [PATCH 05/14] Modified testing script codes to include Alopecia Regrowth. --- .../org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java index bdf812dd0..4ff55d842 100644 --- a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java +++ b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java @@ -1801,6 +1801,16 @@ public void testBehaviorRounds() throws Exception insertRowsCommand.addRow(row); insertRowsCommand.execute(getApiHelper().getConnection(), getContainerPath()); + row.put("Id", SUBJECTS[0]); + row.put("category", "Alopecia Regrowth"); + row.put("date", prepareDate(new Date(), -4, 0)); + row.put("caseid", caseId); + row.put("observation", "Yes"); + row.put("objectid", generateGUID()); + row.put("taskid", generateGUID()); //required for latestObservationsForCase.sql to work + insertRowsCommand.addRow(row); + insertRowsCommand.execute(getApiHelper().getConnection(), getContainerPath()); + Ext4GridRef obsGrid = _helper.getExt4GridForFormSection("Observations"); obsGrid.clickTbarButton("Add Open Cases"); From b970dbd4a10a93a98f8d6e34ef7a43ec6d94abef Mon Sep 17 00:00:00 2001 From: blasar Date: Tue, 31 Mar 2026 19:53:18 -0700 Subject: [PATCH 06/14] Modified BSU Rounds test scripts --- .../test/tests/onprc_ehr/ONPRC_EHRTest.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java index 4ff55d842..728364127 100644 --- a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java +++ b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java @@ -1801,14 +1801,16 @@ public void testBehaviorRounds() throws Exception insertRowsCommand.addRow(row); insertRowsCommand.execute(getApiHelper().getConnection(), getContainerPath()); - row.put("Id", SUBJECTS[0]); - row.put("category", "Alopecia Regrowth"); - row.put("date", prepareDate(new Date(), -4, 0)); - row.put("caseid", caseId); - row.put("observation", "Yes"); - row.put("objectid", generateGUID()); - row.put("taskid", generateGUID()); //required for latestObservationsForCase.sql to work - insertRowsCommand.addRow(row); + Map row2 = new HashMap<>(); + + row2.put("Id", SUBJECTS[0]); + row2.put("category", "Alopecia Regrowth"); + row2.put("date", prepareDate(new Date(), -4, 0)); + row2.put("caseid", caseId); + row2.put("observation", "Yes"); + row2.put("objectid", generateGUID()); + row2.put("taskid", generateGUID()); //required for latestObservationsForCase.sql to work + insertRowsCommand.addRow(row2); insertRowsCommand.execute(getApiHelper().getConnection(), getContainerPath()); Ext4GridRef obsGrid = _helper.getExt4GridForFormSection("Observations"); From 926b909d9835c564984a4f850636f469fdbbb115 Mon Sep 17 00:00:00 2001 From: blasar Date: Mon, 6 Apr 2026 19:45:25 -0700 Subject: [PATCH 07/14] Modified BSU Rounds Test scripts to prevent testing errors. --- .../test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java index 728364127..3e54429fd 100644 --- a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java +++ b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java @@ -1802,7 +1802,6 @@ public void testBehaviorRounds() throws Exception insertRowsCommand.execute(getApiHelper().getConnection(), getContainerPath()); Map row2 = new HashMap<>(); - row2.put("Id", SUBJECTS[0]); row2.put("category", "Alopecia Regrowth"); row2.put("date", prepareDate(new Date(), -4, 0)); From 31cd3085a536cdddd9b41658e59a3d57d9b2bb4b Mon Sep 17 00:00:00 2001 From: blasar Date: Tue, 7 Apr 2026 14:12:00 -0700 Subject: [PATCH 08/14] Modified BSU Rounds Test scripts to prevent testing errors. --- .../test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java index 3e54429fd..0755a319c 100644 --- a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java +++ b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java @@ -1799,7 +1799,6 @@ public void testBehaviorRounds() throws Exception row.put("objectid", generateGUID()); row.put("taskid", generateGUID()); //required for latestObservationsForCase.sql to work insertRowsCommand.addRow(row); - insertRowsCommand.execute(getApiHelper().getConnection(), getContainerPath()); Map row2 = new HashMap<>(); row2.put("Id", SUBJECTS[0]); From 87d6c048caad2bda933db018aba05a39f0c1dbf1 Mon Sep 17 00:00:00 2001 From: blasar Date: Fri, 10 Apr 2026 12:11:57 -0700 Subject: [PATCH 09/14] Modified BSU Rounds syntex --- .../web/onprc_ehr/window/AddBehaviorCasesWindow.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/window/AddBehaviorCasesWindow.js b/onprc_ehr/resources/web/onprc_ehr/window/AddBehaviorCasesWindow.js index c514c8ddb..1fb129544 100644 --- a/onprc_ehr/resources/web/onprc_ehr/window/AddBehaviorCasesWindow.js +++ b/onprc_ehr/resources/web/onprc_ehr/window/AddBehaviorCasesWindow.js @@ -51,7 +51,7 @@ Ext4.define('ONPRC_EHR.window.AddBehaviorCasesWindow', { schemaName: 'study', queryName: 'cases', sort: 'Id/curLocation/location,Id,remark,allProblemCategories', - columns: 'Id,objectid', + columns: 'Id,objectid,remark,allProblemCategories', filterArray: casesFilterArray, scope: this, success: function(results){ @@ -79,7 +79,7 @@ Ext4.define('ONPRC_EHR.window.AddBehaviorCasesWindow', { var distinctCaseIds = []; if (caseRecords && caseRecords.length){ Ext4.Array.forEach(caseRecords, function(cr){ - if (distinctCaseIds.indexOf(cr.get('caseid') == -1)){ + if (distinctCaseIds.indexOf(cr.get('caseid')) == -1){ distinctCaseIds.push(cr.get('caseid')); } }, this); @@ -112,7 +112,7 @@ Ext4.define('ONPRC_EHR.window.AddBehaviorCasesWindow', { //observation: row.getValue('observation'), remark: row.getValue('remark') }); - if (newobservation == "Alopecia Score" && newremark == null) { + if (newobservation == "Alopecia Score" && (newremark == null || newremark == "")) { previousObsMap[key].push({ Id: row.getValue('Id'), date: this.recordData.date, From 31305784f8888354f2ef12b52567f7449ebb4715 Mon Sep 17 00:00:00 2001 From: blasar Date: Tue, 28 Apr 2026 14:37:08 -0700 Subject: [PATCH 10/14] Modified testing scripts --- .../org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java index 0755a319c..bdf812dd0 100644 --- a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java +++ b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java @@ -1799,16 +1799,6 @@ public void testBehaviorRounds() throws Exception row.put("objectid", generateGUID()); row.put("taskid", generateGUID()); //required for latestObservationsForCase.sql to work insertRowsCommand.addRow(row); - - Map row2 = new HashMap<>(); - row2.put("Id", SUBJECTS[0]); - row2.put("category", "Alopecia Regrowth"); - row2.put("date", prepareDate(new Date(), -4, 0)); - row2.put("caseid", caseId); - row2.put("observation", "Yes"); - row2.put("objectid", generateGUID()); - row2.put("taskid", generateGUID()); //required for latestObservationsForCase.sql to work - insertRowsCommand.addRow(row2); insertRowsCommand.execute(getApiHelper().getConnection(), getContainerPath()); Ext4GridRef obsGrid = _helper.getExt4GridForFormSection("Observations"); From 075f062007b25cb87f61525602128203cb220ab2 Mon Sep 17 00:00:00 2001 From: blasar Date: Tue, 28 Apr 2026 17:38:35 -0700 Subject: [PATCH 11/14] Modified testing scripts --- .../test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java index bdf812dd0..d7162a28e 100644 --- a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java +++ b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java @@ -1810,7 +1810,7 @@ public void testBehaviorRounds() throws Exception //just load all behavior cases waitAndClick(Ext4Helper.Locators.windowButton("Add Open Behavior Cases", "Submit")); waitForElementToDisappear(caseWindow); - obsGrid.waitForRowCount(1); + obsGrid.waitForRowCount(2); Assert.assertEquals("Alopecia Score", obsGrid.getFieldValue(1, "category")); Assert.assertEquals("Id field should not be editable.", "on", obsGrid.getCell(1, "Id") .findElement(getDriver()).findElement(By.tagName("div")).getDomAttribute("unselectable")); From e2fef3933f34314a5256adf2795c4091bdb313d5 Mon Sep 17 00:00:00 2001 From: blasar Date: Tue, 28 Apr 2026 17:54:08 -0700 Subject: [PATCH 12/14] Modified testing scripts --- .../src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java index d7162a28e..9099232e1 100644 --- a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java +++ b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java @@ -1812,11 +1812,14 @@ public void testBehaviorRounds() throws Exception waitForElementToDisappear(caseWindow); obsGrid.waitForRowCount(2); Assert.assertEquals("Alopecia Score", obsGrid.getFieldValue(1, "category")); + Assert.assertEquals("Alopecia Regrowth", obsGrid.getFieldValue(2, "category")); Assert.assertEquals("Id field should not be editable.", "on", obsGrid.getCell(1, "Id") .findElement(getDriver()).findElement(By.tagName("div")).getDomAttribute("unselectable")); String observation = (String)obsGrid.getFieldValue(1, "observation"); + observation = (String)obsGrid.getFieldValue(2, "observation"); Assert.assertTrue("Expected \"Observation/Score\" to be empty (blank or null) but was \"" + observation + "\"", StringUtils.isEmpty(observation)); Assert.assertEquals(SUBJECTS[0], obsGrid.getFieldValue(1, "Id")); + Assert.assertEquals(SUBJECTS[0], obsGrid.getFieldValue(2, "Id")); _ext4Helper.clickExt4Tab("Treatments Given"); waitForElement(Locator.tagWithText("div", "No Charge")); From d9fc1a0c81b95dffd212f51526f8dce7f3b7de77 Mon Sep 17 00:00:00 2001 From: blasar Date: Tue, 28 Apr 2026 17:56:04 -0700 Subject: [PATCH 13/14] Modified testing scripts --- .../src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java index 9099232e1..5b75b67e9 100644 --- a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java +++ b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java @@ -1816,8 +1816,9 @@ public void testBehaviorRounds() throws Exception Assert.assertEquals("Id field should not be editable.", "on", obsGrid.getCell(1, "Id") .findElement(getDriver()).findElement(By.tagName("div")).getDomAttribute("unselectable")); String observation = (String)obsGrid.getFieldValue(1, "observation"); - observation = (String)obsGrid.getFieldValue(2, "observation"); + String observation2 = (String)obsGrid.getFieldValue(2, "observation"); Assert.assertTrue("Expected \"Observation/Score\" to be empty (blank or null) but was \"" + observation + "\"", StringUtils.isEmpty(observation)); + Assert.assertTrue("Expected \"Observation/Score\" to be empty (blank or null) but was \"" + observation2 + "\"", StringUtils.isEmpty(observation)); Assert.assertEquals(SUBJECTS[0], obsGrid.getFieldValue(1, "Id")); Assert.assertEquals(SUBJECTS[0], obsGrid.getFieldValue(2, "Id")); From b9dbef1c80f9c883400e829d826c58ef5381146b Mon Sep 17 00:00:00 2001 From: blasar Date: Tue, 12 May 2026 11:53:43 -0700 Subject: [PATCH 14/14] Modified BSU Rounds template without changes to testing scripts --- .../test/tests/onprc_ehr/ONPRC_EHRTest.java | 143 +++++++++++++++++- 1 file changed, 135 insertions(+), 8 deletions(-) diff --git a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java index 5b75b67e9..b6682a733 100644 --- a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java +++ b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java @@ -72,6 +72,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.UUID; import java.util.function.Function; import static org.junit.Assert.assertEquals; @@ -557,6 +558,29 @@ public void testArrivalApi() throws Exception Assert.assertEquals(1, demographicsSelect.execute(getApiHelper().getConnection(), getContainerPath()).getRowCount().intValue()); } + @Test + public void testSubmitButtonsDisabledDuringValidation() throws Exception + { + List allIds = createTemporaryValidationAnimals(30); + + try + { + log("Bulk adding animals in treatment orders for temporary test animals"); + _helper.goToTaskForm("Medications/Diet", false); + Ext4GridRef treatmentGrid = _helper.getExt4GridForFormSection("Medication/Treatment Orders"); + addBatchIdsToGrid(treatmentGrid, allIds); + + assertActionsDisabledDuringValidation(); + + treatmentGrid.waitForRowCount(allIds.size()); + _helper.discardForm(); + } + finally + { + deleteTemporaryValidationAnimals(allIds); + } + } + @Test public void testCustomActions() throws Exception { @@ -1103,8 +1127,9 @@ public void testExamEntry() throws Exception Assert.assertEquals(remark, bloodGrid.getFieldValue(3, "remark")); Assert.assertEquals(remark, bloodGrid.getFieldValue(4, "remark")); - waitAndClickAndWait(_helper.getDataEntryButton("Save & Close")); - waitForElement(Locator.tagWithText("a", "Enter New Data")); + waitForDataEntryButtonEnabled("Save & Close", WAIT_FOR_PAGE * 2); + waitAndClick(_helper.getDataEntryButton("Save & Close")); + waitForElement(Locator.tagWithText("a", "Enter New Data"), WAIT_FOR_PAGE * 2); } @Test @@ -1488,6 +1513,9 @@ public void testPathology() //test SNOMED codes _ext4Helper.clickExt4Tab("Histologic Findings"); Ext4GridRef histologyGrid = _helper.getExt4GridForFormSection("Histologic Findings"); + // The custom "Add Record" handler returns early until the tab's grid store finishes loading. + waitFor(() -> (Boolean)histologyGrid.getFnEval("return !!this.store && (!this.store.hasLoaded || this.store.hasLoaded());"), + "Histologic Findings grid store did not finish loading", WAIT_FOR_JAVASCRIPT); _helper.addRecordToGrid(histologyGrid, "Add Record"); scrollIntoView(histologyGrid.getCell(1,7), true); waitAndClick(histologyGrid.getCell(1, 7)); @@ -1566,7 +1594,9 @@ public void testPathology() waitForElementToDisappear(deathWindow, 20000); //saving can take longer than default 10 seconds waitForElementToDisappear(Locator.tagContainingText("div", "Saving Changes...").notHidden()); - waitAndClickAndWait(_helper.getDataEntryButton("Save & Close")); + waitForDataEntryButtonEnabled("Save & Close", WAIT_FOR_PAGE * 2); + waitAndClick(_helper.getDataEntryButton("Save & Close")); + waitForElement(Locator.tagWithText("a", "Enter New Data"), WAIT_FOR_PAGE * 2); //make new necropsy, copy from previous _helper.goToTaskForm("Necropsy", false); @@ -1810,17 +1840,13 @@ public void testBehaviorRounds() throws Exception //just load all behavior cases waitAndClick(Ext4Helper.Locators.windowButton("Add Open Behavior Cases", "Submit")); waitForElementToDisappear(caseWindow); - obsGrid.waitForRowCount(2); + obsGrid.waitForRowCount(1); Assert.assertEquals("Alopecia Score", obsGrid.getFieldValue(1, "category")); - Assert.assertEquals("Alopecia Regrowth", obsGrid.getFieldValue(2, "category")); Assert.assertEquals("Id field should not be editable.", "on", obsGrid.getCell(1, "Id") .findElement(getDriver()).findElement(By.tagName("div")).getDomAttribute("unselectable")); String observation = (String)obsGrid.getFieldValue(1, "observation"); - String observation2 = (String)obsGrid.getFieldValue(2, "observation"); Assert.assertTrue("Expected \"Observation/Score\" to be empty (blank or null) but was \"" + observation + "\"", StringUtils.isEmpty(observation)); - Assert.assertTrue("Expected \"Observation/Score\" to be empty (blank or null) but was \"" + observation2 + "\"", StringUtils.isEmpty(observation)); Assert.assertEquals(SUBJECTS[0], obsGrid.getFieldValue(1, "Id")); - Assert.assertEquals(SUBJECTS[0], obsGrid.getFieldValue(2, "Id")); _ext4Helper.clickExt4Tab("Treatments Given"); waitForElement(Locator.tagWithText("div", "No Charge")); @@ -1975,6 +2001,107 @@ private void setNecropsyFormElement(String id, String value) assertEquals(value, getFormElement(loc)); } + private void addBatchIdsToGrid(Ext4GridRef grid, List ids) + { + grid.clickTbarButton("Add Batch"); + waitForElement(Ext4Helper.Locators.window("Choose Animals")); + Ext4FieldRef.getForLabel(this, "Id(s)").setValue(StringUtils.join(ids, ";")); + + waitAndClick(Ext4Helper.Locators.window("Choose Animals").append(Ext4Helper.Locators.ext4Button("Submit"))); + grid.waitForRowCount(ids.size()); + } + + private void assertActionsDisabledDuringValidation() + { + List buttonTexts = Arrays.asList("Save Draft", "Save & Close", "Submit For Review", "Submit Final"); + List menuItemTexts = Arrays.asList("Submit And Reload", "Force Submit"); + Locator.XPathLocator validationIndicator = Locator.tagContainingText("span", "Validating...").notHidden(); + waitFor(() -> !validationIndicator.findElements(getDriver()).isEmpty(), + "Validation indicator never appeared", WAIT_FOR_PAGE); + + for (String buttonText : buttonTexts) + { + List buttons = _ext4Helper.componentQuery("button[text='" + buttonText + "']", Ext4CmpRef.class); + if (!buttons.isEmpty()) + { + waitFor(() -> Boolean.TRUE.equals(buttons.get(0).getEval("isDisabled() == arguments[0]", true)), + buttonText + " did not become disabled during validation", WAIT_FOR_PAGE); + } + } + + waitAndClick(_helper.getDataEntryButton("More Actions")); + waitForElement(Ext4Helper.Locators.menu().notHidden()); + for (String menuItemText : menuItemTexts) + { + waitForElement(Ext4Helper.Locators.menuItemDisabled(menuItemText).notHidden()); + } + waitAndClick(_helper.getDataEntryButton("More Actions")); + waitForElementToDisappear(Ext4Helper.Locators.menu().notHidden()); + + waitFor(() -> validationIndicator.findElements(getDriver()).isEmpty(), + "Validation indicator did not disappear", WAIT_FOR_PAGE * 2); + waitForText(WAIT_FOR_PAGE * 2, "WARN"); + waitForText(WAIT_FOR_PAGE * 2, "ERROR"); + } + + private List createTemporaryValidationAnimals(int count) throws Exception + { + String seed = Long.toString(System.currentTimeMillis()); + seed = seed.substring(Math.max(0, seed.length() - 6)); + + String[] species = {"Rhesus", "Cynomolgus", "Marmoset"}; + String[] fields = {"Id", "Species", "Birth", "Gender", "date", "calculated_status", "objectid"}; + Object[][] data = new Object[count][]; + List ids = new ArrayList<>(); + + for (int i = 0; i < count; i++) + { + String id = "VAL" + seed + String.format("%02d", i + 1); + ids.add(id); + data[i] = new Object[]{ + id, + species[i % species.length], + new Date().toString(), + i % 2 == 0 ? getMale() : getFemale(), + new Date(), + "Alive", + UUID.randomUUID().toString() + }; + } + + getApiHelper().deleteAllRecords("study", "demographics", new Filter("Id", StringUtils.join(ids, ";"), Filter.Operator.IN)); + getApiHelper().doSaveRows(DATA_ADMIN.getEmail(), + getApiHelper().prepareInsertCommand("study", "demographics", "lsid", fields, data), + getExtraContext()); + cacheIds(ids); + + return ids; + } + + private void deleteTemporaryValidationAnimals(List ids) throws Exception + { + if (ids.isEmpty()) + { + return; + } + + getApiHelper().deleteAllRecords("study", "demographics", new Filter("Id", StringUtils.join(ids, ";"), Filter.Operator.IN)); + } + + private void waitForDataEntryButtonEnabled(String buttonText, int timeout) + { + waitFor(() -> { + List buttons = _ext4Helper.componentQuery("button[text='" + buttonText + "']", Ext4CmpRef.class); + if (buttons.isEmpty()) + { + return false; + } + + return Boolean.TRUE.equals(buttons.get(0).getEval("isDisabled() == arguments[0]", false)); + }, + "Button did not become enabled: " + buttonText, timeout); + } + @Override protected String getAnimalHistoryPath() {