From 0c6e4b813c8067397ac4052b091501548e4e8271 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Sat, 27 Jul 2024 00:35:12 -0700 Subject: [PATCH 01/72] Modified Surgical Rounds form to add new program enhancements for Mike Ruez. --- .../study/clinical_observations.query.xml | 60 +++++ .../study/latestObservationsForCase.sql | 3 +- .../onprc_ehr/form/field/SimpleCheckCombo.js | 113 ++++++++++ .../grid/ObservationsRowEditorGridPanel.js | 207 ++++++++++++++++++ .../plugin/ClinicalRemarksRowEditor.js | 2 +- .../window/AddSurgicalCasesWindow.js | 196 +++++++++++++++++ .../org/labkey/onprc_ehr/ONPRC_EHRModule.java | 2 + .../SurgicalRoundsRemarksFormSection.java | 8 + 8 files changed, 589 insertions(+), 2 deletions(-) create mode 100644 onprc_ehr/resources/queries/study/clinical_observations.query.xml create mode 100644 onprc_ehr/resources/web/onprc_ehr/form/field/SimpleCheckCombo.js create mode 100644 onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js create mode 100644 onprc_ehr/resources/web/onprc_ehr/window/AddSurgicalCasesWindow.js diff --git a/onprc_ehr/resources/queries/study/clinical_observations.query.xml b/onprc_ehr/resources/queries/study/clinical_observations.query.xml new file mode 100644 index 000000000..d305b3ca2 --- /dev/null +++ b/onprc_ehr/resources/queries/study/clinical_observations.query.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + Category + + + Area + + ehr_lookups + observation_areas + value + + + + + Observation/Score + + + + study + encountersParent + objectid + + + + true + + + true + + + true + + + Code + true + + + Findings + true + + + Remarks + true + + +
+
+
+
\ No newline at end of file diff --git a/onprc_ehr/resources/queries/study/latestObservationsForCase.sql b/onprc_ehr/resources/queries/study/latestObservationsForCase.sql index 243372b65..7dedf7b76 100644 --- a/onprc_ehr/resources/queries/study/latestObservationsForCase.sql +++ b/onprc_ehr/resources/queries/study/latestObservationsForCase.sql @@ -24,7 +24,8 @@ SELECT c.category as caseCategory, c.isActive as caseIsActive, c.isOpen as caseIsOpen, - o.taskid + o.taskid, + o.findings FROM study.clinical_observations o JOIN study.cases c ON (c.objectid = o.caseid) diff --git a/onprc_ehr/resources/web/onprc_ehr/form/field/SimpleCheckCombo.js b/onprc_ehr/resources/web/onprc_ehr/form/field/SimpleCheckCombo.js new file mode 100644 index 000000000..a29b0d646 --- /dev/null +++ b/onprc_ehr/resources/web/onprc_ehr/form/field/SimpleCheckCombo.js @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2016-2017 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 + */ +/** + * Created: R.Blasa on 11/4/2016. + */ +Ext4.define('onprc_ehr.form.field.simplecheckcombo', { + extend: 'Ext.form.field.ComboBox', + alias: 'widget.onprc_simplecheckcombo', + + + nullCaption: '[Blank]', + expandToFitContent: true, + caseSensitive: false, + anyMatch: true, + typeAhead: true, + + initComponent: function(){ + Ext4.apply(this, { + displayField:'value', + valueField: 'value', + queryMode: 'local', + store: Ext4.create('LABKEY.ext4.data.Store', { + schemaName: 'sla', + queryName: 'Reference_Data', + columns: 'value', + sort: 'value', + filterArray: [ + LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), + LABKEY.Filter.create('ColumnName', 'NHPTrainingType', LABKEY.Filter.Types.EQUAL)], + autoLoad: true + }) + }); + + this.callParent(arguments); + + + + } +}); + + +Ext4.define('onprc_ehr.form.field.onprc_TrainingReason', { + extend: 'Ext.form.field.ComboBox', + alias: 'widget.onprc_TrainingReason', + + + nullCaption: '[Blank]', + expandToFitContent: true, + caseSensitive: false, + anyMatch: true, + typeAhead: true, + + initComponent: function(){ + Ext4.apply(this, { + displayField:'value', + valueField: 'value', + queryMode: 'local', + store: Ext4.create('LABKEY.ext4.data.Store', { + schemaName: 'sla', + queryName: 'Reference_Data', + columns: 'value', + sort: 'value', + filterArray: [ + LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), + LABKEY.Filter.create('ColumnName', 'TrainingReason', LABKEY.Filter.Types.EQUAL)], + autoLoad: true + }) + }); + + this.callParent(arguments); + + + + } +}); + +Ext4.define('onprc_ehr.form.field.onprc_TrainingResults', { + extend: 'Ext.form.field.ComboBox', + alias: 'widget.onprc_TrainingResults', + + + nullCaption: '[Blank]', + expandToFitContent: true, + caseSensitive: false, + anyMatch: true, + typeAhead: true, + + initComponent: function(){ + Ext4.apply(this, { + displayField:'value', + valueField: 'value', + queryMode: 'local', + store: Ext4.create('LABKEY.ext4.data.Store', { + schemaName: 'sla', + queryName: 'Reference_Data', + columns: 'value', + sort: 'value', + filterArray: [ + LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), + LABKEY.Filter.create('ColumnName', 'TrainingResults', LABKEY.Filter.Types.EQUAL)], + autoLoad: true + }) + }); + + this.callParent(arguments); + + + + } +}); \ No newline at end of file diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js new file mode 100644 index 000000000..92a58b6f1 --- /dev/null +++ b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js @@ -0,0 +1,207 @@ +/* + * Copyright (c) 2014-2019 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 + */ +/** + * This is used within the RowEditor in the clinical rounds form + * + * @cfg observationFilterArray + * + */ +Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { + extend: 'Ext.grid.Panel', + alias: 'widget.onprc_ehr-observationsroweditorgridpanel', + + initComponent: function(){ + Ext4.apply(this, { + columns: this.getColumns(), + boundRecord: null, + boundRecordId: null, + selModel: { + mode: 'MULTI' + }, + plugins: [{ + ptype: 'clinicalobservationscellediting', + pluginId: 'cellediting', + clicksToEdit: 1 + }], + dockedItems: [{ + xtype: 'toolbar', + position: 'top', + items: [{ + text: 'Add', + scope: this, + handler: function(btn){ + var rec = this.createModel(); + if (!rec) + return; + + this.store.add(rec); + this.getPlugin('cellediting').startEdit(rec, 0); + } + },{ + text: 'Remove', + scope: this, + handler: function(btn){ + var recs = this.getSelectionModel().getSelection(); + this.store.remove(recs); + } + }] + }] + }); + + this.callParent(); + + this.mon(this.remarkStore, 'update', this.onRecordUpdate, this); + }, + + createModel: function(data){ + var form = this.up('window').down('ehr-formpanel'); + var br = form.getRecord(); + LDK.Assert.assertNotEmpty('No bound record in ObservationsRowEditorGridPanel', br); + if (!br){ + Ext4.Msg.alert('Error', 'Unable to find record'); + return; + } + + LDK.Assert.assertNotEmpty('No animal Id in ObservationsRowEditorGridPanel', br.get('Id')); + if (!br.get('Id')){ + Ext4.Msg.alert('Error', 'No animal Id provided'); + return; + } + + return this.store.createModel(Ext4.apply({ + Id: br.get('Id'), + date: new Date(), + caseid: br.get('caseid') + }, data)); + }, + + getColumns: function(){ + return [{ + header: 'Category', + dataIndex: 'category', + editable: true, + renderer: function(value, cellMetaData, record){ + if (Ext4.isEmpty(value)){ + cellMetaData.tdCls = 'labkey-grid-cell-invalid'; + } + + return value; + }, + editor: { + xtype: 'labkey-combo', + editable: true, + displayField: 'value', + valueField: 'value', + forceSelection: true, + queryMode: 'local', + anyMaych: true, + store: { + type: 'labkey-store', + schemaName: 'ehr', + queryName: 'observation_types', + filterArray: this.observationFilterArray, + columns: 'value,editorconfig', + autoLoad: true + } + } + },{ + header: 'Area', + width: 200, + editable: true, + dataIndex: 'area', + editor: { + xtype: 'labkey-combo', + displayField: 'value', + valueField: 'value', + forceSelection: true, + queryMode: 'local', + anyMaych: true, + value: 'N/A', + store: { + type: 'labkey-store', + schemaName: 'ehr_lookups', + queryName: 'observation_areas', + autoLoad: true + } + } + },{ + header: 'Observation/Score', + width: 200, + editable: true, + dataIndex: 'observation', + renderer: function(value, cellMetaData, record){ + if (Ext4.isEmpty(value) && ['Vet Attention'].indexOf(record.get('category')) == -1){ + cellMetaData.tdCls = 'labkey-grid-cell-invalid'; + } + + return value; + }, + editor: { + xtype: 'textfield' + } + },{ + header: 'Findings', + width: 200, + editable: true, + dataIndex: 'findings', + editor: { + xtype: 'labkey-combo', + displayField: 'state', + valueField: 'state', + forceSelection: true, + defaultValue:'Normal', + queryMode: 'local', + anyMaych: true, + value: 'N/A', + store: { + type: 'labkey-store', + schemaName: 'ehr_lookups', + queryName: 'normal_abnormal', + autoLoad: true + } + } + },{ + header: 'Remarks', + width: 200, + editable: true, + dataIndex: 'remark', + editor: { + xtype: 'textarea', + width: 200, + height: 100 + } + }] + }, + + onRecordUpdate: function(store, rec){ + if (rec === this.boundRecord){ + var newId = rec.get('Id'); + var newDate = rec.get('date'); + + if (rec.get('Id') != this.boundRecordId){ + this.store.each(function(r){ + //update any record from the bound animal + if (r.get('Id') === this.boundRecordId){ + r.set({ + Id: newId, + date: newDate + }); + } + }, this); + } + } + }, + + loadRecord: function(rec){ + var id = rec.get('Id'); + + this.boundRecord = rec; + this.boundRecordId = rec.get('Id'); + + this.store.clearFilter(); + this.store.filter('Id', id); + } +}); \ No newline at end of file diff --git a/onprc_ehr/resources/web/onprc_ehr/plugin/ClinicalRemarksRowEditor.js b/onprc_ehr/resources/web/onprc_ehr/plugin/ClinicalRemarksRowEditor.js index 758c8d1ad..6d0b0202c 100644 --- a/onprc_ehr/resources/web/onprc_ehr/plugin/ClinicalRemarksRowEditor.js +++ b/onprc_ehr/resources/web/onprc_ehr/plugin/ClinicalRemarksRowEditor.js @@ -14,7 +14,7 @@ Ext4.define('ONPRC_EHR.plugin.ClinicalRemarksRowEditor', { xtype: 'ehr-observationsroweditorgridpanel', itemId: 'observationsPanel', remarkStore: this.cmp.store, - width: 500, + width: 600, store: store }; }, diff --git a/onprc_ehr/resources/web/onprc_ehr/window/AddSurgicalCasesWindow.js b/onprc_ehr/resources/web/onprc_ehr/window/AddSurgicalCasesWindow.js new file mode 100644 index 000000000..e334ada94 --- /dev/null +++ b/onprc_ehr/resources/web/onprc_ehr/window/AddSurgicalCasesWindow.js @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2013-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.AddSurgicalCasesWindow', { + extend: 'EHR.window.AddClinicalCasesWindow', + caseCategory: 'Surgery', + templateName: 'Surgical Rounds', + + allowNoSelection: true, + allowReviewAnimals: false, + showAssignedVetCombo: false, + caseDisplayField: 'remark', + caseEmptyText: 'No description available', + defaultRemark: 'Surgical rounds performed.', + + initComponent: function(){ + this.callParent(arguments); + + this.obsStore = this.targetStore.storeCollection.getClientStoreByName('Clinical Observations'); + LDK.Assert.assertNotEmpty('Unable to find targetStore in AddSurgicalCasesWindow', this.obsStore); + }, + + 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)); + 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/room_sortValue,Id/curLocation/cage_sortValue,Id,remark', + columns: 'Id,objectid,remark,Id/curLocation/location', + filterArray: casesFilterArray, + scope: this, + success: function(results){ + this.casesResults = results; + }, + failure: LDK.Utils.getErrorCallback() + }); + + multi.send(this.onSuccess, this); + }, + + onSuccess: function(){ + if (!this.casesResults || !this.casesResults.rows || !this.casesResults.rows.length){ + Ext4.Msg.hide(); + Ext4.Msg.alert('', 'No active cases were found' + (this.down('#excludeToday').getValue() ? ', excluding those reviewed today.' : '.')); + return; + } + + LDK.Assert.assertNotEmpty('Unable to find targetStore in AddSurgicalCasesWindow', this.targetStore); + + var records = []; + var idMap = {}; + this.caseRecordMap = {}; + this.recordData = { + performedby: this.down('#performedBy').getValue(), + date: this.down('#date').getValue() + }; + + Ext4.Array.each(this.casesResults.rows, function(sr){ + var row = new LDK.SelectRowsRow(sr); + idMap[row.getValue('Id')] = row; + this.caseRecordMap[row.getValue('objectid')] = row; + + var obj = { + Id: row.getValue('Id'), + date: this.recordData.date, + category: this.caseCategory, + s: null, + o: null, + a: null, + p: null, + caseid: row.getValue('objectid'), + remark: this.defaultRemark, + performedby: this.recordData.performedby, + 'Id/curLocation/location': row.getValue('Id/curLocation/location') + }; + + records.push(this.targetStore.createModel(obj)); + }, this); + + //check for dupes + this.addRecords(records); + }, + + doAddRecords: function(records){ + var toAdd = this.checkForExistingCases(records); + this.targetStore.add(toAdd); + if (toAdd.length){ + this.processObservations(records); + } + else { + this.onComplete(); + } + }, + + processObservations: function(records){ + var previousObsMap = {}; + if (this.obsResults && this.obsResults.rows && this.obsResults.rows.length){ + Ext4.Array.forEach(this.obsResults.rows, function(sr){ + var row = new LDK.SelectRowsRow(sr); + + var caseId = row.getValue('caseid'); + if (!previousObsMap[caseId]) + previousObsMap[caseId] = []; + + previousObsMap[caseId].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'), + observation: row.getValue('observation'), + remark: row.getValue('remark') + }); + }, this); + } + + var toAdd = []; + var recordsNeedingTemplate = []; + Ext4.Array.forEach(records, function(rec){ + var caseId = rec.get('caseid'); + if (previousObsMap[caseId]){ + Ext4.Array.forEach(previousObsMap[caseId], function(obsRec){ + toAdd.push(this.obsStore.createModel(obsRec)); + }, this); + } + else { + console.log('no existing obs'); + recordsNeedingTemplate.push(rec) + } + }, this); + + if (toAdd.length){ + this.obsStore.add(toAdd); + } + + if (recordsNeedingTemplate.length){ + this.applyObsTemplate(recordsNeedingTemplate); + } + else { + Ext4.Msg.hide(); + this.close(); + } + } +}); + +EHR.DataEntryUtils.registerGridButton('ADDSURGICALCASES', 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('EHR.window.AddSurgicalCasesWindow', { + targetStore: grid.store + }).show(); + } + }, config); +}); diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java b/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java index d30751f60..5604748b9 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java @@ -321,6 +321,8 @@ private void registerEHRResources() //Added: 10-12-2023 R.Blasa EHRService.get().registerClientDependency(ClientDependency.supplierFromPath("onprc_ehr/form/field/EnvironmentalField.js"), this); + //Added: 7-26-2024 R. Blasa + EHRService.get().registerClientDependency(ClientDependency.supplierFromPath("onprc_ehr/form/field/SimpleCheckCombo.js"), this); EHRService.get().registerReportLink(EHRService.REPORT_LINK_TYPE.housing, "List Single Housed Animals", this, DetailsURL.fromString("/query/executeQuery.view?schemaName=study&query.queryName=demographicsPaired&query.viewName=Single Housed"), "Commonly Used Queries"); EHRService.get().registerReportLink(EHRService.REPORT_LINK_TYPE.housing, "Find Animals Housed In A Given Room/Cage At A Specific Time", this, DetailsURL.fromString("/ehr/housingOverlaps.view?groupById=1"), "Commonly Used Queries"); diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsRemarksFormSection.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsRemarksFormSection.java index 68608d813..e568c3f82 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsRemarksFormSection.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsRemarksFormSection.java @@ -42,6 +42,10 @@ public SurgicalRoundsRemarksFormSection(EHRService.FORM_SECTION_LOCATION locatio addClientDependency(ClientDependency.supplierFromPath("ehr/window/AddSurgicalCasesWindow.js")); addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/window/BulkChangeCasesWindow.js")); + +// Modified: 7-26-2024 R. Blasa + addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/window/AddSurgicalCasesWindow.js")); + _showLocation = true; } @@ -52,6 +56,10 @@ public List getTbarButtons() defaultButtons.add(0, "ADDSURGICALCASES"); defaultButtons.add("BULK_CHANGE_CASES"); +// Added: 7-26-2024 R. Blasa + defaultButtons.add(0, "ADDSURGICALCASEST"); + + return defaultButtons; } } From c471618f7e3b9386472ff2e43c95ff28903a1c2b Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Wed, 31 Jul 2024 17:03:35 -0700 Subject: [PATCH 02/72] Modified Surgical rounds observation columns. --- .../resources/queries/study/latestObservationsForCase.sql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/onprc_ehr/resources/queries/study/latestObservationsForCase.sql b/onprc_ehr/resources/queries/study/latestObservationsForCase.sql index 7dedf7b76..cc61dbc96 100644 --- a/onprc_ehr/resources/queries/study/latestObservationsForCase.sql +++ b/onprc_ehr/resources/queries/study/latestObservationsForCase.sql @@ -25,7 +25,9 @@ SELECT c.isActive as caseIsActive, c.isOpen as caseIsOpen, o.taskid, - o.findings + o.inflammation, + o.bruising, + o.other FROM study.clinical_observations o JOIN study.cases c ON (c.objectid = o.caseid) From 0f02a71041d95f0bfdafd0f9377b12f9316eb84d Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Wed, 31 Jul 2024 17:32:56 -0700 Subject: [PATCH 03/72] Modified Surgical rounds observation columns. --- .../study/clinical_observations.query.xml | 10 +++++--- .../grid/ObservationsRowEditorGridPanel.js | 23 ++++++++++++++++++- .../window/AddSurgicalCasesWindow.js | 7 ++++-- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/onprc_ehr/resources/queries/study/clinical_observations.query.xml b/onprc_ehr/resources/queries/study/clinical_observations.query.xml index d305b3ca2..5cfffa845 100644 --- a/onprc_ehr/resources/queries/study/clinical_observations.query.xml +++ b/onprc_ehr/resources/queries/study/clinical_observations.query.xml @@ -45,11 +45,15 @@ Code true - - Findings + + Inflammation true - + + Brusing + true + + Remarks true diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js index 92a58b6f1..883cedd23 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js @@ -143,7 +143,28 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { xtype: 'textfield' } },{ - header: 'Findings', + header: 'Inflammation', + width: 200, + editable: true, + dataIndex: 'findings', + editor: { + xtype: 'labkey-combo', + displayField: 'state', + valueField: 'state', + forceSelection: true, + defaultValue:'Normal', + queryMode: 'local', + anyMaych: true, + value: 'N/A', + store: { + type: 'labkey-store', + schemaName: 'ehr_lookups', + queryName: 'normal_abnormal', + autoLoad: true + } + } + },{ + header: 'Bruising', width: 200, editable: true, dataIndex: 'findings', diff --git a/onprc_ehr/resources/web/onprc_ehr/window/AddSurgicalCasesWindow.js b/onprc_ehr/resources/web/onprc_ehr/window/AddSurgicalCasesWindow.js index e334ada94..69bd25c05 100644 --- a/onprc_ehr/resources/web/onprc_ehr/window/AddSurgicalCasesWindow.js +++ b/onprc_ehr/resources/web/onprc_ehr/window/AddSurgicalCasesWindow.js @@ -7,7 +7,7 @@ * This window will allow users to query open cases and add records to a task based on them */ Ext4.define('ONPRC_EHR.window.AddSurgicalCasesWindow', { - extend: 'EHR.window.AddClinicalCasesWindow', + extend: 'ONPRC_EHR.window.AddClinicalCasesWindow', caseCategory: 'Surgery', templateName: 'Surgical Rounds', @@ -41,7 +41,7 @@ Ext4.define('ONPRC_EHR.window.AddSurgicalCasesWindow', { requiredVersion: 9.1, schemaName: 'study', queryName: 'latestObservationsForCase', - columns: 'Id,date,category,area,observation,remark,caseid', + columns: 'Id,date,category,area,observation,inflammation,bruising,other, remark,caseid', filterArray: obsFilterArray, scope: this, success: function(results){ @@ -139,6 +139,9 @@ Ext4.define('ONPRC_EHR.window.AddSurgicalCasesWindow', { category: row.getValue('category'), area: row.getValue('area'), observation: row.getValue('observation'), + inflammation: row.getValue('inflammation'), + bruising: row.getValue('bruising'), + other: row.getValue('other'), remark: row.getValue('remark') }); }, this); From ba270de2aac5a1ea30b57d38de4417fcfb7dcda8 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Thu, 1 Aug 2024 14:27:05 -0700 Subject: [PATCH 04/72] Modified Surgical rounds observation columns. --- .../plugin/ClinicalRemarksRowEditor.js | 2 +- .../window/AddSurgicalCasesWindow.js | 6 +- .../SurgicalAmendedRemarksFormSection.java | 90 +++++++++++++++++++ .../SurgicalRoundsRemarksFormSection.java | 6 +- 4 files changed, 97 insertions(+), 7 deletions(-) create mode 100644 onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java diff --git a/onprc_ehr/resources/web/onprc_ehr/plugin/ClinicalRemarksRowEditor.js b/onprc_ehr/resources/web/onprc_ehr/plugin/ClinicalRemarksRowEditor.js index 6d0b0202c..1693ac767 100644 --- a/onprc_ehr/resources/web/onprc_ehr/plugin/ClinicalRemarksRowEditor.js +++ b/onprc_ehr/resources/web/onprc_ehr/plugin/ClinicalRemarksRowEditor.js @@ -11,7 +11,7 @@ Ext4.define('ONPRC_EHR.plugin.ClinicalRemarksRowEditor', { LDK.Assert.assertNotEmpty('Observations store not found', store); return { - xtype: 'ehr-observationsroweditorgridpanel', + xtype: 'onprc_ehr-observationsroweditorgridpanel', itemId: 'observationsPanel', remarkStore: this.cmp.store, width: 600, diff --git a/onprc_ehr/resources/web/onprc_ehr/window/AddSurgicalCasesWindow.js b/onprc_ehr/resources/web/onprc_ehr/window/AddSurgicalCasesWindow.js index 69bd25c05..4b2428cce 100644 --- a/onprc_ehr/resources/web/onprc_ehr/window/AddSurgicalCasesWindow.js +++ b/onprc_ehr/resources/web/onprc_ehr/window/AddSurgicalCasesWindow.js @@ -7,7 +7,7 @@ * This window will allow users to query open cases and add records to a task based on them */ Ext4.define('ONPRC_EHR.window.AddSurgicalCasesWindow', { - extend: 'ONPRC_EHR.window.AddClinicalCasesWindow', + extend: 'EHR.window.AddClinicalCasesWindow', caseCategory: 'Surgery', templateName: 'Surgical Rounds', @@ -176,7 +176,7 @@ Ext4.define('ONPRC_EHR.window.AddSurgicalCasesWindow', { } }); -EHR.DataEntryUtils.registerGridButton('ADDSURGICALCASES', function(config){ +EHR.DataEntryUtils.registerGridButton('ADDSURGICALCASEST', function(config){ return Ext4.Object.merge({ text: 'Add Open Cases', tooltip: 'Click to automatically add animals with open cases', @@ -191,7 +191,7 @@ EHR.DataEntryUtils.registerGridButton('ADDSURGICALCASES', function(config){ if(cellEditing) cellEditing.completeEdit(); - Ext4.create('EHR.window.AddSurgicalCasesWindow', { + Ext4.create('ONPRC_EHR.window.AddSurgicalCasesWindow', { targetStore: grid.store }).show(); } diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java new file mode 100644 index 000000000..ca4a17f3f --- /dev/null +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2013-2014 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.labkey.onprc_ehr.dataentry; + +import org.json.JSONObject; +import org.labkey.api.ehr.EHRService; +import org.labkey.api.ehr.dataentry.DataEntryFormContext; +import org.labkey.api.ehr.dataentry.SimpleFormSection; +import org.labkey.api.view.template.ClientDependency; + +import java.util.List; + +/** + * User: bimber + * Date: 4/27/13 + * Time: 10:54 AM + */ +public class SurgicalAmendedRemarksFormSection extends SimpleFormSection +{ + public SurgicalAmendedRemarksFormSection(String label, EHRService.FORM_SECTION_LOCATION location) + { + super("study", "Clinical Remarks", label, "ehr-roundsremarksgridpanel", location); + addClientDependency(ClientDependency.supplierFromPath("ehr/plugin/ClinicalObservationsCellEditing.js")); + addClientDependency(ClientDependency.supplierFromPath("ehr/panel/ClinicalRemarkPanel.js")); + addClientDependency(ClientDependency.supplierFromPath("ehr/grid/RoundsRemarksGridPanel.js")); + addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/grid/ObservationsRowEditorGridPanel.js")); + addClientDependency(ClientDependency.supplierFromPath("ehr/plugin/ClinicalRemarksRowEditor.js")); + addClientDependency(ClientDependency.supplierFromPath("ehr/data/ClinicalObservationsClientStore.js")); + addClientDependency(ClientDependency.supplierFromPath("ehr/buttons/roundsButtons.js")); + + + setTemplateMode(TEMPLATE_MODE.NONE); + } + + @Override + public List getTbarButtons() + { + List defaultButtons = super.getTbarButtons(); + defaultButtons.remove("COPYFROMSECTION"); + defaultButtons.remove("ADDRECORD"); + defaultButtons.remove("ADDANIMALS"); + + if (defaultButtons.contains("DELETERECORD")) + { + int idx = defaultButtons.indexOf("DELETERECORD"); + defaultButtons.remove("DELETERECORD"); + defaultButtons.add(idx, "ROUNDSDELETE"); + } + + defaultButtons.add("MARK_ROUNDS_REVIEWED"); + + return defaultButtons; + } + + @Override + public List getTbarMoreActionButtons() + { + List defaultButtons = super.getTbarMoreActionButtons(); + defaultButtons.remove("DUPLICATE"); + + return defaultButtons; + } + + @Override + public JSONObject toJSON(DataEntryFormContext ctx, boolean includeFormElements) + { + JSONObject ret = super.toJSON(ctx, includeFormElements); + + return ret; + } + + @Override + protected String getServerSort() + { + return "Id/curLocation/room,Id/curLocation/cage,Id"; + } +} diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsRemarksFormSection.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsRemarksFormSection.java index e568c3f82..2c9c55fba 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsRemarksFormSection.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsRemarksFormSection.java @@ -26,7 +26,7 @@ * Date: 7/7/13 * Time: 10:36 AM */ -public class SurgicalRoundsRemarksFormSection extends RoundsRemarksFormSection +public class SurgicalRoundsRemarksFormSection extends SurgicalAmendedRemarksFormSection { public SurgicalRoundsRemarksFormSection() { @@ -39,12 +39,13 @@ public SurgicalRoundsRemarksFormSection(EHRService.FORM_SECTION_LOCATION locatio setConfigSources(Collections.singletonList("Task")); addClientDependency(ClientDependency.supplierFromPath("ehr/window/AddClinicalCasesWindow.js")); - addClientDependency(ClientDependency.supplierFromPath("ehr/window/AddSurgicalCasesWindow.js")); +// addClientDependency(ClientDependency.supplierFromPath("ehr/window/AddSurgicalCasesWindow.js")); addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/window/BulkChangeCasesWindow.js")); // Modified: 7-26-2024 R. Blasa addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/window/AddSurgicalCasesWindow.js")); + addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/plugin/ClinicalRemarksRowEditor.js")); _showLocation = true; } @@ -53,7 +54,6 @@ public SurgicalRoundsRemarksFormSection(EHRService.FORM_SECTION_LOCATION locatio public List getTbarButtons() { List defaultButtons = super.getTbarButtons(); - defaultButtons.add(0, "ADDSURGICALCASES"); defaultButtons.add("BULK_CHANGE_CASES"); // Added: 7-26-2024 R. Blasa From 2bba90652fc99b02f8e144790101cc9ac55892c0 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Thu, 1 Aug 2024 18:37:17 -0700 Subject: [PATCH 05/72] Modified Surgical rounds observation columns. --- .../plugin/ClinicalRemarksRowEditor.js | 4 ++-- .../SurgicalAmendedRemarksFormSection.java | 20 +++++++++---------- .../SurgicalRoundsRemarksFormSection.java | 4 ++-- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/plugin/ClinicalRemarksRowEditor.js b/onprc_ehr/resources/web/onprc_ehr/plugin/ClinicalRemarksRowEditor.js index 1693ac767..586985ee8 100644 --- a/onprc_ehr/resources/web/onprc_ehr/plugin/ClinicalRemarksRowEditor.js +++ b/onprc_ehr/resources/web/onprc_ehr/plugin/ClinicalRemarksRowEditor.js @@ -11,7 +11,7 @@ Ext4.define('ONPRC_EHR.plugin.ClinicalRemarksRowEditor', { LDK.Assert.assertNotEmpty('Observations store not found', store); return { - xtype: 'onprc_ehr-observationsroweditorgridpanel', + xtype: 'ehr-observationsroweditorgridpanel', itemId: 'observationsPanel', remarkStore: this.cmp.store, width: 600, @@ -21,7 +21,7 @@ Ext4.define('ONPRC_EHR.plugin.ClinicalRemarksRowEditor', { getDetailsPanelCfg: function(){ return { - xtype: 'onprc_ehr-animaldetailsextendedpanel', + xtype: 'ehr-animaldetailsextendedpanel', itemId: 'detailsPanel' } }, diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java index ca4a17f3f..90230cbe1 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java @@ -23,24 +23,22 @@ import java.util.List; -/** - * User: bimber - * Date: 4/27/13 - * Time: 10:54 AM - */ +// Created: 8-1-2024 R. Blasa public class SurgicalAmendedRemarksFormSection extends SimpleFormSection { public SurgicalAmendedRemarksFormSection(String label, EHRService.FORM_SECTION_LOCATION location) { - super("study", "Clinical Remarks", label, "ehr-roundsremarksgridpanel", location); - addClientDependency(ClientDependency.supplierFromPath("ehr/plugin/ClinicalObservationsCellEditing.js")); + super("study", "Clinical Remarks", label, "onprc_ehr-roundsremarksgridpanel", location); +// addClientDependency(ClientDependency.supplierFromPath("onpc_ehr/plugin/ClinicalObservationsCellEditing.js")); addClientDependency(ClientDependency.supplierFromPath("ehr/panel/ClinicalRemarkPanel.js")); - addClientDependency(ClientDependency.supplierFromPath("ehr/grid/RoundsRemarksGridPanel.js")); - addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/grid/ObservationsRowEditorGridPanel.js")); - addClientDependency(ClientDependency.supplierFromPath("ehr/plugin/ClinicalRemarksRowEditor.js")); + addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/grid/RoundsRemarksGridPanel.js")); + addClientDependency(ClientDependency.supplierFromPath("ehr/grid/ObservationsRowEditorGridPanel.js")); +// MOdified: 8-1-2024 so that contents reset as ehr control types + addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/plugin/ClinicalRemarksRowEditor.js")); + addClientDependency(ClientDependency.supplierFromPath("ehr/data/ClinicalObservationsClientStore.js")); addClientDependency(ClientDependency.supplierFromPath("ehr/buttons/roundsButtons.js")); - +// addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/panel/AnimalDetailsExtendedPanel.js")); setTemplateMode(TEMPLATE_MODE.NONE); } diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsRemarksFormSection.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsRemarksFormSection.java index 2c9c55fba..ab714cbc0 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsRemarksFormSection.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsRemarksFormSection.java @@ -39,13 +39,13 @@ public SurgicalRoundsRemarksFormSection(EHRService.FORM_SECTION_LOCATION locatio setConfigSources(Collections.singletonList("Task")); addClientDependency(ClientDependency.supplierFromPath("ehr/window/AddClinicalCasesWindow.js")); -// addClientDependency(ClientDependency.supplierFromPath("ehr/window/AddSurgicalCasesWindow.js")); addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/window/BulkChangeCasesWindow.js")); // Modified: 7-26-2024 R. Blasa addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/window/AddSurgicalCasesWindow.js")); - addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/plugin/ClinicalRemarksRowEditor.js")); +// addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/plugin/ClinicalRemarksRowEditor.js")); +// addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/grid/ObservationsRowEditorGridPanel.js")); _showLocation = true; } From dfbb639b65833af4a69cd9a5287d8da2b1d62908 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Thu, 1 Aug 2024 19:03:51 -0700 Subject: [PATCH 06/72] Modified Surgical rounds observation columns. --- .../grid/ObservationsRowEditorGridPanel.js | 2 +- .../grid/SurgicalRoundsRemarksGridPanel.js | 109 ++++++++++++++++++ .../plugin/SurgicalRemarksRowEditor.js | 98 ++++++++++++++++ .../SurgicalAmendedRemarksFormSection.java | 6 +- 4 files changed, 211 insertions(+), 4 deletions(-) create mode 100644 onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js create mode 100644 onprc_ehr/resources/web/onprc_ehr/plugin/SurgicalRemarksRowEditor.js diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js index 883cedd23..1ddbe8c46 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js @@ -22,7 +22,7 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { mode: 'MULTI' }, plugins: [{ - ptype: 'clinicalobservationscellediting', + ptype: 'onprc_ehr-clinicalobservationscellediting', pluginId: 'cellediting', clicksToEdit: 1 }], diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js new file mode 100644 index 000000000..1ae4a851a --- /dev/null +++ b/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2014-2019 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 + */ +/** + * Created to allow a custom row editor plugin and column that summarize observations + */ +Ext4.define('ONPRC_EHR.grid.SurgicalRoundsRemarksGridPanel', { + extend: 'EHR.grid.Panel', + alias: 'widget.onprc_ehr-surgroundsremarksgridpanel', + + + initComponent: function(){ + this.callParent(arguments); + + this.obsStore = this.store.storeCollection.getClientStoreByName('Clinical Observations'); + LDK.Assert.assertNotEmpty('Unable to find clinical observations store', this.obsStore); + + this.mon(this.obsStore, 'update', this.onObsStoreChange, this, {buffer: 400}); + this.mon(this.obsStore, 'remove', this.onObsStoreChange, this, {buffer: 400}); + this.mon(this.obsStore, 'add', this.onObsStoreChange, this, {buffer: 400}); + }, + + onObsStoreChange: function(store, rec){ + console.log('refresh remark grid'); + this.getView().refresh(); + }, + + getRowEditorPlugin: function(){ + if (this.rowEditorPlugin) + return this.rowEditorPlugin; + + this.rowEditorPlugin = Ext4.create('ONPRC_EHR.plugin.SurgicalRemarksRowEditor', { + cmp: this + }); + + return this.rowEditorPlugin; + }, + + configureColumns: function(){ + this.callParent(arguments); + + this.columns.push({ + name: 'observations', + header: 'Observations', + width: 400, + renderer: function(value, cellMetaData, record, rowIndex, colIndex, store){ + if (!this.obsStore){ + this.obsStore = store.storeCollection.getClientStoreByName('Clinical Observations'); + } + LDK.Assert.assertNotEmpty('Unable to find clinical observations store', this.obsStore); + + if (this.obsStore){ + var id = record.get('Id'); + var caseid = record.get('caseid'); + var date = record.get('date') ? Ext4.util.Format.date(record.get('date'),LABKEY.extDefaultDateFormat) : null; + var data = this.obsStore.snapshot || this.obsStore.data; + + var lines = []; + data.each(function(r){ + var rowDate = r.get('date') ? Ext4.util.Format.date(r.get('date'), LABKEY.extDefaultDateFormat) : null; + if (id !== r.get('Id') || rowDate !== date || caseid != r.get('caseid')){ + return; + } + + var line = ''; + var prefix = ''; + var suffix = ''; + + if (r.get('category')){ + line += r.get('category') + ': '; + + if (r.get('category') == 'Vet Attention'){ + prefix = ''; + suffix = ''; + } + else if (r.get('category') == 'Reviewed'){ + prefix = ''; + suffix = ''; + } + } + + if (!Ext4.isEmpty(r.get('observation'))){ + line += r.get('observation'); + } + + if (r.get('remark')){ + line += '. ' + r.get('remark'); + } + + if (!r.get('remark') && Ext4.isEmpty(r.get('observation'))){ + if (['Vet Attention', 'Reviewed'].indexOf(r.get('category')) == -1) + line += '  '; + } + + if (line){ + lines.push(prefix + line + suffix); + } + }, this); + + return lines.join('
'); + } + + return ''; + } + }); + } +}); \ No newline at end of file diff --git a/onprc_ehr/resources/web/onprc_ehr/plugin/SurgicalRemarksRowEditor.js b/onprc_ehr/resources/web/onprc_ehr/plugin/SurgicalRemarksRowEditor.js new file mode 100644 index 000000000..e20f46c53 --- /dev/null +++ b/onprc_ehr/resources/web/onprc_ehr/plugin/SurgicalRemarksRowEditor.js @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2013-2019 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 + */ +Ext4.define('ONPRC_EHR.plugin.SurgicalRemarksRowEditor', { + extend: 'EHR.plugin.RowEditor', + + getObservationPanelCfg: function(){ + var store = this.cmp.dataEntryPanel.storeCollection.getClientStoreByName('Clinical Observations'); + LDK.Assert.assertNotEmpty('Observations store not found', store); + + return { + xtype: 'ehr-observationsroweditorgridpanel', + itemId: 'observationsPanel', + remarkStore: this.cmp.store, + width: 600, + store: store + }; + }, + + getDetailsPanelCfg: function(){ + return { + xtype: 'ehr-animaldetailsextendedpanel', + itemId: 'detailsPanel' + } + }, + + onWindowClose: function(){ + this.callParent(arguments); + this.getEditorWindow().down('#observationsPanel').store.clearFilter(); + + }, + + getFormPanelCfg: function(){ + var ret = this.callParent(arguments); + ret.maxFieldWidth = 500; + + return ret; + }, + + getWindowCfg: function(){ + var ret = this.callParent(arguments); + + var formCfg = ret.items[0].items[1]; + //NOTE: added to avoid splitting form into 2 columns + formCfg.maxItemsPerCol = 100; + ret.items[0].items[1] = { + xtype: 'panel', + layout: 'column', + defaults: { + border: false + }, + border: false, + items: [formCfg, this.getObservationPanelCfg()] + }; + + ret.width = 1050; + return ret; + }, + + getWindowButtons: function(){ + var buttons = this.callParent(arguments); + + buttons.unshift({ + text: 'Mark Reviewed', + handler: function(btn){ + var win = btn.up('window'); + var form = win.down('#formPanel'); + var record = form.getBoundRecord(); + if (!record){ + return; + } + + var obsStore = record.store.storeCollection.getClientStoreByName('Clinical Observations'); + LDK.Assert.assertNotEmpty('Unable to find clinical_observations store in ClinicalRemarksRowEditor', obsStore); + LDK.Assert.assertNotEmpty('No caseid in bound record in ClinicalRemarksRowEditor', form.getRecord().get('caseid')); + + obsStore.add(obsStore.createModel({ + Id: form.getRecord().get('Id'), + date: new Date(), + caseid: form.getRecord().get('caseid'), + category: 'Reviewed', + area: 'N/A', + observation: LABKEY.Security.currentUser.displayName + })); + }, + scope: this + }); + + return buttons; + }, + + loadRecord: function(record){ + this.callParent(arguments); + this.getEditorWindow().down('#observationsPanel').loadRecord(record); + } +}); \ No newline at end of file diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java index 90230cbe1..bfd98302f 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java @@ -28,13 +28,13 @@ public class SurgicalAmendedRemarksFormSection extends SimpleFormSection { public SurgicalAmendedRemarksFormSection(String label, EHRService.FORM_SECTION_LOCATION location) { - super("study", "Clinical Remarks", label, "onprc_ehr-roundsremarksgridpanel", location); + super("study", "Clinical Remarks", label, "onprc_ehr-surgroundsremarksgridpanel", location); // addClientDependency(ClientDependency.supplierFromPath("onpc_ehr/plugin/ClinicalObservationsCellEditing.js")); addClientDependency(ClientDependency.supplierFromPath("ehr/panel/ClinicalRemarkPanel.js")); - addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/grid/RoundsRemarksGridPanel.js")); + addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js")); addClientDependency(ClientDependency.supplierFromPath("ehr/grid/ObservationsRowEditorGridPanel.js")); // MOdified: 8-1-2024 so that contents reset as ehr control types - addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/plugin/ClinicalRemarksRowEditor.js")); + addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/plugin/SurgicalRemarksRowEditor.js")); addClientDependency(ClientDependency.supplierFromPath("ehr/data/ClinicalObservationsClientStore.js")); addClientDependency(ClientDependency.supplierFromPath("ehr/buttons/roundsButtons.js")); From 6243e54a37e716b3b7504cab3233a29e08b68229 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 16 Aug 2024 14:44:43 -0700 Subject: [PATCH 07/72] Modified Surgical Rounds input form to include new Clinical Observation input columns. --- .../grid/ObservationsRowEditorGridPanel.js | 73 ++++++++++++------- .../plugin/ClinicalRemarksRowEditor.js | 4 +- .../plugin/SurgicalRemarksRowEditor.js | 4 +- .../SurgicalAmendedRemarksFormSection.java | 6 +- 4 files changed, 55 insertions(+), 32 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js index 1ddbe8c46..0e26f128a 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js @@ -22,7 +22,7 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { mode: 'MULTI' }, plugins: [{ - ptype: 'onprc_ehr-clinicalobservationscellediting', + ptype: 'clinicalobservationscellediting', pluginId: 'cellediting', clicksToEdit: 1 }], @@ -143,31 +143,32 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { xtype: 'textfield' } },{ - header: 'Inflammation', - width: 200, - editable: true, - dataIndex: 'findings', - editor: { - xtype: 'labkey-combo', - displayField: 'state', - valueField: 'state', - forceSelection: true, - defaultValue:'Normal', - queryMode: 'local', - anyMaych: true, - value: 'N/A', - store: { - type: 'labkey-store', - schemaName: 'ehr_lookups', - queryName: 'normal_abnormal', - autoLoad: true - } - } - },{ - header: 'Bruising', + header: 'inflammtion', + width: 200, + editable: true, + dataIndex: 'inflammation', + editor: { + xtype: 'labkey-combo', + displayField: 'state', + valueField: 'state', + forceSelection: true, + defaultValue:'Normal', + queryMode: 'local', + anyMaych: true, + value: 'N/A', + store: { + type: 'labkey-store', + schemaName: 'ehr_lookups', + queryName: 'normal_abnormal', + autoLoad: true + } + } + },{ + + header: 'bruising', width: 200, editable: true, - dataIndex: 'findings', + dataIndex: 'bruising', editor: { xtype: 'labkey-combo', displayField: 'state', @@ -184,7 +185,29 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { autoLoad: true } } - },{ + },{ + + header: 'other', + width: 200, + editable: true, + dataIndex: 'other', + editor: { + xtype: 'labkey-combo', + displayField: 'state', + valueField: 'state', + forceSelection: true, + defaultValue:'Normal', + queryMode: 'local', + anyMaych: true, + value: 'N/A', + store: { + type: 'labkey-store', + schemaName: 'ehr_lookups', + queryName: 'normal_abnormal', + autoLoad: true + } + } + },{ header: 'Remarks', width: 200, editable: true, diff --git a/onprc_ehr/resources/web/onprc_ehr/plugin/ClinicalRemarksRowEditor.js b/onprc_ehr/resources/web/onprc_ehr/plugin/ClinicalRemarksRowEditor.js index 586985ee8..758c8d1ad 100644 --- a/onprc_ehr/resources/web/onprc_ehr/plugin/ClinicalRemarksRowEditor.js +++ b/onprc_ehr/resources/web/onprc_ehr/plugin/ClinicalRemarksRowEditor.js @@ -14,14 +14,14 @@ Ext4.define('ONPRC_EHR.plugin.ClinicalRemarksRowEditor', { xtype: 'ehr-observationsroweditorgridpanel', itemId: 'observationsPanel', remarkStore: this.cmp.store, - width: 600, + width: 500, store: store }; }, getDetailsPanelCfg: function(){ return { - xtype: 'ehr-animaldetailsextendedpanel', + xtype: 'onprc_ehr-animaldetailsextendedpanel', itemId: 'detailsPanel' } }, diff --git a/onprc_ehr/resources/web/onprc_ehr/plugin/SurgicalRemarksRowEditor.js b/onprc_ehr/resources/web/onprc_ehr/plugin/SurgicalRemarksRowEditor.js index e20f46c53..d16df1b6d 100644 --- a/onprc_ehr/resources/web/onprc_ehr/plugin/SurgicalRemarksRowEditor.js +++ b/onprc_ehr/resources/web/onprc_ehr/plugin/SurgicalRemarksRowEditor.js @@ -11,10 +11,10 @@ Ext4.define('ONPRC_EHR.plugin.SurgicalRemarksRowEditor', { LDK.Assert.assertNotEmpty('Observations store not found', store); return { - xtype: 'ehr-observationsroweditorgridpanel', + xtype: 'onprc_ehr-observationsroweditorgridpanel', itemId: 'observationsPanel', remarkStore: this.cmp.store, - width: 600, + width: 1000, store: store }; }, diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java index bfd98302f..f32c05078 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java @@ -29,12 +29,12 @@ public class SurgicalAmendedRemarksFormSection extends SimpleFormSection public SurgicalAmendedRemarksFormSection(String label, EHRService.FORM_SECTION_LOCATION location) { super("study", "Clinical Remarks", label, "onprc_ehr-surgroundsremarksgridpanel", location); -// addClientDependency(ClientDependency.supplierFromPath("onpc_ehr/plugin/ClinicalObservationsCellEditing.js")); + addClientDependency(ClientDependency.supplierFromPath("ehr/plugin/ClinicalObservationsCellEditing.js")); addClientDependency(ClientDependency.supplierFromPath("ehr/panel/ClinicalRemarkPanel.js")); addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js")); - addClientDependency(ClientDependency.supplierFromPath("ehr/grid/ObservationsRowEditorGridPanel.js")); + addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/grid/ObservationsRowEditorGridPanel.js")); //Modified // MOdified: 8-1-2024 so that contents reset as ehr control types - addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/plugin/SurgicalRemarksRowEditor.js")); + addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/plugin/SurgicalRemarksRowEditor.js")); //edited addClientDependency(ClientDependency.supplierFromPath("ehr/data/ClinicalObservationsClientStore.js")); addClientDependency(ClientDependency.supplierFromPath("ehr/buttons/roundsButtons.js")); From 2f33076cfaaff8891e388f4e50c3326086472b1d Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 16 Aug 2024 15:00:52 -0700 Subject: [PATCH 08/72] Modified for Surgical Rounds input form to include new Clinical Observation input columns. --- .../onprc_ehr/form/field/SimpleCheckCombo.js | 113 ------------------ .../org/labkey/onprc_ehr/ONPRC_EHRModule.java | 2 - 2 files changed, 115 deletions(-) delete mode 100644 onprc_ehr/resources/web/onprc_ehr/form/field/SimpleCheckCombo.js diff --git a/onprc_ehr/resources/web/onprc_ehr/form/field/SimpleCheckCombo.js b/onprc_ehr/resources/web/onprc_ehr/form/field/SimpleCheckCombo.js deleted file mode 100644 index a29b0d646..000000000 --- a/onprc_ehr/resources/web/onprc_ehr/form/field/SimpleCheckCombo.js +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 2016-2017 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -/** - * Created: R.Blasa on 11/4/2016. - */ -Ext4.define('onprc_ehr.form.field.simplecheckcombo', { - extend: 'Ext.form.field.ComboBox', - alias: 'widget.onprc_simplecheckcombo', - - - nullCaption: '[Blank]', - expandToFitContent: true, - caseSensitive: false, - anyMatch: true, - typeAhead: true, - - initComponent: function(){ - Ext4.apply(this, { - displayField:'value', - valueField: 'value', - queryMode: 'local', - store: Ext4.create('LABKEY.ext4.data.Store', { - schemaName: 'sla', - queryName: 'Reference_Data', - columns: 'value', - sort: 'value', - filterArray: [ - LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), - LABKEY.Filter.create('ColumnName', 'NHPTrainingType', LABKEY.Filter.Types.EQUAL)], - autoLoad: true - }) - }); - - this.callParent(arguments); - - - - } -}); - - -Ext4.define('onprc_ehr.form.field.onprc_TrainingReason', { - extend: 'Ext.form.field.ComboBox', - alias: 'widget.onprc_TrainingReason', - - - nullCaption: '[Blank]', - expandToFitContent: true, - caseSensitive: false, - anyMatch: true, - typeAhead: true, - - initComponent: function(){ - Ext4.apply(this, { - displayField:'value', - valueField: 'value', - queryMode: 'local', - store: Ext4.create('LABKEY.ext4.data.Store', { - schemaName: 'sla', - queryName: 'Reference_Data', - columns: 'value', - sort: 'value', - filterArray: [ - LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), - LABKEY.Filter.create('ColumnName', 'TrainingReason', LABKEY.Filter.Types.EQUAL)], - autoLoad: true - }) - }); - - this.callParent(arguments); - - - - } -}); - -Ext4.define('onprc_ehr.form.field.onprc_TrainingResults', { - extend: 'Ext.form.field.ComboBox', - alias: 'widget.onprc_TrainingResults', - - - nullCaption: '[Blank]', - expandToFitContent: true, - caseSensitive: false, - anyMatch: true, - typeAhead: true, - - initComponent: function(){ - Ext4.apply(this, { - displayField:'value', - valueField: 'value', - queryMode: 'local', - store: Ext4.create('LABKEY.ext4.data.Store', { - schemaName: 'sla', - queryName: 'Reference_Data', - columns: 'value', - sort: 'value', - filterArray: [ - LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), - LABKEY.Filter.create('ColumnName', 'TrainingResults', LABKEY.Filter.Types.EQUAL)], - autoLoad: true - }) - }); - - this.callParent(arguments); - - - - } -}); \ No newline at end of file diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java b/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java index 82a210f93..34ab11d65 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java @@ -324,8 +324,6 @@ private void registerEHRResources() //Added: 10-12-2023 R.Blasa EHRService.get().registerClientDependency(ClientDependency.supplierFromPath("onprc_ehr/form/field/EnvironmentalField.js"), this); - //Added: 7-26-2024 R. Blasa - EHRService.get().registerClientDependency(ClientDependency.supplierFromPath("onprc_ehr/form/field/SimpleCheckCombo.js"), this); EHRService.get().registerReportLink(EHRService.REPORT_LINK_TYPE.housing, "List Single Housed Animals", this, DetailsURL.fromString("/query/executeQuery.view?schemaName=study&query.queryName=demographicsPaired&query.viewName=Single Housed"), "Commonly Used Queries"); EHRService.get().registerReportLink(EHRService.REPORT_LINK_TYPE.housing, "Find Animals Housed In A Given Room/Cage At A Specific Time", this, DetailsURL.fromString("/ehr/housingOverlaps.view?groupById=1"), "Commonly Used Queries"); From f0b6b9078266eb270ccdceeab2e510ee29b6c20f Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 16 Aug 2024 15:03:19 -0700 Subject: [PATCH 09/72] Modified for Surgical Rounds input form to include new Clinical Observation input columns. --- .../web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js index 0e26f128a..9d028677a 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js @@ -143,7 +143,7 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { xtype: 'textfield' } },{ - header: 'inflammtion', + header: 'inflammation', width: 200, editable: true, dataIndex: 'inflammation', From 7f3a65bdc3a52ccbb30f14dfd83710a791224ab3 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 16 Aug 2024 16:37:53 -0700 Subject: [PATCH 10/72] Modified for Surgical Rounds input form to include new Clinical Observation input columns. --- .../onprc_ehr/form/field/SurgeryEntryField.js | 49 ++++++++++++ .../grid/ObservationsRowEditorGridPanel.js | 79 ++++++------------- .../SurgicalAmendedRemarksFormSection.java | 3 +- 3 files changed, 73 insertions(+), 58 deletions(-) create mode 100644 onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js diff --git a/onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js b/onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js new file mode 100644 index 000000000..9588c8e7a --- /dev/null +++ b/onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js @@ -0,0 +1,49 @@ + +/* + * Copyright (c) 2013-2019 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 + */ +/** + * This field is used to display EHR projects. It contains a custom template for the combo list which displays both the project and protocol. + * It also listens for participantchange events and will display only the set of allowable projects for the selected animal. + * + * @cfg includeDefaultProjects defaults to true + */ + +//Created: 8-15-2024 R. Blasa + +Ext4.define('onprc_ehr.form.field.SurgeryEntryField', { + extend: 'Ext.form.field.ComboBox', + alias: 'widget.onprc_surgeryentryfield', + + + expandToFitContent: true, + caseSensitive: false, + anyMatch: true, + typeAhead: true, + + initComponent: function(){ + Ext4.apply(this, { + displayField:'value', + valueField: 'value', + queryMode: 'local', + store: Ext4.create('LABKEY.ext4.data.Store', { + schemaName: 'sla', + queryName: 'Reference_Data', + columns: 'value', + defaultValue:'0 - None', + sort: 'value', + filterArray: [ + LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), + LABKEY.Filter.create('ColumnName', 'Surgicalobservation', LABKEY.Filter.Types.EQUAL)], + autoLoad: true + }) + }); + + this.callParent(arguments); + + + + } +}); diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js index 9d028677a..d891fa7e9 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js @@ -143,70 +143,35 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { xtype: 'textfield' } },{ - header: 'inflammation', - width: 200, - editable: true, - dataIndex: 'inflammation', - editor: { - xtype: 'labkey-combo', - displayField: 'state', - valueField: 'state', - forceSelection: true, - defaultValue:'Normal', - queryMode: 'local', - anyMaych: true, - value: 'N/A', - store: { - type: 'labkey-store', - schemaName: 'ehr_lookups', - queryName: 'normal_abnormal', - autoLoad: true - } + header: 'Inflammation', + width: 130, + dataIndex: 'inflammation', + editor: { + xtype: 'onprc_surgeryentryfield', + forceSelection: true +// defaultValue:'0 - None' } },{ - header: 'bruising', - width: 200, - editable: true, + header: 'Bruising', + width: 130, dataIndex: 'bruising', editor: { - xtype: 'labkey-combo', - displayField: 'state', - valueField: 'state', - forceSelection: true, - defaultValue:'Normal', - queryMode: 'local', - anyMaych: true, - value: 'N/A', - store: { - type: 'labkey-store', - schemaName: 'ehr_lookups', - queryName: 'normal_abnormal', - autoLoad: true + xtype: 'onprc_surgeryentryfield', + forceSelection: true + defaultValue:'0 - None' + } + + },{ + header: 'Other', + width: 130, + dataIndex: 'other', + editor: { + xtype: 'onprc_surgeryentryfield', + forceSelection: true +// defaultValue:'0 - None' } - } - },{ - header: 'other', - width: 200, - editable: true, - dataIndex: 'other', - editor: { - xtype: 'labkey-combo', - displayField: 'state', - valueField: 'state', - forceSelection: true, - defaultValue:'Normal', - queryMode: 'local', - anyMaych: true, - value: 'N/A', - store: { - type: 'labkey-store', - schemaName: 'ehr_lookups', - queryName: 'normal_abnormal', - autoLoad: true - } - } },{ header: 'Remarks', width: 200, diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java index f32c05078..079f5956c 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalAmendedRemarksFormSection.java @@ -38,7 +38,8 @@ public SurgicalAmendedRemarksFormSection(String label, EHRService.FORM_SECTION_L addClientDependency(ClientDependency.supplierFromPath("ehr/data/ClinicalObservationsClientStore.js")); addClientDependency(ClientDependency.supplierFromPath("ehr/buttons/roundsButtons.js")); -// addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/panel/AnimalDetailsExtendedPanel.js")); + addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/form/field/SurgeryEntryField.js")); + setTemplateMode(TEMPLATE_MODE.NONE); } From 8b200840576d21af4bf70d829e81dfbbbdfb1e24 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Wed, 21 Aug 2024 13:15:24 -0700 Subject: [PATCH 11/72] Modified Surgical Rounds form to include modified Clinical Observation new reportin columns. --- .../resources/web/onprc_ehr/form/field/SurgeryEntryField.js | 1 + .../web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js | 6 ++---- .../dataentry/SurgicalRoundsRemarksFormSection.java | 3 +-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js b/onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js index 9588c8e7a..fe27a6368 100644 --- a/onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js +++ b/onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js @@ -28,6 +28,7 @@ Ext4.define('onprc_ehr.form.field.SurgeryEntryField', { displayField:'value', valueField: 'value', queryMode: 'local', + defaultValue:'0 - None', store: Ext4.create('LABKEY.ext4.data.Store', { schemaName: 'sla', queryName: 'Reference_Data', diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js index d891fa7e9..ce7ebe6a0 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js @@ -149,7 +149,6 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { editor: { xtype: 'onprc_surgeryentryfield', forceSelection: true -// defaultValue:'0 - None' } },{ @@ -159,8 +158,7 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { editor: { xtype: 'onprc_surgeryentryfield', forceSelection: true - defaultValue:'0 - None' - } + } },{ header: 'Other', @@ -169,7 +167,7 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { editor: { xtype: 'onprc_surgeryentryfield', forceSelection: true -// defaultValue:'0 - None' + } },{ diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsRemarksFormSection.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsRemarksFormSection.java index ab714cbc0..bdb2b92df 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsRemarksFormSection.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsRemarksFormSection.java @@ -44,8 +44,7 @@ public SurgicalRoundsRemarksFormSection(EHRService.FORM_SECTION_LOCATION locatio // Modified: 7-26-2024 R. Blasa addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/window/AddSurgicalCasesWindow.js")); -// addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/plugin/ClinicalRemarksRowEditor.js")); -// addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/grid/ObservationsRowEditorGridPanel.js")); + _showLocation = true; } From f342de7a972ea7272575923175676928dbe5816f Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Wed, 21 Aug 2024 18:02:15 -0700 Subject: [PATCH 12/72] Modified Surgical Rounds form to include modified Clinical Observation new reportin columns. --- onprc_ehr/resources/views/procedureDetails.html | 11 +++++++++++ .../onprc_ehr/dataentry/SingleSurgeryFormType.java | 1 + .../labkey/onprc_ehr/dataentry/SurgeryFormType.java | 1 + 3 files changed, 13 insertions(+) diff --git a/onprc_ehr/resources/views/procedureDetails.html b/onprc_ehr/resources/views/procedureDetails.html index e8a5695c5..f0feccdf6 100644 --- a/onprc_ehr/resources/views/procedureDetails.html +++ b/onprc_ehr/resources/views/procedureDetails.html @@ -30,6 +30,10 @@ tag: 'div', style: 'padding-bottom: 10px;', id: 'procedureFlags_' + webpart.wrapperDivId + },{ + tag: 'div', + style: 'padding-bottom: 10px;', + id: 'procedureObservations_' + webpart.wrapperDivId }]; var el = Ext4.get(webpart.wrapperDivId); @@ -101,6 +105,13 @@ queryName: 'procedure_default_codes', filters: [LABKEY.Filter.create('procedureId', procedureId, LABKEY.Filter.Types.EQUAL)] }).render('procedureCodes_' + webpart.wrapperDivId); + + LDK.Utils.getReadOnlyQWP({ + title: 'Default Observations', + schemaName: 'ehr_lookups', + queryName: 'procedure_default_observations', + filters: [LABKEY.Filter.create('procedureId', procedureId, LABKEY.Filter.Types.EQUAL)] + }).render('procedureObservations_' + webpart.wrapperDivId); }); \ No newline at end of file diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java index 495767b0b..531ef61fc 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java @@ -54,6 +54,7 @@ public SingleSurgeryFormType(DataEntryFormContext ctx, Module owner) new EncounterChildFormSection("ehr", "encounter_summaries", "Narrative", true), new EncounterMedicationsFormSection("study", "Drug Administration", "Medications/Treatments Given", true), new EncounterMedicationsFormSection("study", "Treatment Orders", "Medication/Treatment Orders", false), + new ClinicalObservationsFormSection(EHRService.FORM_SECTION_LOCATION.Tabs), new EncounterChildFormSection("study", "weight", "Weight", false, "EHR.data.WeightClientStore", Arrays.asList(ClientDependency.supplierFromPath("ehr/data/WeightClientStore.js")), null), new BloodDrawFormSection(false, EHRService.FORM_SECTION_LOCATION.Tabs), new EncounterChildFormSection("ehr", "snomed_tags", "Diagnostic Codes", true) diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java index 82e6c2144..ff3dec20c 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java @@ -56,6 +56,7 @@ public SurgeryFormType(DataEntryFormContext ctx, Module owner) new EncounterChildFormSection("study", "weight", "Weight", false, "EHR.data.WeightClientStore", Arrays.asList(ClientDependency.supplierFromPath("ehr/data/WeightClientStore.js")), null), new EncounterMedicationsFormSection("study", "Drug Administration", "Medications/Treatments Given", true), new EncounterMedicationsFormSection("study", "Treatment Orders", "Medication/Treatment Orders", false), + new ClinicalObservationsFormSection(EHRService.FORM_SECTION_LOCATION.Body), new BloodDrawFormSection(false, EHRService.FORM_SECTION_LOCATION.Tabs), new EncounterChildFormSection("ehr", "snomed_tags", "Diagnostic Codes", true) )); From 195c77fce4764e30fcd08488f7cc53fd7d28fcb6 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Thu, 22 Aug 2024 10:30:50 -0700 Subject: [PATCH 13/72] Modified Surgical Rounds form to include modified Clinical Observation new reportin columns. --- .../resources/queries/study/clinical_observations.query.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/onprc_ehr/resources/queries/study/clinical_observations.query.xml b/onprc_ehr/resources/queries/study/clinical_observations.query.xml index 5cfffa845..e6a1a589b 100644 --- a/onprc_ehr/resources/queries/study/clinical_observations.query.xml +++ b/onprc_ehr/resources/queries/study/clinical_observations.query.xml @@ -50,11 +50,11 @@ true
- Brusing + Bruising true - Remarks + Other true From 17778083825517f9ab2118e6780880de0e4d16e7 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Thu, 22 Aug 2024 10:42:38 -0700 Subject: [PATCH 14/72] Modified Surgical Rounds form to include modified Clinical Observation new reportin columns. --- .../onprc_ehr/dataentry/AssignmentFormType.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/AssignmentFormType.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/AssignmentFormType.java index 07d21aafd..c57636062 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/AssignmentFormType.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/AssignmentFormType.java @@ -20,6 +20,7 @@ import org.labkey.api.ehr.dataentry.FormSection; import org.labkey.api.ehr.dataentry.TaskFormSection; import org.labkey.api.ehr.dataentry.UnsaveableTask; +import org.labkey.api.ehr.security.EHRClinicalEntryPermission; import org.labkey.api.module.Module; import org.labkey.api.view.template.ClientDependency; @@ -53,4 +54,16 @@ public AssignmentFormType(DataEntryFormContext ctx, Module owner) addClientDependency(ClientDependency.supplierFromPath("/onprc_ehr/model/sources/ProjectAnimalConditions.js")); } + + + // // Added: 8-12-2024 R.Blasa + @Override + protected boolean canInsert() + { + if (!getCtx().getContainer().hasPermission(getCtx().getUser(), EHRClinicalEntryPermission.class)) + + return false; + + return super.canInsert(); + } } From efa93500a14756439c6c6d2af4635c0a9468439c Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Thu, 22 Aug 2024 10:53:50 -0700 Subject: [PATCH 15/72] Modified Surgical Rounds form to include modified Clinical Observation new reportin columns. --- .../onprc_ehr/dataentry/AssignmentFormType.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/AssignmentFormType.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/AssignmentFormType.java index c57636062..07d21aafd 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/AssignmentFormType.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/AssignmentFormType.java @@ -20,7 +20,6 @@ import org.labkey.api.ehr.dataentry.FormSection; import org.labkey.api.ehr.dataentry.TaskFormSection; import org.labkey.api.ehr.dataentry.UnsaveableTask; -import org.labkey.api.ehr.security.EHRClinicalEntryPermission; import org.labkey.api.module.Module; import org.labkey.api.view.template.ClientDependency; @@ -54,16 +53,4 @@ public AssignmentFormType(DataEntryFormContext ctx, Module owner) addClientDependency(ClientDependency.supplierFromPath("/onprc_ehr/model/sources/ProjectAnimalConditions.js")); } - - - // // Added: 8-12-2024 R.Blasa - @Override - protected boolean canInsert() - { - if (!getCtx().getContainer().hasPermission(getCtx().getUser(), EHRClinicalEntryPermission.class)) - - return false; - - return super.canInsert(); - } } From adacb68fd3ca5d72fcae678e0d1aa3b250e4bf62 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Tue, 27 Aug 2024 15:44:22 -0700 Subject: [PATCH 16/72] Modified Surgical input forms. --- .../web/onprc_ehr/model/sources/Surgery.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js index 1197a08e6..a447e775a 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js @@ -115,6 +115,23 @@ EHR.model.DataModelManager.registerMetadata('onprc_Surgery', { hidden: true } }, + 'study.clinical_observations': { + inflammation: { + xtype: 'onprc_surgeryentryfield', + showInGrid: true, + hidden: false + }, + bruising: { + xtype: 'onprc_surgeryentryfield', + showInGrid: true, + hidden: false + }, + other: { + xtype: 'onprc_surgeryentryfield', + showInGrid: true, + hidden: false + } + }, 'ehr.encounter_participants': { comment: { hidden: false, From 738a14dea0bd9015c9ec9cea8e9fb4af0a927571 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Tue, 27 Aug 2024 16:23:23 -0700 Subject: [PATCH 17/72] Modified Surgical input forms. --- .../sqlserver/onprc_ehr-23.015-23.016.sql | 16 ++++++++++++++++ onprc_ehr/resources/views/procedureDetails.html | 4 ++-- .../org/labkey/onprc_ehr/ONPRC_EHRModule.java | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 onprc_ehr/resources/schemas/dbscripts/sqlserver/onprc_ehr-23.015-23.016.sql diff --git a/onprc_ehr/resources/schemas/dbscripts/sqlserver/onprc_ehr-23.015-23.016.sql b/onprc_ehr/resources/schemas/dbscripts/sqlserver/onprc_ehr-23.015-23.016.sql new file mode 100644 index 000000000..f11856938 --- /dev/null +++ b/onprc_ehr/resources/schemas/dbscripts/sqlserver/onprc_ehr-23.015-23.016.sql @@ -0,0 +1,16 @@ +CREATE TABLE onprc_ehr.procedure_default_observations ( + rowid int identity(1,1), + procedureid int, + category varchar(100) Null, + area varchar(100) Null, + observation_score varchar(100) Null, + inflammation varchar(100) Null, + bruising varchar(100) Null, + other varchar(100) Null, + remark varchar(100) Null + + + CONSTRAINT PK_procedure_default_observations PRIMARY KEY (rowid) +) + +GO \ No newline at end of file diff --git a/onprc_ehr/resources/views/procedureDetails.html b/onprc_ehr/resources/views/procedureDetails.html index f0feccdf6..70d2fdad2 100644 --- a/onprc_ehr/resources/views/procedureDetails.html +++ b/onprc_ehr/resources/views/procedureDetails.html @@ -88,7 +88,7 @@ LDK.Utils.getReadOnlyQWP({ title: 'Default Treatments', schemaName: 'ehr_lookups', - queryName: 'procedure_default_treatments', + queryName: 'c', filters: [LABKEY.Filter.create('procedureId', procedureId, LABKEY.Filter.Types.EQUAL)] }).render('procedureTreatments_' + webpart.wrapperDivId); @@ -108,7 +108,7 @@ LDK.Utils.getReadOnlyQWP({ title: 'Default Observations', - schemaName: 'ehr_lookups', + schemaName: 'onprc_ehr', queryName: 'procedure_default_observations', filters: [LABKEY.Filter.create('procedureId', procedureId, LABKEY.Filter.Types.EQUAL)] }).render('procedureObservations_' + webpart.wrapperDivId); diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java b/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java index 34ab11d65..1493554a3 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java @@ -126,7 +126,7 @@ public String getName() @Override public @Nullable Double getSchemaVersion() { - return 23.015; + return 23.016; } @Override From 7ad47f29029f1b68e461d955c851dc64e18c9a15 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Tue, 27 Aug 2024 18:00:41 -0700 Subject: [PATCH 18/72] Modified Surgical input forms. --- .../web/onprc_ehr/model/sources/Surgery.js | 15 ++++++++++++--- .../dataentry/SingleSurgeryFormType.java | 2 ++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js index a447e775a..3f5fdc717 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js @@ -119,18 +119,27 @@ EHR.model.DataModelManager.registerMetadata('onprc_Surgery', { inflammation: { xtype: 'onprc_surgeryentryfield', showInGrid: true, - hidden: false + hidden: false, + columnConfig: { + width: 150 + } }, bruising: { xtype: 'onprc_surgeryentryfield', showInGrid: true, - hidden: false + hidden: false, + columnConfig: { + width: 150 + } }, other: { xtype: 'onprc_surgeryentryfield', showInGrid: true, - hidden: false + hidden: false, + columnConfig: { + width: 150 } + } }, 'ehr.encounter_participants': { comment: { diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java index 531ef61fc..e3c9e9708 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java @@ -68,6 +68,8 @@ public SingleSurgeryFormType(DataEntryFormContext ctx, Module owner) addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/model/sources/Surgery.js")); addClientDependency(ClientDependency.supplierFromPath("ehr/window/OpenSurgeryCasesWindow.js")); addClientDependency(ClientDependency.supplierFromPath("ehr/panel/SurgeryDataEntryPanel.js")); +// Added: 8-27-2024 r. Blasa + addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/form/field/SurgeryEntryField.js")); setDisplayReviewRequired(true); setJavascriptClass("EHR.panel.SurgeryDataEntryPanel"); From 687a956a0535afd7fce8727fd78e854d5523d54a Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Tue, 27 Aug 2024 21:15:54 -0700 Subject: [PATCH 19/72] Modified Surgical input forms. --- onprc_ehr/resources/schemas/onprc_ehr.xml | 35 +++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/onprc_ehr/resources/schemas/onprc_ehr.xml b/onprc_ehr/resources/schemas/onprc_ehr.xml index 13e741dcd..69fb67f70 100644 --- a/onprc_ehr/resources/schemas/onprc_ehr.xml +++ b/onprc_ehr/resources/schemas/onprc_ehr.xml @@ -1454,6 +1454,41 @@ + + + DETAILED + Default Surgical Observations Per Procedure + rowid + + + true + + + + + ehr_lookups + snomed + code + + + + + + + + + + + + + + + + + + +
+ From 6590a500f737722989be7ecaffb0bac5b1232096 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Wed, 28 Aug 2024 12:01:11 -0700 Subject: [PATCH 20/72] Modified Surgical input forms. --- .../panel/SurgeryInstructionsPanel.js | 39 ++ .../window/AddProcedureDefaultsWindow.js | 521 ++++++++++++++++++ 2 files changed, 560 insertions(+) create mode 100644 onprc_ehr/resources/web/onprc_ehr/panel/SurgeryInstructionsPanel.js create mode 100644 onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js diff --git a/onprc_ehr/resources/web/onprc_ehr/panel/SurgeryInstructionsPanel.js b/onprc_ehr/resources/web/onprc_ehr/panel/SurgeryInstructionsPanel.js new file mode 100644 index 000000000..d5b230780 --- /dev/null +++ b/onprc_ehr/resources/web/onprc_ehr/panel/SurgeryInstructionsPanel.js @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2014-2019 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 + */ +Ext4.define('ONPRC_EHR.panel.SurgeryInstructionsPanel', { + extend: 'Ext.panel.Panel', + alias: 'widget.onprc_ehr-surgeryinstructionspanel', + + initComponent: function(){ + var buttons = []; + LDK.Assert.assertNotEmpty('No data entry panel', this.dataEntryPanel); + var btnCfg = EHR.DataEntryUtils.getDataEntryFormButton('APPLYENCOUNTERDEFAULTSAMENDED'); + if (btnCfg){ + btnCfg = this.dataEntryPanel.configureButton(btnCfg); + if (btnCfg){ + btnCfg.text = 'Add Procedure Defaults'; + buttons.push(btnCfg); + } + } + + Ext4.apply(this, { + defaults: { + + }, + bodyStyle: 'padding: 5px;', + title: 'Instructions', + items: [{ + html: 'This form is designed for surgery entry. The top section contains basic information on the procedure(s). The bottom sections can be used to enter the narrative, medications, etc. Once you enter entered the animal(s) and procedures, use the bottom below to apply defaults to the other sections for those procedures.', + maxWidth: Ext4.getBody().getWidth() * 0.8, + style: 'padding-top: 10px;padding-bottom: 10px;', + border: false + },btnCfg] + }); + + this.callParent(arguments); + } + +}); \ No newline at end of file diff --git a/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js b/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js new file mode 100644 index 000000000..61c68b5f3 --- /dev/null +++ b/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js @@ -0,0 +1,521 @@ +/* + * Copyright (c) 2014-2019 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 + */ +/** + * @cfg dataEntryPanel + * @cfg encountersStore + * @cfg [] targetTabs + */ +Ext4.define('ONPRC_EHR.window.AddProcedureDefaultsWindow', { + extend: 'Ext.window.Window', + applyStaffTemplate: false, + allowAddWeightRecord: false, + + initComponent: function(){ + Ext4.applyIf(this, { + modal: true, + width: 750, + closeAction: 'destroy', + title: ((!this.targetTabs || this.targetTabs.length != 1) ? 'Add Procedure Defaults' : 'Add Procedure Defaults For Section'), + bodyStyle: 'padding: 5px;', + defaults: { + border: false + }, + items: [{ + html: 'This helper allows you to populate expected rows based on the procedures requested above. A list of the procedures and expected values are below.', + style: 'margin-bottom: 10px;' + },{ + itemId: 'services', + items: [{ + border: false, + html: 'Loading...' + }] + }], + buttons: [{ + text: 'Submit', + itemId: 'submitBtn', + disabled: true, + scope: this, + handler: this.onSubmit + },{ + text: 'Close', + handler: function(btn){ + btn.up('window').close(); + } + }] + }); + + if (!this.targetTabs){ + this.targetTabs = []; + this.applyStaffTemplate = true; + this.allowAddWeightRecord = true; + Ext4.each(this.dataEntryPanel.formConfig.sections, function(s){ + if (this.tableNameMap[s.name]){ + var item = this.dataEntryPanel.getSectionByName(s.name); + LDK.Assert.assertNotEmpty('Unable to find panel: ' + s.name, item); + if (item != null) + this.targetTabs.push(item); + } + }, this); + } + + this.inferPanels(); + + this.callParent(); + + this.on('beforeshow', function(){ + if (!this.encountersRecords.length){ + Ext4.Msg.alert('No Records', 'There are no available procedures, nothing to add'); + return false; + } + }, this); + }, + + inferPanels: function(){ + this.encountersRecords = this.getEncountersRecords(); + if (!this.encountersRecords.length){ + return; + } + + var services = {}; + Ext4.Array.forEach(this.encountersRecords, function(r){ + services[r.get('procedureid')] = true; + }, this); + + this.loadServices(Ext4.Object.getKeys(services)); + }, + + getEncountersRecords: function(){ + var records = []; + this.encountersStore.each(function(r){ + if (r.get('Id') && r.get('date') && r.get('procedureid')){ + records.push(r); + } + }, this); + + return records; + }, + + getExistingParentIds: function(){ + var keys = {}; + Ext4.Array.forEach(this.targetTabs, function(tab){ + keys[tab.formConfig.name] = {}; + tab.store.each(function(r){ + if (r.get('parentid')) + keys[tab.formConfig.name][r.get('parentid')] = true; + }, this); + }, this); + + return keys + }, + + tableNameMap: { + 'Drug Administration': { + queryName: 'procedure_default_treatments', + columns: 'procedureid,code,qualifier,route,frequency,volume,vol_units,dosage,dosage_units,concentration,conc_units,amount,amount_units' + }, + + 'clinical_observations': { + queryName: 'procedure_default_observations', + columns: 'procedureid,category,area,observation_score,inflammation,bruising,other,remark' + }, + encounter_summaries: { + queryName: 'procedure_default_comments', + columns: 'procedureid,comment', + targetColumns: 'procedureid,remark' + }, + snomed_tags: { + queryName: 'procedure_default_codes', + columns: 'procedureid,code,qualifier', + sort: 'sort_order' + } + }, + + loadServices: function(){ + var multi = new LABKEY.MultiRequest(); + var totalRequests = 0; + this.panelMap = {}; + Ext4.Array.forEach(this.targetTabs, function(tab){ + var cfg = this.tableNameMap[tab.formConfig.name]; + if (cfg){ + totalRequests++; + multi.add(LABKEY.Query.selectRows, { + schemaName: 'ehr_lookups', + queryName: cfg.queryName, + requiredVersion: 9.1, + columns: cfg.columns, + failure: LDK.Utils.getErrorCallback(), + success: function(results){ + this.panelMap[tab.formConfig.name] = {}; + if (results && results.rows && results.rows.length){ + Ext4.Array.forEach(results.rows, function(r){ + var row = new LDK.SelectRowsRow(r); + if (!this.panelMap[tab.formConfig.name][row.getValue('procedureid')]) + this.panelMap[tab.formConfig.name][row.getValue('procedureid')] = []; + + this.panelMap[tab.formConfig.name][row.getValue('procedureid')].push(row); + }, this); + } + }, + scope: this + }); + } + }, this); + + LDK.Assert.assertTrue('No matching tables found in AddProcedureDefaultsWindow', totalRequests > 0); + + if (totalRequests > 0) + multi.send(this.onLoad, this); + else { + //this should never actually get called + this.on('beforeshow', function(window){ + Ext4.Msg.alert('No Records', 'Add defaults is not supported for this section.'); + return false; + }, this); + } + }, + + onLoad: function(){ + var toAdd= [{ + html: 'Id' + },{ + html: 'Date' + },{ + html: 'Choose Template' + },{ + html: 'Ignore' + }]; + + var keys = this.getExistingParentIds(); + Ext4.Array.forEach(this.encountersRecords, function(r){ + toAdd.push({ + html: r.get('Id'), + width: 60 + }); + toAdd.push({ + html: Ext4.Date.format(r.get('date'), LABKEY.extDefaultDateFormat), + width: 110 + }); + + var ignoreId = 'ignore_' + Ext4.id(); + toAdd.push({ + xtype: 'labkey-combo', + anyMatch: true, + width: 250, + boundRecord: r, + ignoreCheckbox: ignoreId, + displayField: 'name', + valueField: 'rowid', + forceSelection: true, + queryMode: 'local', + value: r.get('procedureid'), + store: { + type: 'labkey-store', + schemaName: 'ehr_lookups', + queryName: 'procedures', + columns: 'name,rowid', + autoLoad: true + } + }); + toAdd.push({ + xtype: 'checkbox', + width: 80, + itemId: ignoreId, + checked: this.targetTabs.length == 1 ? keys[this.targetTabs[0].formConfig.name][r.get('objectid')] : false + }); + }, this); + + var target = this.down('#services'); + + target.removeAll(); + target.add({ + border: false, + itemId: 'fieldPanel', + layout: { + type: 'table', + columns: 4 + }, + defaults: { + border: false, + height: '15px', + style: 'padding: 2px;margin-right: 4px;vertical-align:text-top;' + }, + items: toAdd + }); + + if (this.allowAddWeightRecord){ + this.add({ + xtype: 'checkbox', + fieldLabel: 'Add Weight Record', + itemId: 'addWeightRecord', + checked: true + }); + } + + this.down('#submitBtn').setDisabled(false); + }, + + onSubmit: function(){ + var hasRecords = false; + var distinctIds = []; + var parentIdMap = {}; + + this.down('#fieldPanel').items.each(function(item){ + if (item.boundRecord){ + var ignoreCheckbox = this.down('#' + item.ignoreCheckbox); + if (ignoreCheckbox.getValue()){ + return; + } + + distinctIds.push(item.boundRecord.get('Id')); + parentIdMap[item.boundRecord.get('Id')] = parentIdMap[item.boundRecord.get('Id')] || []; + parentIdMap[item.boundRecord.get('Id')].push(item.boundRecord.get('objectid')); + + var panel = item.getValue(); + Ext4.Array.forEach(this.targetTabs, function(targetTab){ + var rows; + var records = []; + + if (panel && this.panelMap[targetTab.formConfig.name] && this.panelMap[targetTab.formConfig.name][panel]){ + rows = this.panelMap[targetTab.formConfig.name][panel]; + } + + if (rows && rows.length){ + Ext4.Array.forEach(rows, function(row){ + var data = { + Id: item.boundRecord.get('Id'), + date: item.boundRecord.get('date'), + project: item.boundRecord.get('project'), + encounterid: item.boundRecord.get('objectid'), + parentid: item.boundRecord.get('objectid') + }; + + var cfg = this.tableNameMap[targetTab.formConfig.name]; + if (cfg && cfg.columns){ + var columns = cfg.columns.split(','); + var targetColumns = (cfg.targetColumns || cfg.columns).split(','); + Ext4.Array.forEach(columns, function(col, idx){ + if (!Ext4.isEmpty(row.getValue(col))){ + data[targetColumns[idx]] = row.getValue(col); + } + }, this); + } + + records.push(targetTab.store.createModel(data)); + }, this); + + if (records.length){ + targetTab.store.add(records); + hasRecords = true; + } + } + }, this); + } + }, this); + + //add weight + distinctIds = Ext4.unique(distinctIds); + if (this.allowAddWeightRecord && this.down('#addWeightRecord').getValue()){ + var weightStore = this.dataEntryPanel.storeCollection.getClientStoreByName('weight'); + LDK.Assert.assertNotEmpty('Unable to find weight store in AddProcedureDefaultsWindow', weightStore); + var toAdd = []; + Ext4.Array.forEach(distinctIds, function(id){ + //arbitrarily assign parentid based on the first matching procedure, in the case of multiple procedures + toAdd.push(weightStore.createModel({ + Id: id, + parentid: parentIdMap[id][0] + })); + }, this); + + if (toAdd.length){ + weightStore.add(toAdd); + } + } + + //add templates + if (this.applyStaffTemplate){ + var majorSurg = []; + var minorSurg = []; + var procedureStore = EHR.DataEntryUtils.getProceduresStore(); + Ext4.Array.forEach(this.encountersRecords, function(r){ + if (r.get('procedureid')){ + var obj = { + Id: r.get('Id'), + date: r.get('date'), + parentid: r.get('objectid') + } + + var recIdx = procedureStore.findExact('rowid', r.get('procedureid')); + LDK.Assert.assertTrue('Unable to find procedure with rowid: ' + r.get('procedureid'), recIdx > -1); + if (recIdx > -1){ + var procRec = procedureStore.getAt(recIdx); + + if (procRec.get('major')){ + majorSurg.push(obj); + } + else { + minorSurg.push(obj); + } + } + } + }, this); + + this.minorSurgToLoad = minorSurg; + this.majorSurgToLoad = majorSurg; + + if (minorSurg.length || majorSurg.length){ + this.loadTemplateIds(); + } + else { + this.finalize(true); + } + } + else { + this.finalize(hasRecords); + } + }, + + loadTemplateIds: function(){ + LABKEY.Query.selectRows({ + schemaName: 'ehr', + queryName: 'formtemplates', + requiredVersion: 9.1, + scope: this, + filterArray: [ + LABKEY.Filter.create('title', 'Major Surgery;Minor Surgery', LABKEY.Filter.Types.EQUALS_ONE_OF), + LABKEY.Filter.create('category', 'Section', LABKEY.Filter.Types.EQUAL), + LABKEY.Filter.create('formtype', 'encounter_participants', LABKEY.Filter.Types.EQUAL) + + ], + failure: LDK.Utils.getErrorCallback(), + success: function(results){ + if (results && results.rows && results.rows.length){ + Ext4.Array.forEach(results.rows, function(r){ + var row = new LDK.SelectRowsRow(r); + if (row.getValue('title') == 'Major Surgery'){ + this.majorSurgTemplateId = row.getValue('entityid'); + } + else if (row.getValue('title') == 'Minor Surgery'){ + this.minorSurgTemplateId = row.getValue('entityid'); + } + }, this); + + LDK.Assert.assertEquality('Wrong row count found in AddProcedureDefaultsWindow', 2, results.rows.length); + } + + LDK.Assert.assertNotEmpty('Unable to find template for Major Surgery', this.majorSurgTemplateId); + LDK.Assert.assertNotEmpty('Unable to find template for Minor Surgery', this.minorSurgTemplateId); + + this.loadMinorSurg(); + } + }) + }, + + loadMinorSurg: function(){ + if (this.minorSurgToLoad && this.minorSurgToLoad.length){ + EHR.window.ApplyTemplateWindow.loadTemplateRecords(this.afterLoadMinorSurgTemplate, this, this.dataEntryPanel.storeCollection, this.minorSurgTemplateId, this.minorSurgToLoad); + } + else { + this.afterLoadMinorSurgTemplate(); + } + }, + + queueTemplateRecords: function(recMap){ + if (!recMap) + return; + + this.templateRecordsToAdd = this.templateRecordsToAdd || {}; + for (var i in recMap){ + this.templateRecordsToAdd[i] = this.templateRecordsToAdd[i] || []; + this.templateRecordsToAdd[i] = this.templateRecordsToAdd[i].concat(recMap[i]); + } + }, + + addQueuedTemplateRecords: function(){ + if (!this.templateRecordsToAdd) + return; + + for (var i in this.templateRecordsToAdd){ + var store = Ext4.StoreMgr.get(i); + store.add(this.templateRecordsToAdd[i]); + delete this.templateRecordsToAdd[i]; + } + }, + + afterLoadMinorSurgTemplate: function(recMap){ + delete this.minorSurgToLoad; + + this.queueTemplateRecords(recMap); + + if (!this.majorSurgToLoad || !this.majorSurgToLoad.length){ + this.afterLoadMajorSurgTemplate(); + } + else { + EHR.window.ApplyTemplateWindow.loadTemplateRecords(this.afterLoadMajorSurgTemplate, this, this.dataEntryPanel.storeCollection, this.majorSurgTemplateId, this.majorSurgToLoad); + } + }, + + afterLoadMajorSurgTemplate: function(recMap){ + delete this.majorSurgToLoad; + this.queueTemplateRecords(recMap); + + this.finalize(true); + }, + + finalize: function(hasRecords){ + this.close(); + this.addQueuedTemplateRecords(); + + if (!this.applyStaffTemplate && !hasRecords){ + Ext4.Msg.alert('No Records', 'There are no records to add'); + } + } +}); + +EHR.DataEntryUtils.registerGridButton('APPLYENCOUNTERDEFAULTSAMENDED', function(config){ + return Ext4.Object.merge({ + text: 'Add Procedure Defaults', + xtype: 'button', + tooltip: 'Click to copy records from the encounters section', + handler: function(btn){ + var grid = btn.up('grid'); + LDK.Assert.assertNotEmpty('Unable to find grid in APPLYENCOUNTERDEFAULTSAMENDED button', grid); + + var panel = grid.up('ehr-dataentrypanel'); + LDK.Assert.assertNotEmpty('Unable to find dataEntryPanel in APPLYENCOUNTERDEFAULTSAMENDEDTS button', panel); + + var store = panel.storeCollection.getClientStoreByName('encounters'); + LDK.Assert.assertNotEmpty('Unable to find encounters store in APPLYENCOUNTERDEFAULTSAMENDED button', store); + + if (store){ + Ext4.create('EHR.window.AddProcedureDefaultsWindow', { + dataEntryPanel: panel, + targetTabs: [grid], + encountersStore: store + }).show(); + } + } + }); +}); + +EHR.DataEntryUtils.registerDataEntryFormButton('APPLYENCOUNTERDEFAULTS', { + text: 'Add Procedure Defaults', + xtype: 'button', + tooltip: 'Click to copy records from the encounters section', + handler: function(btn){ + var panel = btn.up('ehr-dataentrypanel'); + LDK.Assert.assertNotEmpty('Unable to find dataEntryPanel in APPLYENCOUNTERDEFAULTS button', panel); + + var store = panel.storeCollection.getClientStoreByName('encounters'); + LDK.Assert.assertNotEmpty('Unable to find encounters store in APPLYENCOUNTERDEFAULTS button', store); + + if (store){ + Ext4.create('EHR.window.AddProcedureDefaultsWindow', { + dataEntryPanel: panel, + encountersStore: store + }).show(); + } + } +}); \ No newline at end of file From 3eab342a7a21d080332def805a7890c1df606467 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Wed, 28 Aug 2024 15:13:23 -0700 Subject: [PATCH 21/72] Modified Surgical input forms. --- .../onprc_ehr/form/field/SurgeryEntryField.js | 77 ++++++++++++++++++- .../web/onprc_ehr/model/sources/Surgery.js | 19 +++-- .../dataentry/SingleSurgeryFormType.java | 2 +- 3 files changed, 89 insertions(+), 9 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js b/onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js index fe27a6368..cb58ab635 100644 --- a/onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js +++ b/onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js @@ -13,9 +13,9 @@ //Created: 8-15-2024 R. Blasa -Ext4.define('onprc_ehr.form.field.SurgeryEntryField', { +Ext4.define('onprc_ehr.form.field.SurgeryExceptionField', { extend: 'Ext.form.field.ComboBox', - alias: 'widget.onprc_surgeryentryfield', + alias: 'widget.onprc_surgeryexceptionfield', expandToFitContent: true, @@ -37,7 +37,78 @@ Ext4.define('onprc_ehr.form.field.SurgeryEntryField', { sort: 'value', filterArray: [ LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), - LABKEY.Filter.create('ColumnName', 'Surgicalobservation', LABKEY.Filter.Types.EQUAL)], + LABKEY.Filter.create('ColumnName', 'Surgicalobservationexception', LABKEY.Filter.Types.EQUAL)], + autoLoad: true + }) + }); + + this.callParent(arguments); + + + + } +}); + +Ext4.define('onprc_ehr.form.field.SurgeryScoreField', { + extend: 'Ext.form.field.ComboBox', + alias: 'widget.onprc_surgeryscorefield', + + + expandToFitContent: true, + caseSensitive: false, + anyMatch: true, + typeAhead: true, + + initComponent: function(){ + Ext4.apply(this, { + displayField:'value', + valueField: 'value', + queryMode: 'local', + defaultValue:'0 - None', + store: Ext4.create('LABKEY.ext4.data.Store', { + schemaName: 'sla', + queryName: 'Reference_Data', + columns: 'value', + defaultValue:'Normal', + sort: 'value', + filterArray: [ + LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), + LABKEY.Filter.create('ColumnName', 'Surgicalobservationscore', LABKEY.Filter.Types.EQUAL)], + autoLoad: true + }) + }); + + this.callParent(arguments); + + + + } +}); + +Ext4.define('onprc_ehr.form.field.SurgeryOtherField', { + extend: 'Ext.form.field.ComboBox', + alias: 'widget.onprc_surgeryotherfield', + + + expandToFitContent: true, + caseSensitive: false, + anyMatch: true, + typeAhead: true, + + initComponent: function(){ + Ext4.apply(this, { + displayField:'value', + valueField: 'value', + queryMode: 'local', + store: Ext4.create('LABKEY.ext4.data.Store', { + schemaName: 'sla', + queryName: 'Reference_Data', + columns: 'value', + defaultValue:'0 - None', + sort: 'value', + filterArray: [ + LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), + LABKEY.Filter.create('ColumnName', 'Surgicalobservationother', LABKEY.Filter.Types.EQUAL)], autoLoad: true }) }); diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js index 3f5fdc717..d0a9d19ad 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js @@ -117,30 +117,39 @@ EHR.model.DataModelManager.registerMetadata('onprc_Surgery', { }, 'study.clinical_observations': { inflammation: { - xtype: 'onprc_surgeryentryfield', + xtype: 'onprc_surgeryexceptionfield', showInGrid: true, hidden: false, + defaultValue: '0 - None', columnConfig: { width: 150 } }, bruising: { - xtype: 'onprc_surgeryentryfield', + xtype: 'onprc_surgeryexceptionfield', showInGrid: true, hidden: false, + defaultValue: '0 - None', columnConfig: { width: 150 } }, other: { - xtype: 'onprc_surgeryentryfield', + xtype: 'onprc_surgeryotherfield', showInGrid: true, hidden: false, columnConfig: { width: 150 } - } - }, + }, + observation_score: { + xtype: 'onprc_surgeryscorefield', + defaultValue: 'Normal', + columnConfig: { + width: 150 + } + } + }, 'ehr.encounter_participants': { comment: { hidden: false, diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java index e3c9e9708..89c46ba20 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java @@ -46,7 +46,7 @@ public class SingleSurgeryFormType extends EncounterForm public SingleSurgeryFormType(DataEntryFormContext ctx, Module owner) { super(ctx, owner, NAME, "Surgery", "Surgery", Arrays.asList( - new NonStoreFormSection("Instructions", "Instructions", "ehr-surgeryinstructionspanel", Arrays.asList(ClientDependency.supplierFromPath("ehr/panel/SurgeryInstructionsPanel.js"))), + new NonStoreFormSection("Instructions", "Instructions", "onprc_ehr-surgeryinstructionspanel", Arrays.asList(ClientDependency.supplierFromPath("onprc_ehr/panel/SurgeryInstructionsPanel.js"))), new TaskFormSection(), new ClinicalEncountersFormPanelSection("Surgery"), new ExtendedAnimalDetailsFormSection(), From 80c86970ad416e981cf2539ffa20db6310cf574d Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Wed, 28 Aug 2024 15:38:16 -0700 Subject: [PATCH 22/72] Modified Surgical input forms. --- .../resources/web/onprc_ehr/form/field/SurgeryEntryField.js | 6 +++--- onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js b/onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js index cb58ab635..e4a64f565 100644 --- a/onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js +++ b/onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js @@ -34,7 +34,7 @@ Ext4.define('onprc_ehr.form.field.SurgeryExceptionField', { queryName: 'Reference_Data', columns: 'value', defaultValue:'0 - None', - sort: 'value', + sort: 'sort_order', filterArray: [ LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), LABKEY.Filter.create('ColumnName', 'Surgicalobservationexception', LABKEY.Filter.Types.EQUAL)], @@ -70,7 +70,7 @@ Ext4.define('onprc_ehr.form.field.SurgeryScoreField', { queryName: 'Reference_Data', columns: 'value', defaultValue:'Normal', - sort: 'value', + sort: 'sort_order', filterArray: [ LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), LABKEY.Filter.create('ColumnName', 'Surgicalobservationscore', LABKEY.Filter.Types.EQUAL)], @@ -105,7 +105,7 @@ Ext4.define('onprc_ehr.form.field.SurgeryOtherField', { queryName: 'Reference_Data', columns: 'value', defaultValue:'0 - None', - sort: 'value', + sort: 'sort_order', filterArray: [ LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), LABKEY.Filter.create('ColumnName', 'Surgicalobservationother', LABKEY.Filter.Types.EQUAL)], diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js index d0a9d19ad..bf50237d0 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js @@ -139,7 +139,7 @@ EHR.model.DataModelManager.registerMetadata('onprc_Surgery', { showInGrid: true, hidden: false, columnConfig: { - width: 150 + width: 250 } }, observation_score: { From adcded0ebbc6ac4aa7f0f01b363531bfdd8cfede Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Wed, 28 Aug 2024 17:15:03 -0700 Subject: [PATCH 23/72] Modified Surgical input forms. --- .../web/onprc_ehr/window/AddProcedureDefaultsWindow.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js b/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js index 61c68b5f3..c217faf61 100644 --- a/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js +++ b/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js @@ -113,15 +113,18 @@ Ext4.define('ONPRC_EHR.window.AddProcedureDefaultsWindow', { tableNameMap: { 'Drug Administration': { + schemaName: 'ehr_lookups', queryName: 'procedure_default_treatments', columns: 'procedureid,code,qualifier,route,frequency,volume,vol_units,dosage,dosage_units,concentration,conc_units,amount,amount_units' }, 'clinical_observations': { + schemaName: 'onprc_ehr', queryName: 'procedure_default_observations', columns: 'procedureid,category,area,observation_score,inflammation,bruising,other,remark' }, encounter_summaries: { + schemaName: 'ehr_lookups', queryName: 'procedure_default_comments', columns: 'procedureid,comment', targetColumns: 'procedureid,remark' @@ -142,7 +145,7 @@ Ext4.define('ONPRC_EHR.window.AddProcedureDefaultsWindow', { if (cfg){ totalRequests++; multi.add(LABKEY.Query.selectRows, { - schemaName: 'ehr_lookups', + schemaName: cfg.schemaName, queryName: cfg.queryName, requiredVersion: 9.1, columns: cfg.columns, From a9da4aa918ef843ec4505ee9ec57ffa99ea40c67 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Thu, 29 Aug 2024 23:28:30 -0700 Subject: [PATCH 24/72] Modified Surgical input forms. --- .../onprc_ehr/window/AddProcedureDefaultsWindow.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js b/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js index c217faf61..9fe1d4b80 100644 --- a/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js +++ b/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js @@ -487,13 +487,13 @@ EHR.DataEntryUtils.registerGridButton('APPLYENCOUNTERDEFAULTSAMENDED', function( LDK.Assert.assertNotEmpty('Unable to find grid in APPLYENCOUNTERDEFAULTSAMENDED button', grid); var panel = grid.up('ehr-dataentrypanel'); - LDK.Assert.assertNotEmpty('Unable to find dataEntryPanel in APPLYENCOUNTERDEFAULTSAMENDEDTS button', panel); + LDK.Assert.assertNotEmpty('Unable to find dataEntryPanel in APPLYENCOUNTERDEFAULTSAMENDED button', panel); var store = panel.storeCollection.getClientStoreByName('encounters'); LDK.Assert.assertNotEmpty('Unable to find encounters store in APPLYENCOUNTERDEFAULTSAMENDED button', store); if (store){ - Ext4.create('EHR.window.AddProcedureDefaultsWindow', { + Ext4.create('ONPRC_EHR.window.AddProcedureDefaultsWindow', { dataEntryPanel: panel, targetTabs: [grid], encountersStore: store @@ -503,19 +503,19 @@ EHR.DataEntryUtils.registerGridButton('APPLYENCOUNTERDEFAULTSAMENDED', function( }); }); -EHR.DataEntryUtils.registerDataEntryFormButton('APPLYENCOUNTERDEFAULTS', { +EHR.DataEntryUtils.registerDataEntryFormButton('APPLYENCOUNTERDEFAULTSAMENDED', { text: 'Add Procedure Defaults', xtype: 'button', tooltip: 'Click to copy records from the encounters section', handler: function(btn){ var panel = btn.up('ehr-dataentrypanel'); - LDK.Assert.assertNotEmpty('Unable to find dataEntryPanel in APPLYENCOUNTERDEFAULTS button', panel); + LDK.Assert.assertNotEmpty('Unable to find dataEntryPanel in APPLYENCOUNTERDEFAULTSAMENDED button', panel); var store = panel.storeCollection.getClientStoreByName('encounters'); - LDK.Assert.assertNotEmpty('Unable to find encounters store in APPLYENCOUNTERDEFAULTS button', store); + LDK.Assert.assertNotEmpty('Unable to find encounters store in APPLYENCOUNTERDEFAULTSAMENDED button', store); if (store){ - Ext4.create('EHR.window.AddProcedureDefaultsWindow', { + Ext4.create('ONPRC_EHR.window.AddProcedureDefaultsWindow', { dataEntryPanel: panel, encountersStore: store }).show(); From 8850b567a1b1de3a0bbaad2d23e72e7b443ee5ae Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Thu, 12 Sep 2024 12:43:39 -0700 Subject: [PATCH 25/72] Modified Surgical rounds project --- onprc_ehr/resources/schemas/onprc_ehr.xml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/onprc_ehr/resources/schemas/onprc_ehr.xml b/onprc_ehr/resources/schemas/onprc_ehr.xml index e1703f72e..c5cfe5e4f 100644 --- a/onprc_ehr/resources/schemas/onprc_ehr.xml +++ b/onprc_ehr/resources/schemas/onprc_ehr.xml @@ -1463,12 +1463,11 @@ true - - + ehr_lookups - snomed - code + procedure + rowid From 4154f6bb59421c71db697f74f39c2c10c2366ca6 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Thu, 12 Sep 2024 20:06:54 -0700 Subject: [PATCH 26/72] Modified Surgical rounds project --- .../queries/study/clinical_observations.query.xml | 12 +++++++++++- .../resources/web/onprc_ehr/model/sources/Surgery.js | 12 ++++++++++++ .../onprc_ehr/window/AddProcedureDefaultsWindow.js | 8 ++++---- .../onprc_ehr/dataentry/SingleSurgeryFormType.java | 3 +++ 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/onprc_ehr/resources/queries/study/clinical_observations.query.xml b/onprc_ehr/resources/queries/study/clinical_observations.query.xml index e6a1a589b..250f8921c 100644 --- a/onprc_ehr/resources/queries/study/clinical_observations.query.xml +++ b/onprc_ehr/resources/queries/study/clinical_observations.query.xml @@ -1,13 +1,15 @@ - +
+ + @@ -57,6 +59,14 @@ Other true + + false + Remark + + + true + Performed By +
diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js index bf50237d0..c5353e496 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js @@ -141,6 +141,18 @@ EHR.model.DataModelManager.registerMetadata('onprc_Surgery', { columnConfig: { width: 250 } + }, + remark: { + hidden: false, + columnConfig: { + width: 250 + } + }, + performedby: { + hidden: false, + columnConfig: { + width: 150 + } }, observation_score: { xtype: 'onprc_surgeryscorefield', diff --git a/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js b/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js index 9fe1d4b80..94e5acf8d 100644 --- a/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js +++ b/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js @@ -477,20 +477,20 @@ Ext4.define('ONPRC_EHR.window.AddProcedureDefaultsWindow', { } }); -EHR.DataEntryUtils.registerGridButton('APPLYENCOUNTERDEFAULTSAMENDED', function(config){ +EHR.DataEntryUtils.registerGridButton('ADDPROCEDUREDEFAULTS', function(config){ return Ext4.Object.merge({ text: 'Add Procedure Defaults', xtype: 'button', tooltip: 'Click to copy records from the encounters section', handler: function(btn){ var grid = btn.up('grid'); - LDK.Assert.assertNotEmpty('Unable to find grid in APPLYENCOUNTERDEFAULTSAMENDED button', grid); + LDK.Assert.assertNotEmpty('Unable to find grid in ADDPROCEDUREDEFAULTS button', grid); var panel = grid.up('ehr-dataentrypanel'); - LDK.Assert.assertNotEmpty('Unable to find dataEntryPanel in APPLYENCOUNTERDEFAULTSAMENDED button', panel); + LDK.Assert.assertNotEmpty('Unable to find dataEntryPanel in ADDPROCEDUREDEFAULTS button', panel); var store = panel.storeCollection.getClientStoreByName('encounters'); - LDK.Assert.assertNotEmpty('Unable to find encounters store in APPLYENCOUNTERDEFAULTSAMENDED button', store); + LDK.Assert.assertNotEmpty('Unable to find encounters store in ADDPROCEDUREDEFAULTS button', store); if (store){ Ext4.create('ONPRC_EHR.window.AddProcedureDefaultsWindow', { diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java index 89c46ba20..f381faa24 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java @@ -70,6 +70,9 @@ public SingleSurgeryFormType(DataEntryFormContext ctx, Module owner) addClientDependency(ClientDependency.supplierFromPath("ehr/panel/SurgeryDataEntryPanel.js")); // Added: 8-27-2024 r. Blasa addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/form/field/SurgeryEntryField.js")); +// Added: 8-27-2024 R. Blasa + addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/window/AddProcedureDefaultsWindow.js")); + setDisplayReviewRequired(true); setJavascriptClass("EHR.panel.SurgeryDataEntryPanel"); From b8aec77cc09137faaa0e9c65d0a4b90df0835a5d Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Thu, 12 Sep 2024 20:11:30 -0700 Subject: [PATCH 27/72] Modified Surgical rounds project --- onprc_ehr/resources/views/procedureDetails.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/onprc_ehr/resources/views/procedureDetails.html b/onprc_ehr/resources/views/procedureDetails.html index 70d2fdad2..6aaaa2b9c 100644 --- a/onprc_ehr/resources/views/procedureDetails.html +++ b/onprc_ehr/resources/views/procedureDetails.html @@ -88,7 +88,7 @@ LDK.Utils.getReadOnlyQWP({ title: 'Default Treatments', schemaName: 'ehr_lookups', - queryName: 'c', + queryName: 'procedure_default_treatments', filters: [LABKEY.Filter.create('procedureId', procedureId, LABKEY.Filter.Types.EQUAL)] }).render('procedureTreatments_' + webpart.wrapperDivId); From cf8d51cca5623a95d1dc5e1afe200d4c8d663c2c Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Mon, 16 Sep 2024 11:39:21 -0700 Subject: [PATCH 28/72] Modified Surgery Rounds and Surgery input forms to include default values that needs to populate Cliniccal Observation entries. --- .../resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js | 1 + 1 file changed, 1 insertion(+) diff --git a/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js b/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js index 94e5acf8d..ff6d26018 100644 --- a/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js +++ b/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js @@ -130,6 +130,7 @@ Ext4.define('ONPRC_EHR.window.AddProcedureDefaultsWindow', { targetColumns: 'procedureid,remark' }, snomed_tags: { + schemaName: 'ehr_lookups', queryName: 'procedure_default_codes', columns: 'procedureid,code,qualifier', sort: 'sort_order' From c3918cbda63a4551aa96075b65b5dbd447cef6a7 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Mon, 16 Sep 2024 22:06:44 -0700 Subject: [PATCH 29/72] Modified Surgery Rounds and Surgery input forms to include default values that needs to populate Cliniccal Observation entries. --- .../web/onprc_ehr/window/AddProcedureDefaultsWindow.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js b/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js index ff6d26018..ca11d3522 100644 --- a/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js +++ b/onprc_ehr/resources/web/onprc_ehr/window/AddProcedureDefaultsWindow.js @@ -118,7 +118,7 @@ Ext4.define('ONPRC_EHR.window.AddProcedureDefaultsWindow', { columns: 'procedureid,code,qualifier,route,frequency,volume,vol_units,dosage,dosage_units,concentration,conc_units,amount,amount_units' }, - 'clinical_observations': { + 'Clinical Observations': { schemaName: 'onprc_ehr', queryName: 'procedure_default_observations', columns: 'procedureid,category,area,observation_score,inflammation,bruising,other,remark' From a4dcec3eab0d67d6926ef28bbf85b9e1e4198c2a Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Thu, 19 Sep 2024 18:33:28 -0700 Subject: [PATCH 30/72] Modified Surgery input forms to include Suergery Procedure unique identifier. --- .../web/onprc_ehr/model/sources/Surgery.js | 391 +++++++++++------- .../onprc_ehr/dataentry/SurgeryFormType.java | 2 +- 2 files changed, 235 insertions(+), 158 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js index c5353e496..54894d6c5 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js @@ -1,180 +1,257 @@ -/* - * Copyright (c) 2013-2019 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ + /* + * Copyright (c) 2013-2019 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 + */ -// Created: 4-20-2021 R. Blasa -EHR.model.DataModelManager.registerMetadata('onprc_Surgery', { - allQueries: { - performedby: { - allowBlank: true - } - }, - byQuery: { - 'onprc_billing.miscCharges': { - chargeId: { - lookup: { - filterArray: [ - LABKEY.Filter.create('active', true, LABKEY.Filter.Types.EQUAL), - LABKEY.Filter.create('category', 'Lease Fee', LABKEY.Filter.Types.NEQ), - LABKEY.Filter.create('category', 'Animal Per Diem', LABKEY.Filter.Types.NEQ), - LABKEY.Filter.create('category', 'Small Animal Per Diem', LABKEY.Filter.Types.NEQ), - LABKEY.Filter.create('category', 'Timed Mated Breeders', LABKEY.Filter.Types.NEQ) - ] - } - }, - chargetype: { - //NOTE: this will be inherited from the encounters record, so we dont want a default - //defaultValue: 'DCM: Surgery Services', - allowBlank: false - } - }, - 'study.treatment_order': { - category: { - shownInGrid: true, - defaultValue: 'Surgical', - allowBlank: false - } - - }, - 'study.drug': { - enddate: { - hidden: false - }, - category: { - shownInGrid: true, - hidden: false, - defaultValue: 'Surgical' - }, - reason: { - defaultValue: 'Procedure' - }, - chargetype: { - //NOTE: this will be inherited from the encounters record, so we dont want a default - //defaultValue: 'DCM: Surgery Services', - allowBlank: false + // Created: 4-20-2021 R. Blasa + EHR.model.DataModelManager.registerMetadata('onprc_Surgery', { + allQueries: { + performedby: { + allowBlank: true } }, - 'study.encounters': { - type: { - defaultValue: 'Surgery', - hidden: true - }, - title: { - hidden: true - }, - caseno: { - hidden: true - }, - procedureid: { - lookup: { - filterArray: [ - LABKEY.Filter.create('category', 'Surgery;Procedure', LABKEY.Filter.Types.EQUALS_ONE_OF), - LABKEY.Filter.create('active', true, LABKEY.Filter.Types.EQUAL) - ] + byQuery: { + 'onprc_billing.miscCharges': { + chargeId: { + lookup: { + filterArray: [ + LABKEY.Filter.create('active', true, LABKEY.Filter.Types.EQUAL), + LABKEY.Filter.create('category', 'Lease Fee', LABKEY.Filter.Types.NEQ), + LABKEY.Filter.create('category', 'Animal Per Diem', LABKEY.Filter.Types.NEQ), + LABKEY.Filter.create('category', 'Small Animal Per Diem', LABKEY.Filter.Types.NEQ), + LABKEY.Filter.create('category', 'Timed Mated Breeders', LABKEY.Filter.Types.NEQ) + ] + } + }, + chargetype: { + //NOTE: this will be inherited from the encounters record, so we dont want a default + //defaultValue: 'DCM: Surgery Services', + allowBlank: false + }, + parentid: { + shownInGrid: true, + hidden: false, + header: 'Procedure Link', + columnConfig: { + width: 250 + } } }, - performedby: { - hidden: true - }, - remark: { - hidden: true - }, - chargetype: { - allowBlank: false + 'study.treatment_order': { + category: { + shownInGrid: true, + defaultValue: 'Surgical', + allowBlank: false + + }, + parentid: { + shownInGrid: true, + hidden: false, + header: 'Procedure Link', + columnConfig: { + width: 250 + } + } }, - assistingstaff: { - hidden: false, - allowBlank: true //will be handled in trigger script + + 'study.blood': { + parentid: { + shownInGrid: true, + hidden: false, + header: 'Procedure Link', + columnConfig: { + width: 250 + } + } + }, + 'study.drug': { + enddate: { + hidden: false + }, + category: { + shownInGrid: true, + hidden: false, + defaultValue: 'Surgical' + }, + reason: { + defaultValue: 'Procedure' + }, + parentid: { + shownInGrid: true, + hidden: false, + header: 'Procedure Link', + columnConfig: { + width: 250 + } + }, + chargetype: { + //NOTE: this will be inherited from the encounters record, so we dont want a default + //defaultValue: 'DCM: Surgery Services', + allowBlank: false + } }, - enddate: { - editorConfig: { - getDefaultDate: function(){ - var rec = EHR.DataEntryUtils.getBoundRecord(this); - if (rec){ - if (rec.get('date')){ - return rec.get('date'); + 'study.encounters': { + type: { + defaultValue: 'Surgery', + hidden: true + }, + title: { + hidden: true + }, + caseno: { + hidden: true + }, + procedureid: { + lookup: { + filterArray: [ + LABKEY.Filter.create('category', 'Surgery;Procedure', LABKEY.Filter.Types.EQUALS_ONE_OF), + LABKEY.Filter.create('active', true, LABKEY.Filter.Types.EQUAL) + ] + } + }, + performedby: { + hidden: true + }, + remark: { + hidden: true + }, + chargetype: { + allowBlank: false + }, + objectid: { + shownInGrid: true, + hidden: false, + header: 'Procedure Link', + columnConfig: { + width: 250 + } + }, + assistingstaff: { + hidden: false, + allowBlank: true //will be handled in trigger script + }, + enddate: { + editorConfig: { + getDefaultDate: function(){ + var rec = EHR.DataEntryUtils.getBoundRecord(this); + if (rec){ + if (rec.get('date')){ + return rec.get('date'); + } } } } + } - } - }, - 'ehr.snomed_tags': { - code: { - editorConfig: { - xtype: 'ehr-snomedcombo', - defaultSubset: 'Diagnostic Codes' - } - }, - set_number: { - hidden: true }, - sort: { - hidden: true - } - }, - 'study.clinical_observations': { - inflammation: { - xtype: 'onprc_surgeryexceptionfield', - showInGrid: true, - hidden: false, - defaultValue: '0 - None', - columnConfig: { - width: 150 - } - }, - bruising: { - xtype: 'onprc_surgeryexceptionfield', - showInGrid: true, - hidden: false, - defaultValue: '0 - None', - columnConfig: { - width: 150 - } - }, - other: { - xtype: 'onprc_surgeryotherfield', - showInGrid: true, - hidden: false, - columnConfig: { - width: 250 - } + 'ehr.snomed_tags': { + code: { + editorConfig: { + xtype: 'ehr-snomedcombo', + defaultSubset: 'Diagnostic Codes' + } }, - remark: { - hidden: false, - columnConfig: { - width: 250 - } + set_number: { + hidden: true }, - performedby: { + parentid: { + shownInGrid: true, hidden: false, + header: 'Procedure Link', columnConfig: { - width: 150 - } + width: 250 + } }, - observation_score: { - xtype: 'onprc_surgeryscorefield', - defaultValue: 'Normal', + sort: { + hidden: true + } + }, + 'study.clinical_observations': { + inflammation: { + xtype: 'onprc_surgeryexceptionfield', + showInGrid: true, + hidden: false, + defaultValue: '0 - None', + columnConfig: { + width: 150 + } + }, + bruising: { + xtype: 'onprc_surgeryexceptionfield', + showInGrid: true, + hidden: false, + defaultValue: '0 - None', + columnConfig: { + width: 150 + } + }, + other: { + xtype: 'onprc_surgeryotherfield', + showInGrid: true, + hidden: false, + columnConfig: { + width: 250 + } + }, + remark: { + hidden: false, + columnConfig: { + width: 250 + } + }, + performedby: { + hidden: false, columnConfig: { width: 150 } + }, + parentid: { + shownInGrid: true, + hidden: false, + header: 'Procedure Link', + columnConfig: { + width: 250 + } + }, + observation_score: { + xtype: 'onprc_surgeryscorefield', + defaultValue: 'Normal', + columnConfig: { + width: 150 + } } - }, - 'ehr.encounter_participants': { - comment: { - hidden: false, - header: 'Remarks', - columnConfig: { - width: 300 - } - } - }, - 'ehr.encounter_summaries': { - category: { - defaultValue: 'Narrative' + }, + + 'ehr.encounter_participants': { + comment: { + hidden: false, + header: 'Remarks', + columnConfig: { + width: 300 + } + }, + parentid: { + shownInGrid: true, + hidden: false, + header: 'Procedure Link', + columnConfig: { + width: 250 + } + } + }, + 'ehr.encounter_summaries': { + category: { + defaultValue: 'Narrative' + }, + parentid: { + shownInGrid: true, + hidden: false, + header: 'Procedure Link', + columnConfig: { + width: 250 + } + } } } - } -}); \ No newline at end of file + }); \ No newline at end of file diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java index ff3dec20c..802e2f1ed 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java @@ -56,7 +56,7 @@ public SurgeryFormType(DataEntryFormContext ctx, Module owner) new EncounterChildFormSection("study", "weight", "Weight", false, "EHR.data.WeightClientStore", Arrays.asList(ClientDependency.supplierFromPath("ehr/data/WeightClientStore.js")), null), new EncounterMedicationsFormSection("study", "Drug Administration", "Medications/Treatments Given", true), new EncounterMedicationsFormSection("study", "Treatment Orders", "Medication/Treatment Orders", false), - new ClinicalObservationsFormSection(EHRService.FORM_SECTION_LOCATION.Body), + new ClinicalObservationsFormSection(EHRService.FORM_SECTION_LOCATION.Tabs), new BloodDrawFormSection(false, EHRService.FORM_SECTION_LOCATION.Tabs), new EncounterChildFormSection("ehr", "snomed_tags", "Diagnostic Codes", true) )); From 38b7d6e76974f3989b9f2851034e82297d64f874 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Thu, 19 Sep 2024 18:38:31 -0700 Subject: [PATCH 31/72] Modified Surgery input forms to include Suergery Procedure unique identifier. --- .../resources/web/onprc_ehr/model/sources/Surgery.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js index 54894d6c5..3c77bc336 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js @@ -240,6 +240,17 @@ } } }, + + 'study.weight': { + parentid: { + shownInGrid: true, + hidden: false, + header: 'Procedure Link', + columnConfig: { + width: 250 + } + } + }, 'ehr.encounter_summaries': { category: { defaultValue: 'Narrative' From c17ac86de42ce01168afda6fd8e8c7f72112d0dc Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 27 Sep 2024 11:45:32 -0700 Subject: [PATCH 32/72] Modified Surgical Rounds Clinical Observation width display size --- .../web/onprc_ehr/plugin/SurgicalRemarksRowEditor.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/plugin/SurgicalRemarksRowEditor.js b/onprc_ehr/resources/web/onprc_ehr/plugin/SurgicalRemarksRowEditor.js index d16df1b6d..dca9afdef 100644 --- a/onprc_ehr/resources/web/onprc_ehr/plugin/SurgicalRemarksRowEditor.js +++ b/onprc_ehr/resources/web/onprc_ehr/plugin/SurgicalRemarksRowEditor.js @@ -14,7 +14,7 @@ Ext4.define('ONPRC_EHR.plugin.SurgicalRemarksRowEditor', { xtype: 'onprc_ehr-observationsroweditorgridpanel', itemId: 'observationsPanel', remarkStore: this.cmp.store, - width: 1000, + width: 1300, store: store }; }, @@ -55,7 +55,7 @@ Ext4.define('ONPRC_EHR.plugin.SurgicalRemarksRowEditor', { items: [formCfg, this.getObservationPanelCfg()] }; - ret.width = 1050; + ret.width = 1150; return ret; }, From ab5e042ed5a35569efc87ec73d6ad299effcb325 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 27 Sep 2024 12:32:03 -0700 Subject: [PATCH 33/72] Modified Surgical Rounds Clinical Observation width display size --- .../web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js index ce7ebe6a0..535beee5b 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js @@ -147,7 +147,7 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { width: 130, dataIndex: 'inflammation', editor: { - xtype: 'onprc_surgeryentryfield', + xtype: 'onprc_surgeryexceptionfield', forceSelection: true } },{ @@ -156,7 +156,7 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { width: 130, dataIndex: 'bruising', editor: { - xtype: 'onprc_surgeryentryfield', + xtype: 'onprc_surgeryexceptionfield', forceSelection: true } @@ -165,7 +165,7 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { width: 130, dataIndex: 'other', editor: { - xtype: 'onprc_surgeryentryfield', + xtype: 'onprc_surgeryotherfield', forceSelection: true } From bd44a9110866a585b3a7dc3a29ec94a1675d97ce Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 27 Sep 2024 12:39:55 -0700 Subject: [PATCH 34/72] Modified Surgical Rounds Clinical Observation width display size --- .../grid/ObservationsRowEditorGridPanel.js | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js index 535beee5b..11eaa531b 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js @@ -130,18 +130,25 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { },{ header: 'Observation/Score', width: 200, - editable: true, + dataIndex: 'observation', - renderer: function(value, cellMetaData, record){ - if (Ext4.isEmpty(value) && ['Vet Attention'].indexOf(record.get('category')) == -1){ - cellMetaData.tdCls = 'labkey-grid-cell-invalid'; - } +// renderer: function(value, cellMetaData, record){ +// if (Ext4.isEmpty(value) && ['Vet Attention'].indexOf(record.get('category')) == -1){ +// cellMetaData.tdCls = 'labkey-grid-cell-invalid'; +// } +// +// return value; +// }, +// editor: { +// xtype: 'textfield' +// } - return value; - }, + width: 130, + dataIndex: 'inflammation', editor: { - xtype: 'textfield' - } + xtype: 'onprc_surgeryscorefield', + forceSelection: true + } },{ header: 'Inflammation', width: 130, From a968ea65de299ee398ba96189b0ee54e40935196 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 27 Sep 2024 12:49:57 -0700 Subject: [PATCH 35/72] Modified Surgical Rounds Clinical Observation width display size --- .../grid/ObservationsRowEditorGridPanel.js | 34 ++++++++----------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js index 11eaa531b..774a62ed7 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js @@ -128,27 +128,21 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { } } },{ - header: 'Observation/Score', - width: 200, - - dataIndex: 'observation', -// renderer: function(value, cellMetaData, record){ -// if (Ext4.isEmpty(value) && ['Vet Attention'].indexOf(record.get('category')) == -1){ -// cellMetaData.tdCls = 'labkey-grid-cell-invalid'; -// } -// -// return value; -// }, -// editor: { -// xtype: 'textfield' -// } + header: 'Observation/Score', + width: 200, + editable: true, + dataIndex: 'observation', + renderer: function(value, cellMetaData, record){ + if (Ext4.isEmpty(value) && ['Vet Attention'].indexOf(record.get('category')) == -1){ + cellMetaData.tdCls = 'labkey-grid-cell-invalid'; + } + + return value; + }, + editor: { + xtype: 'textfield' + } - width: 130, - dataIndex: 'inflammation', - editor: { - xtype: 'onprc_surgeryscorefield', - forceSelection: true - } },{ header: 'Inflammation', width: 130, From d4b8f9b06eca4c03da5ff31bb558e8c2b3eb9ddb Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 27 Sep 2024 17:31:03 -0700 Subject: [PATCH 36/72] Modified Surgical Rounds Clinical Observation width display size --- .../grid/ObservationsRowEditorGridPanel.js | 33 +++-- .../web/onprc_ehr/model/sources/Surgery.js | 119 +++--------------- 2 files changed, 41 insertions(+), 111 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js index 774a62ed7..918e114c1 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js @@ -162,14 +162,31 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { } },{ - header: 'Other', - width: 130, - dataIndex: 'other', - editor: { - xtype: 'onprc_surgeryotherfield', - forceSelection: true - - } + header: 'Other', + width: 200, + editable: true, + dataIndex: 'other', + editor: { + xtype: 'checkcombo', + displayField: 'value', + valueField: 'value', + forceSelection: true, + queryMode: 'local', + anyMaych: true, + value: 'N/A', + store: { + type: 'labkey-store', + schemaName:'sla', + queryName: 'Reference_Data', + columns: 'value', + defaultValue:'0 - None', + sort: 'sort_order', + filterArray: [ + LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), + LABKEY.Filter.create('ColumnName', 'Surgicalobservationother', LABKEY.Filter.Types.EQUAL)], + autoLoad: true + } + } },{ header: 'Remarks', diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js index 3c77bc336..2231c511f 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js @@ -55,16 +55,7 @@ } }, - 'study.blood': { - parentid: { - shownInGrid: true, - hidden: false, - header: 'Procedure Link', - columnConfig: { - width: 250 - } - } - }, + 'study.drug': { enddate: { hidden: false @@ -77,14 +68,7 @@ reason: { defaultValue: 'Procedure' }, - parentid: { - shownInGrid: true, - hidden: false, - header: 'Procedure Link', - columnConfig: { - width: 250 - } - }, + chargetype: { //NOTE: this will be inherited from the encounters record, so we dont want a default //defaultValue: 'DCM: Surgery Services', @@ -119,14 +103,7 @@ chargetype: { allowBlank: false }, - objectid: { - shownInGrid: true, - hidden: false, - header: 'Procedure Link', - columnConfig: { - width: 250 - } - }, + assistingstaff: { hidden: false, allowBlank: true //will be handled in trigger script @@ -155,71 +132,30 @@ set_number: { hidden: true }, - parentid: { - shownInGrid: true, - hidden: false, - header: 'Procedure Link', - columnConfig: { - width: 250 - } - }, + sort: { hidden: true } }, 'study.clinical_observations': { inflammation: { - xtype: 'onprc_surgeryexceptionfield', - showInGrid: true, - hidden: false, - defaultValue: '0 - None', - columnConfig: { - width: 150 - } + hidden: true }, bruising: { - xtype: 'onprc_surgeryexceptionfield', - showInGrid: true, - hidden: false, - defaultValue: '0 - None', - columnConfig: { - width: 150 - } + hidden: true }, other: { - xtype: 'onprc_surgeryotherfield', - showInGrid: true, - hidden: false, - columnConfig: { - width: 250 - } + hidden: true }, remark: { - hidden: false, - columnConfig: { - width: 250 - } + hidden: true }, performedby: { - hidden: false, - columnConfig: { - width: 150 - } - }, - parentid: { - shownInGrid: true, - hidden: false, - header: 'Procedure Link', - columnConfig: { - width: 250 - } + hidden: true }, + observation_score: { - xtype: 'onprc_surgeryscorefield', - defaultValue: 'Normal', - columnConfig: { - width: 150 - } + hidden: true } }, @@ -230,39 +166,16 @@ columnConfig: { width: 300 } - }, - parentid: { - shownInGrid: true, - hidden: false, - header: 'Procedure Link', - columnConfig: { - width: 250 - } - } + } + }, - 'study.weight': { - parentid: { - shownInGrid: true, - hidden: false, - header: 'Procedure Link', - columnConfig: { - width: 250 - } - } - }, + 'ehr.encounter_summaries': { category: { defaultValue: 'Narrative' - }, - parentid: { - shownInGrid: true, - hidden: false, - header: 'Procedure Link', - columnConfig: { - width: 250 - } - } + } + } } }); \ No newline at end of file From 2eff4020df90256f02f091bc65a9a4a1ef4a9160 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 27 Sep 2024 22:15:00 -0700 Subject: [PATCH 37/72] Modified Surgical Rounds Clinical Observation width display size --- .../grid/ObservationsRowEditorGridPanel.js | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js index 918e114c1..3ec381ee3 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js @@ -108,25 +108,31 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { } } },{ - header: 'Area', - width: 200, - editable: true, - dataIndex: 'area', - editor: { - xtype: 'labkey-combo', - displayField: 'value', - valueField: 'value', - forceSelection: true, - queryMode: 'local', - anyMaych: true, - value: 'N/A', - store: { - type: 'labkey-store', - schemaName: 'ehr_lookups', - queryName: 'observation_areas', - autoLoad: true - } - } + header: 'Area', + width: 200, + editable: true, + dataIndex: 'area', + editor: { + xtype: 'combobox', + displayField: 'value', + valueField: 'value', + forceSelection: true, + queryMode: 'local', + anyMaych: true, + value: 'N/A', + store: { + type: 'labkey-store', + schemaName:'sla', + queryName: 'Reference_Data', + columns: 'value', + defaultValue:'0 - None', + sort: 'sort_order', + filterArray: [ + LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), + LABKEY.Filter.create('ColumnName', 'Surgicalobservationarea', LABKEY.Filter.Types.EQUAL)], + autoLoad: true + } + } },{ header: 'Observation/Score', width: 200, From 684a71477b7a5c123daa33f0a5f9c236075fc52b Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 27 Sep 2024 22:57:21 -0700 Subject: [PATCH 38/72] Modified Surgical Rounds Clinical Observation width display size --- .../web/onprc_ehr/model/sources/Surgery.js | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js index 2231c511f..97c4f7951 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js @@ -140,7 +140,22 @@ 'study.clinical_observations': { inflammation: { hidden: true - }, + }, + area: { + lookup: { + xtype: 'combobox', + schemaName:'sla', + queryName: 'Reference_Data', + columns: 'value', + sort: 'sort_order', + editable: true, + header: 'Area', + filterArray: [ + LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), + LABKEY.Filter.create('ColumnName', 'Surgicalobservationarea', LABKEY.Filter.Types.EQUAL)], + autoLoad: true + } + }, bruising: { hidden: true }, @@ -148,14 +163,16 @@ hidden: true }, remark: { - hidden: true + hidden: true, + defaultValue: '' }, performedby: { hidden: true }, - observation_score: { - hidden: true + observation: { + hidden: true, + defaultValue: '' } }, From 65497b81fd76c6c9b6203857b0f5bdc2c2cfd41d Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 27 Sep 2024 22:59:05 -0700 Subject: [PATCH 39/72] Modified Surgical Rounds Clinical Observation width display size --- .../web/onprc_ehr/model/sources/Surgery.js | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js index 2231c511f..97c4f7951 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js @@ -140,7 +140,22 @@ 'study.clinical_observations': { inflammation: { hidden: true - }, + }, + area: { + lookup: { + xtype: 'combobox', + schemaName:'sla', + queryName: 'Reference_Data', + columns: 'value', + sort: 'sort_order', + editable: true, + header: 'Area', + filterArray: [ + LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), + LABKEY.Filter.create('ColumnName', 'Surgicalobservationarea', LABKEY.Filter.Types.EQUAL)], + autoLoad: true + } + }, bruising: { hidden: true }, @@ -148,14 +163,16 @@ hidden: true }, remark: { - hidden: true + hidden: true, + defaultValue: '' }, performedby: { hidden: true }, - observation_score: { - hidden: true + observation: { + hidden: true, + defaultValue: '' } }, From ed9da7bc2c8ea04167e341dabbe5ace10e5091fc Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Wed, 2 Oct 2024 15:33:53 -0700 Subject: [PATCH 40/72] Modified new Surgical Rounds program process to include default remarks values. --- onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js index 97c4f7951..602b876ce 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js @@ -164,15 +164,16 @@ }, remark: { hidden: true, - defaultValue: '' + defaultValue: 'Deferred entries until Surgical Rounds process' }, performedby: { - hidden: true + hidden: true, + allowBlank: true }, observation: { hidden: true, - defaultValue: '' + allowBlank: true } }, From 3695d8eff026fd73a4512ad475e98c327ccd7626 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 4 Oct 2024 00:36:00 -0700 Subject: [PATCH 41/72] Modified new Surgical Rounds program process to include default remarks values. --- .../scripts/onprc_ehr/onprc_triggers.js | 18 ++++++++++++++++++ .../grid/SurgicalRoundsRemarksGridPanel.js | 11 +++++++++++ .../web/onprc_ehr/model/sources/Surgery.js | 7 +++++-- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js b/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js index 26a68123b..67735444e 100644 --- a/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js +++ b/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js @@ -475,6 +475,24 @@ exports.init = function(EHR){ } } + if (row.Id && row.category != 'Incision' && (row.inflammation || row.bruising || row.other)) + { + var msg = '' + if (row.inflammtion) { + msg = 'This is not a valid entry onto the Inflammation input field' + } + else if (row.bruising) { + msg = 'This is not a valid entry onto the Bruising input field' + } + else if (row.other) { + msg = 'This is not a valid entry onto the Other input field' + } + + EHR.Server.Utils.addError(scriptErrors, 'category', msg, 'ERROR'); + + } + + }); diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js index 1ae4a851a..7c80a97b7 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js @@ -85,6 +85,17 @@ Ext4.define('ONPRC_EHR.grid.SurgicalRoundsRemarksGridPanel', { line += r.get('observation'); } + if (!Ext4.isEmpty(r.get('inflammation'))){ + line += '; [Inflammation]--> ' + r.get('inflammation'); + } + + if (!Ext4.isEmpty(r.get('bruising'))){ + line += '; [Bruising]--> ' +r.get('bruising'); + } + if (!Ext4.isEmpty(r.get('other'))){ + line += '; [Other]--> ' +r.get('other'); + } + if (r.get('remark')){ line += '. ' + r.get('remark'); } diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js index 602b876ce..d7bba27c1 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js @@ -139,8 +139,11 @@ }, 'study.clinical_observations': { inflammation: { - hidden: true - }, + hidden: true, + editorConfig: { + helpPopup: 'You are not allowed to enter values here if not an Incicision category'' + } + }, area: { lookup: { xtype: 'combobox', From 92673e98ea68d31b1938c9b09ab71eb1209e9394 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 4 Oct 2024 12:58:15 -0700 Subject: [PATCH 42/72] Modified new Surgical Rounds program process to include default remarks values. --- .../resources/scripts/onprc_ehr/onprc_triggers.js | 14 +++++++------- .../grid/SurgicalRoundsRemarksGridPanel.js | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js b/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js index 67735444e..0331c57f2 100644 --- a/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js +++ b/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js @@ -477,15 +477,15 @@ exports.init = function(EHR){ if (row.Id && row.category != 'Incision' && (row.inflammation || row.bruising || row.other)) { - var msg = '' - if (row.inflammtion) { - msg = 'This is not a valid entry onto the Inflammation input field' + var msg = ''; + if (row.Id && row.category != 'Incision' && row.inflammtion) { + msg = ' This is not a valid entry onto the Inflammation input field'; } - else if (row.bruising) { - msg = 'This is not a valid entry onto the Bruising input field' + if (row.Id && row.category != 'Incision' && row.bruising) { + msg += ' This is not a valid entry onto the Bruising input field'; } - else if (row.other) { - msg = 'This is not a valid entry onto the Other input field' + if (row.Id && row.category != 'Incision' && row.other) { + msg += ' This is not a valid entry onto the Other input field'; } EHR.Server.Utils.addError(scriptErrors, 'category', msg, 'ERROR'); diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js index 7c80a97b7..91e9f087b 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js @@ -44,7 +44,7 @@ Ext4.define('ONPRC_EHR.grid.SurgicalRoundsRemarksGridPanel', { this.columns.push({ name: 'observations', header: 'Observations', - width: 400, + width: 600, renderer: function(value, cellMetaData, record, rowIndex, colIndex, store){ if (!this.obsStore){ this.obsStore = store.storeCollection.getClientStoreByName('Clinical Observations'); @@ -93,7 +93,7 @@ Ext4.define('ONPRC_EHR.grid.SurgicalRoundsRemarksGridPanel', { line += '; [Bruising]--> ' +r.get('bruising'); } if (!Ext4.isEmpty(r.get('other'))){ - line += '; [Other]--> ' +r.get('other'); + line += '; [Other`]--> ' +r.get('other'); } if (r.get('remark')){ From 3384a877b22ec78f99943e7b354b95bc36b8b1c7 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 4 Oct 2024 13:07:51 -0700 Subject: [PATCH 43/72] Modified new Surgical Rounds program process to include default remarks values. --- .../web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js index 91e9f087b..4257bac9b 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js @@ -44,7 +44,7 @@ Ext4.define('ONPRC_EHR.grid.SurgicalRoundsRemarksGridPanel', { this.columns.push({ name: 'observations', header: 'Observations', - width: 600, + width: 700, renderer: function(value, cellMetaData, record, rowIndex, colIndex, store){ if (!this.obsStore){ this.obsStore = store.storeCollection.getClientStoreByName('Clinical Observations'); From 2f015bfe3ec51d75fd39a68ecf472d0bcd239dfb Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 4 Oct 2024 14:04:37 -0700 Subject: [PATCH 44/72] Modified new Surgical Rounds program process to include default remarks values. --- onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js b/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js index 0331c57f2..15e48426b 100644 --- a/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js +++ b/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js @@ -479,13 +479,13 @@ exports.init = function(EHR){ { var msg = ''; if (row.Id && row.category != 'Incision' && row.inflammtion) { - msg = ' This is not a valid entry onto the Inflammation input field'; + msg = 'Observation Category: ' + row.category + ' - This is an vinalid entry onto the Inflammation input field'; } if (row.Id && row.category != 'Incision' && row.bruising) { - msg += ' This is not a valid entry onto the Bruising input field'; + msg += 'Observation Category: ' + row.category + ' - This is an invalid entry onto the Bruising input field'; } if (row.Id && row.category != 'Incision' && row.other) { - msg += ' This is not a valid entry onto the Other input field'; + msg += 'Observation Category: ' + row.category + ' - This is an invalid entry onto the Other input field'; } EHR.Server.Utils.addError(scriptErrors, 'category', msg, 'ERROR'); From c11c644be1d4ba35d7cc22ab6184d22f284c14d3 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 4 Oct 2024 14:07:39 -0700 Subject: [PATCH 45/72] Modified new Surgical Rounds program process to include default remarks values. --- .../web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js index 4257bac9b..eb99692d7 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js @@ -93,7 +93,7 @@ Ext4.define('ONPRC_EHR.grid.SurgicalRoundsRemarksGridPanel', { line += '; [Bruising]--> ' +r.get('bruising'); } if (!Ext4.isEmpty(r.get('other'))){ - line += '; [Other`]--> ' +r.get('other'); + line += '; [Other]--> ' +r.get('other'); } if (r.get('remark')){ From 6bd7d88683f9168789e21bcfb446199c52abe5cd Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Mon, 7 Oct 2024 12:08:13 -0700 Subject: [PATCH 46/72] Modified Surgical Rounds program to exclude type of procedure values. --- onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js index d7bba27c1..602b876ce 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js @@ -139,11 +139,8 @@ }, 'study.clinical_observations': { inflammation: { - hidden: true, - editorConfig: { - helpPopup: 'You are not allowed to enter values here if not an Incicision category'' - } - }, + hidden: true + }, area: { lookup: { xtype: 'combobox', From 81c0f04fdcdbcfa490030b1043c6d44cf8992961 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Mon, 7 Oct 2024 21:37:20 -0700 Subject: [PATCH 47/72] Modified Surgical Rounds validation process. --- .../resources/scripts/onprc_ehr/onprc_triggers.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js b/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js index 15e48426b..0b345a932 100644 --- a/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js +++ b/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js @@ -474,18 +474,22 @@ exports.init = function(EHR){ EHR.Server.Utils.addError(scriptErrors, 'category', msg, 'ERROR'); } } + }); + + //Added 10-7-2024 Blasa + EHR.Server.TriggerManager.registerHandlerForQuery(EHR.Server.TriggerManager.Events.BEFORE_UPSERT, 'study', 'clinical_observations', function(helper, scriptErrors, row, oldRow) { if (row.Id && row.category != 'Incision' && (row.inflammation || row.bruising || row.other)) { var msg = ''; - if (row.Id && row.category != 'Incision' && row.inflammtion) { - msg = 'Observation Category: ' + row.category + ' - This is an vinalid entry onto the Inflammation input field'; + if (row.Id && row.category != 'Incision' && row.inflammation) { + msg = row.category + ': was an invalid entry onto the Inflammation input field, only Incision entries are allowed'; } if (row.Id && row.category != 'Incision' && row.bruising) { - msg += 'Observation Category: ' + row.category + ' - This is an invalid entry onto the Bruising input field'; + msg = row.category + ': was an invalid entry onto the Bruising input field, only Incision entries are allowed'; } if (row.Id && row.category != 'Incision' && row.other) { - msg += 'Observation Category: ' + row.category + ' - This is an invalid entry onto the Other input field'; + msg = row.category + ': was an invalid entry onto the Other input field, only Incision entries are allowed'; } EHR.Server.Utils.addError(scriptErrors, 'category', msg, 'ERROR'); From d703e7a152677e1eadf221b28c23e3c49f53ad25 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Tue, 8 Oct 2024 22:47:44 -0700 Subject: [PATCH 48/72] Modified Surgical Rounds validation process. --- .../grid/ObservationsRowEditorGridPanel.js | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js index 3ec381ee3..12d5b2274 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js @@ -135,19 +135,30 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { } },{ header: 'Observation/Score', - width: 200, - editable: true, - dataIndex: 'observation', - renderer: function(value, cellMetaData, record){ - if (Ext4.isEmpty(value) && ['Vet Attention'].indexOf(record.get('category')) == -1){ - cellMetaData.tdCls = 'labkey-grid-cell-invalid'; - } - - return value; - }, - editor: { - xtype: 'textfield' - } + width: 200, + editable: true, + dataIndex: 'area', + editor: { + xtype: 'combobox', + displayField: 'value', + valueField: 'value', + forceSelection: true, + queryMode: 'local', + anyMaych: true, + value: 'N/A', + store: { + type: 'labkey-store', + schemaName:'sla', + queryName: 'Reference_Data', + columns: 'value', + defaultValue:'0 - None', + sort: 'sort_order', + filterArray: [ + LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), + LABKEY.Filter.create('ColumnName', 'surgicalobservationscore', LABKEY.Filter.Types.EQUAL)], + autoLoad: true + } + } },{ header: 'Inflammation', From 87c3e3b51402b5ba33f7f18457e4a44e5debb5f1 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Wed, 9 Oct 2024 10:42:34 -0700 Subject: [PATCH 49/72] Modified Surgical Rounds validation process. --- .../web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js index eb99692d7..15189d7ee 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js @@ -86,18 +86,18 @@ Ext4.define('ONPRC_EHR.grid.SurgicalRoundsRemarksGridPanel', { } if (!Ext4.isEmpty(r.get('inflammation'))){ - line += '; [Inflammation]--> ' + r.get('inflammation'); + line += '; [Inflammation]--> ' + r.get('inflammation'); } if (!Ext4.isEmpty(r.get('bruising'))){ - line += '; [Bruising]--> ' +r.get('bruising'); + line += '; [Bruising]--> ' +r.get('bruising'); } if (!Ext4.isEmpty(r.get('other'))){ - line += '; [Other]--> ' +r.get('other'); + line += '; [Other]--> ' + r.get('other'); } if (r.get('remark')){ - line += '. ' + r.get('remark'); + line += '; [Remarks]--> ' + r.get('remark'); } if (!r.get('remark') && Ext4.isEmpty(r.get('observation'))){ From 3722854e5a1cdf8beb6ff070d38d25af081b58f9 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Wed, 9 Oct 2024 14:10:06 -0700 Subject: [PATCH 50/72] Modified Surgical Rounds validation process. --- .../onprc_ehr/form/field/SurgeryEntryField.js | 6 +-- .../grid/ObservationsRowEditorGridPanel.js | 51 +++++++------------ .../web/onprc_ehr/model/sources/Surgery.js | 10 ++-- 3 files changed, 28 insertions(+), 39 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js b/onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js index e4a64f565..3bcff3996 100644 --- a/onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js +++ b/onprc_ehr/resources/web/onprc_ehr/form/field/SurgeryEntryField.js @@ -27,13 +27,12 @@ Ext4.define('onprc_ehr.form.field.SurgeryExceptionField', { Ext4.apply(this, { displayField:'value', valueField: 'value', + defaultValue: '0 - None', queryMode: 'local', - defaultValue:'0 - None', store: Ext4.create('LABKEY.ext4.data.Store', { schemaName: 'sla', queryName: 'Reference_Data', columns: 'value', - defaultValue:'0 - None', sort: 'sort_order', filterArray: [ LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), @@ -64,12 +63,11 @@ Ext4.define('onprc_ehr.form.field.SurgeryScoreField', { displayField:'value', valueField: 'value', queryMode: 'local', - defaultValue:'0 - None', + defaultValue:'Normal', store: Ext4.create('LABKEY.ext4.data.Store', { schemaName: 'sla', queryName: 'Reference_Data', columns: 'value', - defaultValue:'Normal', sort: 'sort_order', filterArray: [ LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js index 12d5b2274..a31ece73b 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js @@ -97,7 +97,7 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { valueField: 'value', forceSelection: true, queryMode: 'local', - anyMaych: true, + anyMatch: true, store: { type: 'labkey-store', schemaName: 'ehr', @@ -118,8 +118,8 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { valueField: 'value', forceSelection: true, queryMode: 'local', - anyMaych: true, - value: 'N/A', + anyMatch: true, + value: 'All', store: { type: 'labkey-store', schemaName:'sla', @@ -133,32 +133,22 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { autoLoad: true } } - },{ - header: 'Observation/Score', - width: 200, - editable: true, - dataIndex: 'area', - editor: { - xtype: 'combobox', - displayField: 'value', - valueField: 'value', - forceSelection: true, - queryMode: 'local', - anyMaych: true, - value: 'N/A', - store: { - type: 'labkey-store', - schemaName:'sla', - queryName: 'Reference_Data', - columns: 'value', - defaultValue:'0 - None', - sort: 'sort_order', - filterArray: [ - LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), - LABKEY.Filter.create('ColumnName', 'surgicalobservationscore', LABKEY.Filter.Types.EQUAL)], - autoLoad: true - } - } + },{ + header: 'Observation/Score', + width: 200, + editable: true, + dataIndex: 'observation', + sort: 'sort_order', + renderer: function(value, cellMetaData, record){ + if (Ext4.isEmpty(value) && ['Vet Attention'].indexOf(record.get('category')) == -1){ + cellMetaData.tdCls = 'labkey-grid-cell-invalid'; + } + + return value; + }, + editor: { + xtype: 'textfield' + } },{ header: 'Inflammation', @@ -187,10 +177,7 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { xtype: 'checkcombo', displayField: 'value', valueField: 'value', - forceSelection: true, queryMode: 'local', - anyMaych: true, - value: 'N/A', store: { type: 'labkey-store', schemaName:'sla', diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js index 602b876ce..c320f5326 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js @@ -139,7 +139,8 @@ }, 'study.clinical_observations': { inflammation: { - hidden: true + hidden: true, + defaultValue: '0 - None' }, area: { lookup: { @@ -148,6 +149,7 @@ queryName: 'Reference_Data', columns: 'value', sort: 'sort_order', + defaultValue:'All', editable: true, header: 'Area', filterArray: [ @@ -157,10 +159,12 @@ } }, bruising: { - hidden: true + hidden: true, + defaultValue:'0 - None' }, other: { - hidden: true + hidden: true, + defaultValue:'0 - None' }, remark: { hidden: true, From 0b1066c3d77dd5b24efadd81907a95d00dec2ebb Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 11 Oct 2024 08:37:50 -0700 Subject: [PATCH 51/72] Modified Mense input form to allow error messages to be displayed when trigger scripts generates a warning. --- .../resources/queries/study/latestObservationsForCase.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/onprc_ehr/resources/queries/study/latestObservationsForCase.sql b/onprc_ehr/resources/queries/study/latestObservationsForCase.sql index cc61dbc96..b51ad9027 100644 --- a/onprc_ehr/resources/queries/study/latestObservationsForCase.sql +++ b/onprc_ehr/resources/queries/study/latestObservationsForCase.sql @@ -26,8 +26,8 @@ SELECT c.isOpen as caseIsOpen, o.taskid, o.inflammation, - o.bruising, - o.other + o.bruising + FROM study.clinical_observations o JOIN study.cases c ON (c.objectid = o.caseid) From 75e1b3029d2d8a97e3b34d4d3d05c1d7b8fd82db Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Thu, 14 Nov 2024 10:05:05 -0800 Subject: [PATCH 52/72] Modified Surgical Rounds look-up tables. --- .../web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js index a31ece73b..36f5f9c97 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js @@ -122,14 +122,13 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { value: 'All', store: { type: 'labkey-store', - schemaName:'sla', - queryName: 'Reference_Data', + schemaName:'ehr_lookups', + queryName: 'observation_areas', columns: 'value', defaultValue:'0 - None', - sort: 'sort_order', + sort: 'value', filterArray: [ - LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), - LABKEY.Filter.create('ColumnName', 'Surgicalobservationarea', LABKEY.Filter.Types.EQUAL)], + LABKEY.Filter.create('date_disabled', null, LABKEY.Filter.Types.ISBLANK)], autoLoad: true } } From 363a4d05d91323835223dce5a484d00a9f93051e Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 15 Nov 2024 15:41:24 -0800 Subject: [PATCH 53/72] Modified Surgical Rounds look-up tables. --- .../web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js index 15189d7ee..28ac291a8 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/SurgicalRoundsRemarksGridPanel.js @@ -86,18 +86,18 @@ Ext4.define('ONPRC_EHR.grid.SurgicalRoundsRemarksGridPanel', { } if (!Ext4.isEmpty(r.get('inflammation'))){ - line += '; [Inflammation]--> ' + r.get('inflammation'); + line += ';' + r.get('inflammation') + ' Inflammation'; } if (!Ext4.isEmpty(r.get('bruising'))){ - line += '; [Bruising]--> ' +r.get('bruising'); + line += ';' +r.get('bruising') + ' Bruising'; } if (!Ext4.isEmpty(r.get('other'))){ - line += '; [Other]--> ' + r.get('other'); + line += ';' + r.get('other') + ' Other'; } if (r.get('remark')){ - line += '; [Remarks]--> ' + r.get('remark'); + line += ';' + r.get('remark') + ' Remark'; } if (!r.get('remark') && Ext4.isEmpty(r.get('observation'))){ From 5523fd050953c8b106d0b983e05318783f573338 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Thu, 5 Dec 2024 22:13:47 -0800 Subject: [PATCH 54/72] Modified Surgical rounds case scripts. --- .../window/OpenSurgeryCasesWindow.js | 389 ++++++++++++++++++ .../dataentry/SingleSurgeryFormType.java | 4 +- 2 files changed, 391 insertions(+), 2 deletions(-) create mode 100644 onprc_ehr/resources/web/onprc_ehr/window/OpenSurgeryCasesWindow.js diff --git a/onprc_ehr/resources/web/onprc_ehr/window/OpenSurgeryCasesWindow.js b/onprc_ehr/resources/web/onprc_ehr/window/OpenSurgeryCasesWindow.js new file mode 100644 index 000000000..2469b5da4 --- /dev/null +++ b/onprc_ehr/resources/web/onprc_ehr/window/OpenSurgeryCasesWindow.js @@ -0,0 +1,389 @@ +/* + * Copyright (c) 2014-2019 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 + */ +/** + * @cfg sourceStore + */ +Ext4.define('ONPRC_EHR.window.OpenSurgeryCasesWindow', { + extend: 'Ext.window.Window', + minWidth: 600, + minHeight: 200, + + initComponent: function(){ + Ext4.apply(this, { + modal: true, + closeAction: 'destroy', + title: 'Open Cases', + bodyStyle: 'padding: 5px;', + items: [{ + html: 'Loading...', + border: false + }], + buttons: [{ + text: 'Open Selected Cases', + scope: this, + handler: this.onSubmit + },{ + text: 'Close', + handler: function(btn){ + btn.up('window').close(); + } + }] + }); + + this.callParent(arguments); + + this.getDemographics(); + }, + + getDemographics: function(){ + var ids = []; + this.sourceStore.each(function(rec){ + if (!rec.get('Id')){ + return; + } + + ids.push(rec.get('Id')); + }, this); + + ids = Ext4.unique(ids); + EHR.DemographicsCache.getDemographics(ids, this.onLoad, this); + }, + + onLoad: function(ids, demographicsMap){ + var animalMap = {}; + var columns = 6; + + var animalMapObs = {}; + + this.sourceStore.each(function(rec, recIdx){ + if (!rec.get('Id') || !rec.get('procedureid')){ + return; + } + + animalMap[rec.get('Id')] = animalMap[rec.get('Id')] || { + encounterRecords: [], + procedureRecords: [], + procedureNames: [], + maxFollowup: 0 + }; + + var procedureStore = EHR.DataEntryUtils.getProceduresStore(); + var procedureRecIdx = procedureStore.findExact('rowid', rec.get('procedureid')); + LDK.Assert.assertTrue('Unknown procedure id: ' + rec.get('procedureid'), procedureRecIdx != -1); + if (procedureRecIdx == -1){ + return; + } + + var procedureRec = procedureStore.getAt(procedureRecIdx); + + animalMap[rec.get('Id')].procedureRecords.push(procedureRec); + animalMap[rec.get('Id')].procedureNames.push(procedureRec.get('name')); + + if (procedureRec.get('followupDays') > animalMap[rec.get('Id')].maxFollowup) + animalMap[rec.get('Id')].maxFollowup = procedureRec.get('followupDays'); + + animalMap[rec.get('Id')].encounterRecords.push(rec); + }, this); + +// ----------------------------------------- + + this.sourceStoreobs.each(function(rec, recIdx){ + if (!rec.get('Id')) { + return; + } + + animalMapObs[rec.get('Id')] = animalMapObs[rec.get('Id')] || { + observationRecords: [], + + }; + animalMapObs[rec.get('Id')].observationRecords.push(rec); + }, this); + +//----------------------------------------------------- + + var toAdd = []; + var rowIdx = 0; + for (var id in animalMap){ + var obj = animalMap[id]; + var obj2 = animalMapObs[id]; + obj.procedureNames = Ext4.unique(obj.procedureNames); + var ar = demographicsMap[id]; + rowIdx++; + + toAdd.push({ + xtype: 'displayfield', + value: id, + fieldName: 'Id', + rowIdx: rowIdx + }); + + if (!ar || ar.getCalculatedStatus() != 'Alive'){ + toAdd.push({ + xtype: 'displayfield', + value: 'Unknown or non-living animal Id, cannot open case', + colspan: columns - 1, + rowIdx: rowIdx + }); + + continue; + } + + toAdd.push({ + xtype: 'displayfield', + value: obj.procedureNames.join(', '), + width: 200, + rowIdx: rowIdx + }); + + toAdd.push({ + xtype: 'displayfield', + value: obj.maxFollowup + }); + + var hasSurgCase = false; + var caseRec = null; + if (ar.getActiveCases()){ + Ext4.Array.forEach(ar.getActiveCases(), function(rec){ + if (rec.category == 'Surgery'){ + hasSurgCase = true; + caseRec = rec; + } + }, this); + } + + toAdd.push({ + xtype: 'textarea', + fieldName: 'remark', + height: 75, + width: 250, + rowIdx: rowIdx, + value: caseRec ? ((caseRec.remark ? (caseRec.remark + '\n' + Ext4.Date.format(new Date(), LABKEY.extDefaultDateFormat) + ': ') : '') + obj.procedureNames.join(', ')) : 'Open Sx Case: ' + obj.procedureNames.join(', ') + }); + + toAdd.push({ + xtype: 'displayfield', + value: hasSurgCase ? 'Y' : 'N', + rowIdx: rowIdx, + fieldName: 'caseId', + caseId: caseRec ? caseRec.lsid : null + }); + + toAdd.push({ + xtype: 'checkbox', + fieldName: 'exclude', + encounterRecords: obj.encounterRecords, + observationRecords: obj2.observationRecords, + checked: (obj.maxFollowup === 0), + rowIdx: rowIdx + }); + } + + this.removeAll(); + + if (toAdd.length){ + toAdd = [{ + html: 'Id' + },{ + html: 'Procedure(s)' + },{ + html: 'Followup Days', + width: 80 + },{ + html: 'Case Description' + },{ + html: 'Has Existing Case?', + width: 80 + },{ + html: 'Skip Opening?', + width: 70 + }].concat(toAdd); + + this.add({ + defaults: { + style: 'margin-right: 5px;', + border: false + }, + border: false, + layout: { + type: 'table', + columns: columns + }, + items: toAdd + }); + } + else { + this.add({ + html: 'No IDs To Show' + }); + } + }, + + onSubmit: function(){ + var recordMap = {}; + var caseRecordsToInsert = []; + var caseRecordsToUpdate = []; + + var recordMapObs = {}; + + + var success = true; + var cbs = this.query('checkbox'); + Ext4.Array.forEach(cbs, function(cb){ + if (!cb.getValue()){ + var id = this.query('field[rowIdx=' + cb.rowIdx + '][fieldName=Id]')[0].getValue(); + var remark = this.query('field[rowIdx=' + cb.rowIdx + '][fieldName=remark]')[0].getValue(); + var existingCase = this.query('component[rowIdx=' + cb.rowIdx + '][fieldName=caseId]')[0].caseId; + recordMap[id] = recordMap[id] || []; + recordMap[id] = recordMap[id].concat(cb.encounterRecords); + + recordMapObs[id] = recordMapObs[id] || []; + recordMapObs[id] = recordMapObs[id].concat(cb.observationRecords); + + if (!remark){ + Ext4.Msg.alert('Error', 'Must Enter A Remark For All Cases'); + success = false; + return; + } + + if (existingCase){ + caseRecordsToUpdate.push({ + lsid: existingCase, + remark: remark + }); + } + else { + caseRecordsToInsert.push({ + Id: id, + date: new Date(), + remark: remark, + category: 'Surgery', + performedby: LABKEY.Security.currentUser.displayName + }); + } + } + }, this); + + if (!success){ + return; + } + + if (caseRecordsToInsert.length || caseRecordsToUpdate.length){ + this.hide(); + Ext4.Msg.wait('Loading...'); + var multi = new LABKEY.MultiRequest(); + + if (caseRecordsToInsert.length){ + multi.add(LABKEY.Query.insertRows, { + schemaName: 'study', + queryName: 'cases', + rows: caseRecordsToInsert, + scope: this, + failure: LDK.Utils.getErrorCallback(), + success: function(results){ + if (!results || !results.rows){ + return; + } +// Add Observation record to the same case Ext4.Array.each(subjectArray, function(subj) + Ext4.Array.forEach(results.rows, function(row){ + if (row.Id && row.objectid){ + var records = recordMapObs[row.Id]; + Ext4.Array.each(records, function(rec){ + console.log('updating observation with caseid'); + rec.set('caseid', row.objectid); + }, this); + } + }, this); + + + Ext4.Array.forEach(results.rows, function(row){ + if (row.Id && row.objectid){ + var records = recordMap[row.Id]; + Ext4.Array.forEach(records, function(rec){ + console.log('updating procedure with caseid'); + rec.set('caseid', row.objectid); + }, this); + } + }, this); + } + }); + } + + if (caseRecordsToUpdate.length){ + multi.add(LABKEY.Query.updateRows, { + schemaName: 'study', + queryName: 'cases', + rows: caseRecordsToUpdate, + scope: this, + failure: LDK.Utils.getErrorCallback(), + success: function(results){ + if (!results || !results.rows){ + return; + } + + Ext4.Array.forEach(results.rows, function(row){ + if (row.Id && row.objectid){ + var records = recordMap[row.Id]; + Ext4.Array.forEach(records, function(rec){ + console.log('updating procedure with caseid') + rec.set('caseid', row.objectid); + }, this); + } + }, this); + } + }); + } + + multi.send(function(){ + this.close(); + Ext4.Msg.hide(); + Ext4.Msg.alert('Success', 'Surgical cases opened'); + EHR.DemographicsCache.clearCache(Ext4.Object.getKeys(recordMap)); + }, this); + } + else { + this.close(); + Ext4.Msg.alert('Complete', 'There are no cases to open'); + } + } +}); + +EHR.DataEntryUtils.registerDataEntryFormButton('OPENSURGERYCASEST', { + text: 'Open Cases', + name: 'openSurgeryCase', + successURL: LABKEY.ActionURL.getParameter('srcURL') || LABKEY.ActionURL.buildURL('ehr', 'enterData.view'), + disabled: true, + itemId: 'openSurgeryCases', + requiredPermissions: [ + [EHR.QCStates.COMPLETED, 'update', [{schemaName: 'study', queryName: 'Cases'}]] + ], + handler: function(btn){ + var panel = btn.up('ehr-dataentrypanel'); + LDK.Assert.assertNotEmpty('Unable to find dataentrypanel from OPENSURGERYCASES button', panel); + + //find id + var clientStore = panel.storeCollection.getClientStoreByName('encounters') || panel.storeCollection.getClientStoreByName('Clinical Encounters'); + LDK.Assert.assertNotEmpty('Unable to find clientStore from OPENSURGERYCASES button', clientStore); + + if (!clientStore.getCount()){ + Ext4.Msg.alert('Error', 'No Surgeries Entered'); + return; + } + + //extract observation record + var obsStore = panel.storeCollection.getClientStoreByName('clinical_observations') || panel.storeCollection.getClientStoreByName('Clinical Observations'); + LDK.Assert.assertNotEmpty('Unable to find obsStore from OPENSURGERYCASES button', obsStore); + + if (!obsStore.getCount()){ + Ext4.Msg.alert('Error', 'No Observation Entered'); + return; + } + + Ext4.create('ONPRC_EHR.window.OpenSurgeryCasesWindow', { + sourceStore: clientStore, + sourceStoreobs: obsStore + }).show(); + } +}); diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java index f381faa24..e8b16812b 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java @@ -66,7 +66,7 @@ public SingleSurgeryFormType(DataEntryFormContext ctx, Module owner) } addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/model/sources/Surgery.js")); - addClientDependency(ClientDependency.supplierFromPath("ehr/window/OpenSurgeryCasesWindow.js")); + addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/window/OpenSurgeryCasesWindow.js")); addClientDependency(ClientDependency.supplierFromPath("ehr/panel/SurgeryDataEntryPanel.js")); // Added: 8-27-2024 r. Blasa addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/form/field/SurgeryEntryField.js")); @@ -95,7 +95,7 @@ public SingleSurgeryFormType(DataEntryFormContext ctx, Module owner) protected List getButtonConfigs() { List ret = super.getButtonConfigs(); - ret.add("OPENSURGERYCASES"); + ret.add("OPENSURGERYCASEST"); return ret; } From 0359e63705862d68be80563b4dcb66c2422fa32b Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Mon, 9 Dec 2024 15:04:13 -0800 Subject: [PATCH 55/72] Modified Surgical rounds case scripts. --- .../scripts/onprc_ehr/onprc_triggers.js | 11 ++- .../window/OpenSurgeryCasesWindow.js | 76 ++++++------------- 2 files changed, 32 insertions(+), 55 deletions(-) diff --git a/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js b/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js index 0b345a932..4abc23e66 100644 --- a/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js +++ b/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js @@ -482,17 +482,20 @@ exports.init = function(EHR){ if (row.Id && row.category != 'Incision' && (row.inflammation || row.bruising || row.other)) { var msg = ''; - if (row.Id && row.category != 'Incision' && row.inflammation) { + if (row.Id && row.category != 'Incision' && row.inflammation && row.inflammation == null) { msg = row.category + ': was an invalid entry onto the Inflammation input field, only Incision entries are allowed'; + EHR.Server.Utils.addError(scriptErrors, 'category', msg, 'ERROR'); } - if (row.Id && row.category != 'Incision' && row.bruising) { + if (row.Id && row.category != 'Incision' && row.bruising && row.bruinsing == null) { msg = row.category + ': was an invalid entry onto the Bruising input field, only Incision entries are allowed'; + EHR.Server.Utils.addError(scriptErrors, 'category', msg, 'ERROR'); } - if (row.Id && row.category != 'Incision' && row.other) { + if (row.Id && row.category != 'Incision' && row.other && row.other == null) { msg = row.category + ': was an invalid entry onto the Other input field, only Incision entries are allowed'; + EHR.Server.Utils.addError(scriptErrors, 'category', msg, 'ERROR'); } - EHR.Server.Utils.addError(scriptErrors, 'category', msg, 'ERROR'); + } diff --git a/onprc_ehr/resources/web/onprc_ehr/window/OpenSurgeryCasesWindow.js b/onprc_ehr/resources/web/onprc_ehr/window/OpenSurgeryCasesWindow.js index 2469b5da4..39548c39e 100644 --- a/onprc_ehr/resources/web/onprc_ehr/window/OpenSurgeryCasesWindow.js +++ b/onprc_ehr/resources/web/onprc_ehr/window/OpenSurgeryCasesWindow.js @@ -56,8 +56,6 @@ Ext4.define('ONPRC_EHR.window.OpenSurgeryCasesWindow', { var animalMap = {}; var columns = 6; - var animalMapObs = {}; - this.sourceStore.each(function(rec, recIdx){ if (!rec.get('Id') || !rec.get('procedureid')){ return; @@ -88,27 +86,10 @@ Ext4.define('ONPRC_EHR.window.OpenSurgeryCasesWindow', { animalMap[rec.get('Id')].encounterRecords.push(rec); }, this); -// ----------------------------------------- - - this.sourceStoreobs.each(function(rec, recIdx){ - if (!rec.get('Id')) { - return; - } - - animalMapObs[rec.get('Id')] = animalMapObs[rec.get('Id')] || { - observationRecords: [], - - }; - animalMapObs[rec.get('Id')].observationRecords.push(rec); - }, this); - -//----------------------------------------------------- - var toAdd = []; var rowIdx = 0; for (var id in animalMap){ var obj = animalMap[id]; - var obj2 = animalMapObs[id]; obj.procedureNames = Ext4.unique(obj.procedureNames); var ar = demographicsMap[id]; rowIdx++; @@ -175,7 +156,6 @@ Ext4.define('ONPRC_EHR.window.OpenSurgeryCasesWindow', { xtype: 'checkbox', fieldName: 'exclude', encounterRecords: obj.encounterRecords, - observationRecords: obj2.observationRecords, checked: (obj.maxFollowup === 0), rowIdx: rowIdx }); @@ -226,9 +206,6 @@ Ext4.define('ONPRC_EHR.window.OpenSurgeryCasesWindow', { var caseRecordsToInsert = []; var caseRecordsToUpdate = []; - var recordMapObs = {}; - - var success = true; var cbs = this.query('checkbox'); Ext4.Array.forEach(cbs, function(cb){ @@ -239,9 +216,6 @@ Ext4.define('ONPRC_EHR.window.OpenSurgeryCasesWindow', { recordMap[id] = recordMap[id] || []; recordMap[id] = recordMap[id].concat(cb.encounterRecords); - recordMapObs[id] = recordMapObs[id] || []; - recordMapObs[id] = recordMapObs[id].concat(cb.observationRecords); - if (!remark){ Ext4.Msg.alert('Error', 'Must Enter A Remark For All Cases'); success = false; @@ -286,27 +260,26 @@ Ext4.define('ONPRC_EHR.window.OpenSurgeryCasesWindow', { if (!results || !results.rows){ return; } -// Add Observation record to the same case Ext4.Array.each(subjectArray, function(subj) + Ext4.Array.forEach(results.rows, function(row){ if (row.Id && row.objectid){ - var records = recordMapObs[row.Id]; - Ext4.Array.each(records, function(rec){ - console.log('updating observation with caseid'); + var records = recordMap[row.Id]; + Ext4.Array.forEach(records, function(rec){ + console.log('updating procedure with caseid'); rec.set('caseid', row.objectid); }, this); + + this.caseUpdateStores.forEach(function(store){ + if (store.getFields().get('caseid') && store.getFields().get('Id')){ + store.each((rec) => { + if (rec.get('Id') == row.Id){ + rec.set('caseid', row.objectid); + } + }, this); + } + }, this); } }, this); - - - Ext4.Array.forEach(results.rows, function(row){ - if (row.Id && row.objectid){ - var records = recordMap[row.Id]; - Ext4.Array.forEach(records, function(rec){ - console.log('updating procedure with caseid'); - rec.set('caseid', row.objectid); - }, this); - } - }, this); } }); } @@ -330,6 +303,16 @@ Ext4.define('ONPRC_EHR.window.OpenSurgeryCasesWindow', { console.log('updating procedure with caseid') rec.set('caseid', row.objectid); }, this); + + this.caseUpdateStores.forEach(function(store){ + if (store.getFields().get('caseid') && store.getFields().get('Id')){ + store.each((rec) => { + if (rec.get('Id') == row.Id){ + rec.set('caseid', row.objectid); + } + }, this); + } + }, this); } }, this); } @@ -372,18 +355,9 @@ EHR.DataEntryUtils.registerDataEntryFormButton('OPENSURGERYCASEST', { return; } - //extract observation record - var obsStore = panel.storeCollection.getClientStoreByName('clinical_observations') || panel.storeCollection.getClientStoreByName('Clinical Observations'); - LDK.Assert.assertNotEmpty('Unable to find obsStore from OPENSURGERYCASES button', obsStore); - - if (!obsStore.getCount()){ - Ext4.Msg.alert('Error', 'No Observation Entered'); - return; - } - Ext4.create('ONPRC_EHR.window.OpenSurgeryCasesWindow', { sourceStore: clientStore, - sourceStoreobs: obsStore + caseUpdateStores: panel.storeCollection.clientStores.items, }).show(); } }); From 7e1d1731054070c3aeac409184251bd70d4469c2 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Mon, 9 Dec 2024 15:05:59 -0800 Subject: [PATCH 56/72] Modified Surgical rounds case scripts. --- .../resources/web/onprc_ehr/model/sources/Surgery.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js index c320f5326..b8cfd69ae 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js @@ -139,8 +139,7 @@ }, 'study.clinical_observations': { inflammation: { - hidden: true, - defaultValue: '0 - None' + hidden: true }, area: { lookup: { @@ -159,13 +158,11 @@ } }, bruising: { - hidden: true, - defaultValue:'0 - None' + hidden: true }, other: { - hidden: true, - defaultValue:'0 - None' - }, + hidden: true + }, remark: { hidden: true, defaultValue: 'Deferred entries until Surgical Rounds process' From 7fc47009379308e5f065e635f16555cf4b329e35 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Wed, 11 Dec 2024 13:21:23 -0800 Subject: [PATCH 57/72] Modified Surgical rounds case scripts. --- ...{onprc_ehr-23.015-23.016.sql => onprc_ehr-23.016-23.017.sql} | 0 onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename onprc_ehr/resources/schemas/dbscripts/sqlserver/{onprc_ehr-23.015-23.016.sql => onprc_ehr-23.016-23.017.sql} (100%) diff --git a/onprc_ehr/resources/schemas/dbscripts/sqlserver/onprc_ehr-23.015-23.016.sql b/onprc_ehr/resources/schemas/dbscripts/sqlserver/onprc_ehr-23.016-23.017.sql similarity index 100% rename from onprc_ehr/resources/schemas/dbscripts/sqlserver/onprc_ehr-23.015-23.016.sql rename to onprc_ehr/resources/schemas/dbscripts/sqlserver/onprc_ehr-23.016-23.017.sql diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java b/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java index df0f81a3f..82424918e 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java @@ -126,7 +126,7 @@ public String getName() @Override public @Nullable Double getSchemaVersion() { - return 23.016; + return 23.017; } @Override From e371783fb11dd0b5d74a7d8da675027a2a5c2f60 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 13 Dec 2024 21:37:25 -0800 Subject: [PATCH 58/72] Modified Surgical Rounds process. --- .../resources/queries/study/clinical_observations.query.xml | 4 ++++ onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js | 6 +++--- onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js | 4 ++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/onprc_ehr/resources/queries/study/clinical_observations.query.xml b/onprc_ehr/resources/queries/study/clinical_observations.query.xml index 250f8921c..4b490b9de 100644 --- a/onprc_ehr/resources/queries/study/clinical_observations.query.xml +++ b/onprc_ehr/resources/queries/study/clinical_observations.query.xml @@ -59,6 +59,10 @@ Other true
+ + Type + true + false Remark diff --git a/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js b/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js index be37422aa..45ffdb5f7 100644 --- a/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js +++ b/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js @@ -482,15 +482,15 @@ exports.init = function(EHR){ if (row.Id && row.category != 'Incision' && (row.inflammation || row.bruising || row.other)) { var msg = ''; - if (row.Id && row.category != 'Incision' && row.inflammation && row.inflammation == null) { + if (row.Id && row.category != 'Incision' && row.type == 'surgery' && row.inflammation && row.inflammation != null) { msg = row.category + ': was an invalid entry onto the Inflammation input field, only Incision entries are allowed'; EHR.Server.Utils.addError(scriptErrors, 'category', msg, 'ERROR'); } - if (row.Id && row.category != 'Incision' && row.bruising && row.bruinsing == null) { + if (row.Id && row.category != 'Incision' && row.type == 'surgery' && row.bruising && row.bruinsing != null) { msg = row.category + ': was an invalid entry onto the Bruising input field, only Incision entries are allowed'; EHR.Server.Utils.addError(scriptErrors, 'category', msg, 'ERROR'); } - if (row.Id && row.category != 'Incision' && row.other && row.other == null) { + if (row.Id && row.category != 'Incision' && row.type == 'surgery' && row.other && row.other != null) { msg = row.category + ': was an invalid entry onto the Other input field, only Incision entries are allowed'; EHR.Server.Utils.addError(scriptErrors, 'category', msg, 'ERROR'); } diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js index b8cfd69ae..4c457b6a1 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js @@ -160,6 +160,10 @@ bruising: { hidden: true }, + type: { + hidden: true, + defaultValue: 'surgery' + }, other: { hidden: true }, From 80f8d697e82080f1b98b97c219785ed2c2b12276 Mon Sep 17 00:00:00 2001 From: Marty Pradere Date: Tue, 17 Dec 2024 15:12:38 -0800 Subject: [PATCH 59/72] Handle multiselect value --- .../onprc_ehr/grid/ObservationsRowEditorGridPanel.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js index 36f5f9c97..7b2c96861 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js @@ -188,6 +188,16 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), LABKEY.Filter.create('ColumnName', 'Surgicalobservationother', LABKEY.Filter.Types.EQUAL)], autoLoad: true + }, + listeners: { + expand: function (combo) { + // Convert comma-separated string to an array and set value + const currentValue = combo.getValue(); + if (Array.isArray(currentValue) && currentValue.length > 0 && typeof currentValue[0] === 'string') { + const valueArray = currentValue[0].split(','); + combo.setValue(valueArray); + } + } } } From 02e27c6b40ff1177ca31bc6e4cc56306edd1c4ce Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Wed, 18 Dec 2024 11:08:44 -0800 Subject: [PATCH 60/72] Modified Surgical Rounds was updated with additional code to allow hightlighting of multislect combo box selections. --- .../grid/ObservationsRowEditorGridPanel.js | 60 +++++++++++-------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js index 36f5f9c97..92ae8fb98 100644 --- a/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/grid/ObservationsRowEditorGridPanel.js @@ -167,31 +167,41 @@ Ext4.define('ONPRC_EHR.grid.ObservationsRowEditorGridPanel', { forceSelection: true } - },{ - header: 'Other', - width: 200, - editable: true, - dataIndex: 'other', - editor: { - xtype: 'checkcombo', - displayField: 'value', - valueField: 'value', - queryMode: 'local', - store: { - type: 'labkey-store', - schemaName:'sla', - queryName: 'Reference_Data', - columns: 'value', - defaultValue:'0 - None', - sort: 'sort_order', - filterArray: [ - LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), - LABKEY.Filter.create('ColumnName', 'Surgicalobservationother', LABKEY.Filter.Types.EQUAL)], - autoLoad: true - } - } - - },{ + },{ + header: 'Other', + width: 200, + editable: true, + dataIndex: 'other', + editor: { + xtype: 'checkcombo', + displayField: 'value', + valueField: 'value', + queryMode: 'local', + store: { + type: 'labkey-store', + schemaName:'sla', + queryName: 'Reference_Data', + columns: 'value', + defaultValue:'0 - None', + sort: 'sort_order', + filterArray: [ + LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), + LABKEY.Filter.create('ColumnName', 'Surgicalobservationother', LABKEY.Filter.Types.EQUAL)], + autoLoad: true + }, + listeners: { + expand: function (combo) { + // Convert comma-separated string to an array and set value + const currentValue = combo.getValue(); + if (Array.isArray(currentValue) && currentValue.length > 0 && typeof currentValue[0] === 'string') { + const valueArray = currentValue[0].split(','); + combo.setValue(valueArray); + } + } + } + } + + },{ header: 'Remarks', width: 200, editable: true, From f91bfdd662fae33473dcf82e36ee264c6abfd0f0 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Tue, 24 Dec 2024 10:47:24 -0800 Subject: [PATCH 61/72] Modified Surgical Rounds code. --- .../web/onprc_ehr/icons/PrimeSlideImage.jpg | Bin 150045 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 onprc_ehr/resources/web/onprc_ehr/icons/PrimeSlideImage.jpg diff --git a/onprc_ehr/resources/web/onprc_ehr/icons/PrimeSlideImage.jpg b/onprc_ehr/resources/web/onprc_ehr/icons/PrimeSlideImage.jpg deleted file mode 100644 index a86684b0baf36376927fd154dcd729d916e3ea5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150045 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 From 88eda67420569bb0b22cba40ab2b0fa63677dbd4 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Tue, 24 Dec 2024 10:50:07 -0800 Subject: [PATCH 62/72] Modified Surgical Rounds code. --- .../referenceStudy/study/datasets/datasets_metadata.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/onprc_ehr/resources/referenceStudy/study/datasets/datasets_metadata.xml b/onprc_ehr/resources/referenceStudy/study/datasets/datasets_metadata.xml index 42b452018..033a63603 100644 --- a/onprc_ehr/resources/referenceStudy/study/datasets/datasets_metadata.xml +++ b/onprc_ehr/resources/referenceStudy/study/datasets/datasets_metadata.xml @@ -837,6 +837,15 @@ integer + + varchar + + + varchar + + + varchar + Clinical Observations From dd9a49f3a2b0ea1275cede336c15eafdc00f29a3 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Tue, 24 Dec 2024 14:35:36 -0800 Subject: [PATCH 63/72] Modified Surgical Rounds code. --- .../ehr_lookups/Incision_score_onprc.sql | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 onprc_ehr/resources/queries/ehr_lookups/Incision_score_onprc.sql diff --git a/onprc_ehr/resources/queries/ehr_lookups/Incision_score_onprc.sql b/onprc_ehr/resources/queries/ehr_lookups/Incision_score_onprc.sql new file mode 100644 index 000000000..67ff090e0 --- /dev/null +++ b/onprc_ehr/resources/queries/ehr_lookups/Incision_score_onprc.sql @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2013 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +-- Created: 12-24-2024 R. Blasa + +SELECT * FROM ehr_lookups.incision_score WHERE date_disabled is null \ No newline at end of file From 75fe11bbd037c717f428859ddbd524b53e581ca2 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Thu, 2 Jan 2025 23:37:25 -0800 Subject: [PATCH 64/72] Modified Surgical Rounds to include "type" as new query qualifier to differentiate between surgery and clincal entries. --- .../web/onprc_ehr/model/sources/Surgery.js | 303 +++++++----------- .../window/AddSurgicalCasesWindow.js | 2 +- 2 files changed, 117 insertions(+), 188 deletions(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js index 4c457b6a1..1197a08e6 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js @@ -1,204 +1,133 @@ - /* - * Copyright (c) 2013-2019 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ +/* + * Copyright (c) 2013-2019 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 + */ - // Created: 4-20-2021 R. Blasa - EHR.model.DataModelManager.registerMetadata('onprc_Surgery', { - allQueries: { - performedby: { - allowBlank: true - } - }, - byQuery: { - 'onprc_billing.miscCharges': { - chargeId: { - lookup: { - filterArray: [ - LABKEY.Filter.create('active', true, LABKEY.Filter.Types.EQUAL), - LABKEY.Filter.create('category', 'Lease Fee', LABKEY.Filter.Types.NEQ), - LABKEY.Filter.create('category', 'Animal Per Diem', LABKEY.Filter.Types.NEQ), - LABKEY.Filter.create('category', 'Small Animal Per Diem', LABKEY.Filter.Types.NEQ), - LABKEY.Filter.create('category', 'Timed Mated Breeders', LABKEY.Filter.Types.NEQ) - ] - } - }, - chargetype: { - //NOTE: this will be inherited from the encounters record, so we dont want a default - //defaultValue: 'DCM: Surgery Services', - allowBlank: false - }, - parentid: { - shownInGrid: true, - hidden: false, - header: 'Procedure Link', - columnConfig: { - width: 250 - } +// Created: 4-20-2021 R. Blasa +EHR.model.DataModelManager.registerMetadata('onprc_Surgery', { + allQueries: { + performedby: { + allowBlank: true + } + }, + byQuery: { + 'onprc_billing.miscCharges': { + chargeId: { + lookup: { + filterArray: [ + LABKEY.Filter.create('active', true, LABKEY.Filter.Types.EQUAL), + LABKEY.Filter.create('category', 'Lease Fee', LABKEY.Filter.Types.NEQ), + LABKEY.Filter.create('category', 'Animal Per Diem', LABKEY.Filter.Types.NEQ), + LABKEY.Filter.create('category', 'Small Animal Per Diem', LABKEY.Filter.Types.NEQ), + LABKEY.Filter.create('category', 'Timed Mated Breeders', LABKEY.Filter.Types.NEQ) + ] } }, - 'study.treatment_order': { - category: { - shownInGrid: true, - defaultValue: 'Surgical', - allowBlank: false + chargetype: { + //NOTE: this will be inherited from the encounters record, so we dont want a default + //defaultValue: 'DCM: Surgery Services', + allowBlank: false + } + }, + 'study.treatment_order': { + category: { + shownInGrid: true, + defaultValue: 'Surgical', + allowBlank: false + } - }, - parentid: { - shownInGrid: true, - hidden: false, - header: 'Procedure Link', - columnConfig: { - width: 250 - } - } + }, + 'study.drug': { + enddate: { + hidden: false }, - - - 'study.drug': { - enddate: { - hidden: false - }, - category: { - shownInGrid: true, - hidden: false, - defaultValue: 'Surgical' - }, - reason: { - defaultValue: 'Procedure' - }, - - chargetype: { - //NOTE: this will be inherited from the encounters record, so we dont want a default - //defaultValue: 'DCM: Surgery Services', - allowBlank: false + category: { + shownInGrid: true, + hidden: false, + defaultValue: 'Surgical' + }, + reason: { + defaultValue: 'Procedure' + }, + chargetype: { + //NOTE: this will be inherited from the encounters record, so we dont want a default + //defaultValue: 'DCM: Surgery Services', + allowBlank: false + } + }, + 'study.encounters': { + type: { + defaultValue: 'Surgery', + hidden: true + }, + title: { + hidden: true + }, + caseno: { + hidden: true + }, + procedureid: { + lookup: { + filterArray: [ + LABKEY.Filter.create('category', 'Surgery;Procedure', LABKEY.Filter.Types.EQUALS_ONE_OF), + LABKEY.Filter.create('active', true, LABKEY.Filter.Types.EQUAL) + ] } }, - 'study.encounters': { - type: { - defaultValue: 'Surgery', - hidden: true - }, - title: { - hidden: true - }, - caseno: { - hidden: true - }, - procedureid: { - lookup: { - filterArray: [ - LABKEY.Filter.create('category', 'Surgery;Procedure', LABKEY.Filter.Types.EQUALS_ONE_OF), - LABKEY.Filter.create('active', true, LABKEY.Filter.Types.EQUAL) - ] - } - }, - performedby: { - hidden: true - }, - remark: { - hidden: true - }, - chargetype: { - allowBlank: false - }, - - assistingstaff: { - hidden: false, - allowBlank: true //will be handled in trigger script - }, - enddate: { - editorConfig: { - getDefaultDate: function(){ - var rec = EHR.DataEntryUtils.getBoundRecord(this); - if (rec){ - if (rec.get('date')){ - return rec.get('date'); - } + performedby: { + hidden: true + }, + remark: { + hidden: true + }, + chargetype: { + allowBlank: false + }, + assistingstaff: { + hidden: false, + allowBlank: true //will be handled in trigger script + }, + enddate: { + editorConfig: { + getDefaultDate: function(){ + var rec = EHR.DataEntryUtils.getBoundRecord(this); + if (rec){ + if (rec.get('date')){ + return rec.get('date'); } } } - } - }, - 'ehr.snomed_tags': { - code: { - editorConfig: { - xtype: 'ehr-snomedcombo', - defaultSubset: 'Diagnostic Codes' - } - }, - set_number: { - hidden: true - }, - - sort: { - hidden: true + } + }, + 'ehr.snomed_tags': { + code: { + editorConfig: { + xtype: 'ehr-snomedcombo', + defaultSubset: 'Diagnostic Codes' } }, - 'study.clinical_observations': { - inflammation: { - hidden: true - }, - area: { - lookup: { - xtype: 'combobox', - schemaName:'sla', - queryName: 'Reference_Data', - columns: 'value', - sort: 'sort_order', - defaultValue:'All', - editable: true, - header: 'Area', - filterArray: [ - LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), - LABKEY.Filter.create('ColumnName', 'Surgicalobservationarea', LABKEY.Filter.Types.EQUAL)], - autoLoad: true - } - }, - bruising: { - hidden: true - }, - type: { - hidden: true, - defaultValue: 'surgery' - }, - other: { - hidden: true - }, - remark: { - hidden: true, - defaultValue: 'Deferred entries until Surgical Rounds process' - }, - performedby: { - hidden: true, - allowBlank: true - }, - - observation: { - hidden: true, - allowBlank: true - } - }, - - 'ehr.encounter_participants': { - comment: { - hidden: false, - header: 'Remarks', - columnConfig: { - width: 300 - } - } - + set_number: { + hidden: true }, - - - 'ehr.encounter_summaries': { - category: { - defaultValue: 'Narrative' + sort: { + hidden: true + } + }, + 'ehr.encounter_participants': { + comment: { + hidden: false, + header: 'Remarks', + columnConfig: { + width: 300 } - + } + }, + 'ehr.encounter_summaries': { + category: { + defaultValue: 'Narrative' } } - }); \ No newline at end of file + } +}); \ No newline at end of file diff --git a/onprc_ehr/resources/web/onprc_ehr/window/AddSurgicalCasesWindow.js b/onprc_ehr/resources/web/onprc_ehr/window/AddSurgicalCasesWindow.js index 4b2428cce..c47c38db3 100644 --- a/onprc_ehr/resources/web/onprc_ehr/window/AddSurgicalCasesWindow.js +++ b/onprc_ehr/resources/web/onprc_ehr/window/AddSurgicalCasesWindow.js @@ -41,7 +41,7 @@ Ext4.define('ONPRC_EHR.window.AddSurgicalCasesWindow', { requiredVersion: 9.1, schemaName: 'study', queryName: 'latestObservationsForCase', - columns: 'Id,date,category,area,observation,inflammation,bruising,other, remark,caseid', + columns: 'Id,date,category,area,observation,inflammation,bruising,other, remark,caseid,type', filterArray: obsFilterArray, scope: this, success: function(results){ From d36ff11d1a30e22ddaf06b6abc2e0efcfd7d413b Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Thu, 2 Jan 2025 23:56:16 -0800 Subject: [PATCH 65/72] Modified Surgical Rounds to include "type" as new query qualifier to differentiate between surgery and clincal entries. --- .../onprc_ehr/model/sources/SurgicalRounds.js | 53 +++++++++++++++++++ .../dataentry/SurgicalRoundsFormType.java | 6 +-- 2 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 onprc_ehr/resources/web/onprc_ehr/model/sources/SurgicalRounds.js diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/SurgicalRounds.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/SurgicalRounds.js new file mode 100644 index 000000000..750a49b93 --- /dev/null +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/SurgicalRounds.js @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2013-2019 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 + */ +EHR.model.DataModelManager.registerMetadata('SurgicalRoundsExt', { + allQueries: { + Id: { + editable: false, + columnConfig: { + editable: false + } + } + }, + byQuery: { + 'study.clinremarks': { + category: { + defaultValue: 'Surgery', + hidden: true + }, + hx: { + hidden: true + }, + s: { + hidden: true + }, + o: { + hidden: true + }, + a: { + hidden: true + }, + p: { + hidden: true + }, + p2: { + hidden: true + } + }, + + 'study.clinical_observation': { + type: { + defaultValue: 'surgery', + hidden: true + } + }, + 'study.blood': { + reason: { + defaultValue: 'Clinical' + } + } + } +}); \ No newline at end of file diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsFormType.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsFormType.java index 7bd3cd163..21d9952e5 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsFormType.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgicalRoundsFormType.java @@ -51,15 +51,15 @@ public SurgicalRoundsFormType(DataEntryFormContext ctx, Module owner) for (FormSection s : this.getFormSections()) { - s.addConfigSource("SurgicalRounds"); + s.addConfigSource("SurgicalRoundsExt"); if (s instanceof ClinicalObservationsFormSection) { ((ClinicalObservationsFormSection)s).setHidden(true); } } - - addClientDependency(ClientDependency.supplierFromPath("ehr/model/sources/SurgicalRounds.js")); +// Modified: 1-1-2025 R. Blasa + addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/model/sources/SurgicalRounds.js")); setDisplayReviewRequired(true); } From cc148376adea6af3ce443b858c8e254d950816c7 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Thu, 2 Jan 2025 23:57:16 -0800 Subject: [PATCH 66/72] Modified Surgical Rounds to include "type" as new query qualifier to differentiate between surgery and clincal entries. --- .../resources/web/onprc_ehr/model/sources/SurgicalRounds.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/SurgicalRounds.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/SurgicalRounds.js index 750a49b93..d15c66c66 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/SurgicalRounds.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/SurgicalRounds.js @@ -38,7 +38,7 @@ EHR.model.DataModelManager.registerMetadata('SurgicalRoundsExt', { } }, - 'study.clinical_observation': { + 'study.clinical_observations': { type: { defaultValue: 'surgery', hidden: true From 6a2a4bd382d08ae2cb6917a035de0fd29b60f98d Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 3 Jan 2025 00:29:09 -0800 Subject: [PATCH 67/72] Modified Surgical Rounds to include "type" as new query qualifier to differentiate between surgery and clincal entries. --- .../web/onprc_ehr/model/sources/Surgery.js | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js index 1197a08e6..ea10812af 100644 --- a/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js +++ b/onprc_ehr/resources/web/onprc_ehr/model/sources/Surgery.js @@ -124,6 +124,50 @@ EHR.model.DataModelManager.registerMetadata('onprc_Surgery', { } } }, + 'study.clinical_observations': { + inflammation: { + hidden: true + }, + area: { + lookup: { + xtype: 'combobox', + schemaName:'sla', + queryName: 'Reference_Data', + columns: 'value', + sort: 'sort_order', + defaultValue:'All', + editable: true, + header: 'Area', + filterArray: [ + LABKEY.Filter.create('enddate', null, LABKEY.Filter.Types.ISBLANK), + LABKEY.Filter.create('ColumnName', 'Surgicalobservationarea', LABKEY.Filter.Types.EQUAL)], + autoLoad: true + } + }, + bruising: { + hidden: true + }, + type: { + hidden: true, + defaultValue: 'surgery' + }, + other: { + hidden: true + }, + remark: { + hidden: true, + defaultValue: 'Deferred entries until Surgical Rounds process' + }, + performedby: { + hidden: true, + allowBlank: true + }, + + observation: { + hidden: true, + allowBlank: true + } + }, 'ehr.encounter_summaries': { category: { defaultValue: 'Narrative' From c057d31222536d843082482f5891fd3fd481e2a6 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Tue, 7 Jan 2025 14:38:49 -0800 Subject: [PATCH 68/72] Modified Compliance Overdue/Soon reports. --- onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js b/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js index 45ffdb5f7..44974ec99 100644 --- a/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js +++ b/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js @@ -486,7 +486,7 @@ exports.init = function(EHR){ msg = row.category + ': was an invalid entry onto the Inflammation input field, only Incision entries are allowed'; EHR.Server.Utils.addError(scriptErrors, 'category', msg, 'ERROR'); } - if (row.Id && row.category != 'Incision' && row.type == 'surgery' && row.bruising && row.bruinsing != null) { + if (row.Id && row.category != 'Incision' && row.type == 'surgery' && row.bruising && row.bruising != null) { msg = row.category + ': was an invalid entry onto the Bruising input field, only Incision entries are allowed'; EHR.Server.Utils.addError(scriptErrors, 'category', msg, 'ERROR'); } From c7c2d9d602ae3519bf592843db07cb4eac29d477 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Fri, 10 Jan 2025 14:16:16 -0800 Subject: [PATCH 69/72] Modified Surgical Rounds drop down selection listings. --- .../onprc_ehr/dataentry/EncounterChildFormSection.java | 8 ++++++-- .../labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java | 4 ++-- .../org/labkey/onprc_ehr/dataentry/SurgeryFormType.java | 6 +++++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/EncounterChildFormSection.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/EncounterChildFormSection.java index 11d1a2380..8c436a01f 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/EncounterChildFormSection.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/EncounterChildFormSection.java @@ -40,7 +40,10 @@ public EncounterChildFormSection(String schemaName, String queryName, String lab addClientDependency(ClientDependency.supplierFromPath("ehr/buttons/encounterButtons.js")); addClientDependency(ClientDependency.supplierFromPath("ehr/model/sources/EncounterChild.js")); addClientDependency(ClientDependency.supplierFromPath("ehr/window/EncounterAddRecordWindow.js")); - addClientDependency(ClientDependency.supplierFromPath("ehr/window/AddProcedureDefaultsWindow.js")); + + + // Added: 1-10-2025 R. Blasa + addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/window/AddProcedureDefaultsWindow.js")); addConfigSource("Encounter"); addConfigSource("EncounterChild"); @@ -66,8 +69,9 @@ public List getTbarButtons() { List defaultButtons = new ArrayList<>(); +// Modified: 1-20-20025 R. Blasa if (_allowAddDefaults) - defaultButtons.add("ADDPROCEDUREDEFAULTS"); + defaultButtons.add("APPLYENCOUNTERDEFAULTSAMENDED"); defaultButtons.addAll(super.getTbarButtons()); defaultButtons.remove("ADDANIMALS"); diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java index e8b16812b..d37e7a28a 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SingleSurgeryFormType.java @@ -68,10 +68,10 @@ public SingleSurgeryFormType(DataEntryFormContext ctx, Module owner) addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/model/sources/Surgery.js")); addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/window/OpenSurgeryCasesWindow.js")); addClientDependency(ClientDependency.supplierFromPath("ehr/panel/SurgeryDataEntryPanel.js")); + // Added: 8-27-2024 r. Blasa addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/form/field/SurgeryEntryField.js")); -// Added: 8-27-2024 R. Blasa - addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/window/AddProcedureDefaultsWindow.js")); + setDisplayReviewRequired(true); setJavascriptClass("EHR.panel.SurgeryDataEntryPanel"); diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java index 802e2f1ed..75ef4c218 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java @@ -68,11 +68,15 @@ public SurgeryFormType(DataEntryFormContext ctx, Module owner) // Modified: 7-4-2024 R.Blasa addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/model/sources/Surgery.js")); - addClientDependency(ClientDependency.supplierFromPath("ehr/window/OpenSurgeryCasesWindow.js")); +// Modified: 1-10-2025 R. Blasa + addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/window/OpenSurgeryCasesWindow.js")); + addClientDependency(ClientDependency.supplierFromPath("ehr/panel/SurgeryDataEntryPanel.js")); setDisplayReviewRequired(true); setJavascriptClass("EHR.panel.SurgeryDataEntryPanel"); + + for (FormSection s : this.getFormSections()) { s.addConfigSource("Encounter"); From fdc18be38785199fb53e44af20925dbd954ff2a4 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Mon, 13 Jan 2025 14:55:42 -0800 Subject: [PATCH 70/72] Modified Surgical Rounds drop down selection listings. --- .../src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java index 75ef4c218..806857693 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java @@ -47,7 +47,7 @@ public class SurgeryFormType extends EncounterForm public SurgeryFormType(DataEntryFormContext ctx, Module owner) { super(ctx, owner, NAME, "Surgeries", "Surgery", Arrays.asList( - new NonStoreFormSection("Instructions", "Instructions", "ehr-surgeryinstructionspanel", Arrays.asList(ClientDependency.supplierFromPath("ehr/panel/SurgeryInstructionsPanel.js"))), + new NonStoreFormSection("Instructions", "Instructions", "ehr-surgeryinstructionspanel", Arrays.asList(ClientDependency.supplierFromPath("onprc_ehr/panel/SurgeryInstructionsPanel.js"))), new TaskFormSection(), new ClinicalEncountersFormSection(), new ExtendedAnimalDetailsFormSection(), @@ -96,7 +96,7 @@ public SurgeryFormType(DataEntryFormContext ctx, Module owner) protected List getButtonConfigs() { List ret = super.getButtonConfigs(); - ret.add("OPENSURGERYCASES"); + ret.add("OPENSURGERYCASEST"); return ret; } From 924f8c7eafe64fca11203855dc1f87f1dc60ab00 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Mon, 13 Jan 2025 14:58:46 -0800 Subject: [PATCH 71/72] Modified Surgical Rounds drop down selection listings. --- .../src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java index 806857693..bc2e2d490 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/SurgeryFormType.java @@ -47,7 +47,7 @@ public class SurgeryFormType extends EncounterForm public SurgeryFormType(DataEntryFormContext ctx, Module owner) { super(ctx, owner, NAME, "Surgeries", "Surgery", Arrays.asList( - new NonStoreFormSection("Instructions", "Instructions", "ehr-surgeryinstructionspanel", Arrays.asList(ClientDependency.supplierFromPath("onprc_ehr/panel/SurgeryInstructionsPanel.js"))), + new NonStoreFormSection("Instructions", "Instructions", "onprc_ehr-surgeryinstructionspanel", Arrays.asList(ClientDependency.supplierFromPath("onprc_ehr/panel/SurgeryInstructionsPanel.js"))), new TaskFormSection(), new ClinicalEncountersFormSection(), new ExtendedAnimalDetailsFormSection(), From 5b90e5555de8dbe1418241e03d5014dbaad502d6 Mon Sep 17 00:00:00 2001 From: Ohsudev <76500320+Ohsudev@users.noreply.github.com> Date: Mon, 13 Jan 2025 16:21:48 -0800 Subject: [PATCH 72/72] Modified Surgical Rounds drop down selection listings. --- .../labkey/onprc_ehr/dataentry/EncounterChildFormSection.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/EncounterChildFormSection.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/EncounterChildFormSection.java index 8c436a01f..b91259e5f 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/EncounterChildFormSection.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/EncounterChildFormSection.java @@ -69,9 +69,8 @@ public List getTbarButtons() { List defaultButtons = new ArrayList<>(); -// Modified: 1-20-20025 R. Blasa if (_allowAddDefaults) - defaultButtons.add("APPLYENCOUNTERDEFAULTSAMENDED"); + defaultButtons.add("ADDPROCEDUREDEFAULTS"); defaultButtons.addAll(super.getTbarButtons()); defaultButtons.remove("ADDANIMALS");