From b44ad53ba19361fbfe54d9231993a8a22037f4cd Mon Sep 17 00:00:00 2001 From: Mike McKay <mfmckay@wustl.edu> Date: Sun, 1 May 2016 11:37:06 -0500 Subject: [PATCH] XNAT-1071 Added ability to find study in prearchive. --- config/xnat-conf.properties | 22 ++ .../helpers/prearchive/DatabaseSession.java | 12 ++ .../helpers/prearchive/PrearcDatabase.java | 25 +++ .../xnat/helpers/prearchive/PrearcUtils.java | 10 +- .../prearchive/PrearcSessionResource.java | 4 +- .../turbine/modules/actions/FindStudy.java | 54 +++++ .../modules/actions/XDATForgotLogin.java | 3 +- .../modules/screens/FindStudyMatch.java | 22 ++ .../turbine/modules/screens/ForgotLogin.java | 23 ++ .../modules/screens/XDATScreen_email.java | 67 ++++++ .../prearchive/PrearchiveFound_actions.js | 197 ++++++++++++++++++ .../xnat-templates/screens/FindStudyMatch.vm | 39 ++++ .../screens/XDATScreen_prearchives.vm | 21 ++ 13 files changed, 493 insertions(+), 6 deletions(-) create mode 100644 config/xnat-conf.properties create mode 100644 src/main/java/org/nrg/xnat/turbine/modules/actions/FindStudy.java create mode 100644 src/main/java/org/nrg/xnat/turbine/modules/screens/FindStudyMatch.java create mode 100644 src/main/java/org/nrg/xnat/turbine/modules/screens/ForgotLogin.java create mode 100644 src/main/java/org/nrg/xnat/turbine/modules/screens/XDATScreen_email.java create mode 100644 src/main/webapp/scripts/prearchive/PrearchiveFound_actions.js create mode 100644 src/main/webapp/xnat-templates/screens/FindStudyMatch.vm diff --git a/config/xnat-conf.properties b/config/xnat-conf.properties new file mode 100644 index 00000000..3d085758 --- /dev/null +++ b/config/xnat-conf.properties @@ -0,0 +1,22 @@ +# +# xnat-conf.properties +# XNAT http://www.xnat.org +# Copyright (c) 2016, Washington University School of Medicine +# All Rights Reserved +# +# Released under the Simplified BSD. +# +datasource.driver=org.postgresql.Driver +datasource.url=jdbc:postgresql://localhost/xnat +datasource.username=xnat +datasource.password=xnat + +hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect +hibernate.hbm2ddl.auto=update +hibernate.show_sql=false +hibernate.cache.use_second_level_cache=true +hibernate.cache.use_query_cache=true + +amq.usage.temp=128mb +amq.usage.mem=512mb +amq.usage.store=1gb diff --git a/src/main/java/org/nrg/xnat/helpers/prearchive/DatabaseSession.java b/src/main/java/org/nrg/xnat/helpers/prearchive/DatabaseSession.java index c0ce5946..a0fa40e7 100644 --- a/src/main/java/org/nrg/xnat/helpers/prearchive/DatabaseSession.java +++ b/src/main/java/org/nrg/xnat/helpers/prearchive/DatabaseSession.java @@ -18,6 +18,7 @@ import java.sql.SQLException; import java.sql.Types; import java.util.ArrayList; import java.util.Calendar; +import java.util.Date; import java.util.List; public enum DatabaseSession { @@ -657,6 +658,17 @@ public enum DatabaseSession { public static String findSessionSql (String session, String timestamp, String project) { return "SELECT * FROM " + PrearcDatabase.tableWithSchema + " WHERE " + DatabaseSession.sessionSql(session,timestamp,project); } + + /** + * Generate SQL to find a row where that matches the given session and project + * @param patientName The patient name on which to search + * @param patientID The patient ID on which to search + * @param studyDate The timestamp on which to search + * @return A complete SQL statement constructed from the submitted criteria. + */ + public static String findMyStudySql () { + return "SELECT * FROM " + PrearcDatabase.tableWithSchema + " WHERE project IS NULL AND (name = ? OR subject = ? OR scan_date = ?)"; + } /** * Count the number of sessions that match the given arguments. diff --git a/src/main/java/org/nrg/xnat/helpers/prearchive/PrearcDatabase.java b/src/main/java/org/nrg/xnat/helpers/prearchive/PrearcDatabase.java index 2bf635d2..1d039b5c 100644 --- a/src/main/java/org/nrg/xnat/helpers/prearchive/PrearcDatabase.java +++ b/src/main/java/org/nrg/xnat/helpers/prearchive/PrearcDatabase.java @@ -2211,6 +2211,31 @@ public final class PrearcDatabase { return PrearcDatabase.buildRows(projects.toArray(_proj)); } + public static ArrayList<ArrayList<Object>> findMyStudy(final String patientName, final String patientID, final Date studyDate) throws Exception, SQLException, SessionException { + return new SessionOp<ArrayList<ArrayList<Object>>>() { + public ArrayList<ArrayList<Object>> op() throws Exception { + PreparedStatement statement = this.pdb.getPreparedStatement(null, DatabaseSession.findMyStudySql());//patientID, patientName, studyDate + statement.setString(1,patientID); + statement.setString(2,patientName); + if(studyDate!=null) { + statement.setDate(3, new java.sql.Date(studyDate.getTime())); + } + else{ + statement.setDate(3, new java.sql.Date(0L)); + } + ResultSet rs = statement.executeQuery(); + return convertRStoList(rs); + } + }.run(); + +// return new SessionOp<ArrayList<ArrayList<Object>>>() { +// public ArrayList<ArrayList<Object>> op() throws SQLException, SessionException, Exception { +// ResultSet rs = this.pdb.executeQuery(null, DatabaseSession.findStudySql(patientName, patientID, studyDate), null); +// return convertRStoList(rs); +// } +// }.run(); + } + private static ArrayList<ArrayList<Object>> convertRStoList(ResultSet rs) throws SQLException { ArrayList<ArrayList<Object>> ao = new ArrayList<ArrayList<Object>>(); while (rs.next()) { diff --git a/src/main/java/org/nrg/xnat/helpers/prearchive/PrearcUtils.java b/src/main/java/org/nrg/xnat/helpers/prearchive/PrearcUtils.java index 61a3cf53..a260cf18 100644 --- a/src/main/java/org/nrg/xnat/helpers/prearchive/PrearcUtils.java +++ b/src/main/java/org/nrg/xnat/helpers/prearchive/PrearcUtils.java @@ -149,10 +149,16 @@ public class PrearcUtils { if (requestedProject.contains(",")) { String[] projectIds = StringUtils.split(requestedProject, ','); for (final String projectId : projectIds) { - projects.add(cleanProject(projectId)); + String cleanProject = cleanProject(projectId); + if(cleanProject!=null || Roles.isSiteAdmin(user)) { + projects.add(cleanProject); + } } } else { - projects.add(cleanProject(requestedProject)); + String cleanProject = cleanProject(requestedProject); + if(cleanProject!=null || Roles.isSiteAdmin(user)) { + projects.add(cleanProject); + } } } else { final UserHelperServiceI userHelperService = UserHelper.getUserHelperService(user); diff --git a/src/main/java/org/nrg/xnat/restlet/resources/prearchive/PrearcSessionResource.java b/src/main/java/org/nrg/xnat/restlet/resources/prearchive/PrearcSessionResource.java index f45fc030..28761e00 100644 --- a/src/main/java/org/nrg/xnat/restlet/resources/prearchive/PrearcSessionResource.java +++ b/src/main/java/org/nrg/xnat/restlet/resources/prearchive/PrearcSessionResource.java @@ -12,7 +12,6 @@ package org.nrg.xnat.restlet.resources.prearchive; import com.google.common.base.Strings; import com.google.common.collect.Maps; - import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.apache.turbine.util.TurbineException; @@ -22,7 +21,6 @@ import org.nrg.framework.constants.PrearchiveCode; import org.nrg.xdat.om.XnatProjectdata; import org.nrg.xft.XFTTable; import org.nrg.xft.exception.InvalidPermissionException; -import org.nrg.xft.utils.DateUtils; import org.nrg.xnat.archive.FinishImageUpload; import org.nrg.xnat.helpers.prearchive.*; import org.nrg.xnat.helpers.prearchive.PrearcDatabase.SyncFailedException; @@ -130,7 +128,7 @@ public final class PrearcSessionResource extends SecureResource { final File sessionDir; try { - sessionDir = PrearcUtils.getPrearcSessionDir(user, project, timestamp, session,false); + sessionDir = PrearcUtils.getPrearcSessionDir(user, project, timestamp, session,true); } catch (InvalidPermissionException e) { logger.error("",e); this.getResponse().setStatus(Status.CLIENT_ERROR_FORBIDDEN, e.getMessage()); diff --git a/src/main/java/org/nrg/xnat/turbine/modules/actions/FindStudy.java b/src/main/java/org/nrg/xnat/turbine/modules/actions/FindStudy.java new file mode 100644 index 00000000..ed4baf1f --- /dev/null +++ b/src/main/java/org/nrg/xnat/turbine/modules/actions/FindStudy.java @@ -0,0 +1,54 @@ +/* + * org.nrg.xnat.turbine.modules.actions.XMLUpload + * XNAT http://www.xnat.org + * Copyright (c) 2014, Washington University School of Medicine + * All Rights Reserved + * + * Released under the Simplified BSD. + * + * Last modified 7/10/13 9:04 PM + */ +package org.nrg.xnat.turbine.modules.actions; + +import org.apache.turbine.util.RunData; +import org.apache.velocity.context.Context; +import org.nrg.xdat.display.DisplayManager; +import org.nrg.xdat.turbine.modules.actions.SecureAction; +import org.nrg.xnat.helpers.prearchive.PrearcDatabase; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Date; + +/** + * @author Mike McKay + */ +public class FindStudy extends SecureAction { + private static final Logger logger = LoggerFactory.getLogger(FindStudy.class); + + /* + * (non-Javadoc) + * + * @see + * org.apache.turbine.modules.actions.VelocityAction#doPerform(org.apache + * .turbine.util.RunData, org.apache.velocity.context.Context) + */ + public void doPerform(RunData data, Context context) throws Exception { + + String patientName = data.getParameters().getString("patientName"); + String patientID = data.getParameters().getString("patientID"); + Date studyDate = data.getParameters().getDate("studyDate"); + //XFTTable table = null; + try { + //table = PrearcUtils.convertArrayLtoTable(PrearcDatabase.findMyStudy(patientName, patientID, studyDate)); + ArrayList<ArrayList<Object>> results = PrearcDatabase.findMyStudy(patientName, patientID, studyDate); + context.put("results",results); + context.put("resultsSize",results.size()); + context.put("displayManager", DisplayManager.GetInstance()); + } catch (Exception e) { + logger.error(""+e); + } + data.setScreenTemplate("FindStudyMatch.vm"); + } +} diff --git a/src/main/java/org/nrg/xnat/turbine/modules/actions/XDATForgotLogin.java b/src/main/java/org/nrg/xnat/turbine/modules/actions/XDATForgotLogin.java index f9da0554..06593cd8 100644 --- a/src/main/java/org/nrg/xnat/turbine/modules/actions/XDATForgotLogin.java +++ b/src/main/java/org/nrg/xnat/turbine/modules/actions/XDATForgotLogin.java @@ -27,6 +27,7 @@ public class XDATForgotLogin extends org.nrg.xdat.turbine.modules.actions.XDATFo context.put("user", user); action.doPerform(data, context); } - + context.put("turbineUtils",TurbineUtils.GetInstance()); + } } diff --git a/src/main/java/org/nrg/xnat/turbine/modules/screens/FindStudyMatch.java b/src/main/java/org/nrg/xnat/turbine/modules/screens/FindStudyMatch.java new file mode 100644 index 00000000..2538779a --- /dev/null +++ b/src/main/java/org/nrg/xnat/turbine/modules/screens/FindStudyMatch.java @@ -0,0 +1,22 @@ +/* + * org.nrg.xnat.turbine.modules.screens.QuickSearchMatch + * XNAT http://www.xnat.org + * Copyright (c) 2014, Washington University School of Medicine + * All Rights Reserved + * + * Released under the Simplified BSD. + * + * Last modified 7/10/13 9:04 PM + */ +package org.nrg.xnat.turbine.modules.screens; + +import org.apache.turbine.util.RunData; +import org.apache.velocity.context.Context; +import org.nrg.xdat.turbine.modules.screens.SecureScreen; + +public class FindStudyMatch extends SecureScreen { + @Override + protected void doBuildTemplate(RunData data, Context context) throws Exception { + } + +} diff --git a/src/main/java/org/nrg/xnat/turbine/modules/screens/ForgotLogin.java b/src/main/java/org/nrg/xnat/turbine/modules/screens/ForgotLogin.java new file mode 100644 index 00000000..f9e6d8ad --- /dev/null +++ b/src/main/java/org/nrg/xnat/turbine/modules/screens/ForgotLogin.java @@ -0,0 +1,23 @@ +/* + * org.nrg.xnat.turbine.modules.screens.Index + * XNAT http://www.xnat.org + * Copyright (c) 2014, Washington University School of Medicine + * All Rights Reserved + * + * Released under the Simplified BSD. + * + * Last modified 7/10/13 9:04 PM + */ +package org.nrg.xnat.turbine.modules.screens; + +import org.apache.turbine.util.RunData; +import org.apache.velocity.context.Context; +import org.nrg.xdat.turbine.modules.screens.SecureScreen; + +public class ForgotLogin extends SecureScreen { + + @Override + protected void doBuildTemplate(RunData data, Context c) throws Exception { + + } +} diff --git a/src/main/java/org/nrg/xnat/turbine/modules/screens/XDATScreen_email.java b/src/main/java/org/nrg/xnat/turbine/modules/screens/XDATScreen_email.java new file mode 100644 index 00000000..ce30922e --- /dev/null +++ b/src/main/java/org/nrg/xnat/turbine/modules/screens/XDATScreen_email.java @@ -0,0 +1,67 @@ +/* + * org.nrg.xnat.turbine.modules.screens.XDATScreen_edit_xnat_projectData + * XNAT http://www.xnat.org + * Copyright (c) 2014, Washington University School of Medicine + * All Rights Reserved + * + * Released under the Simplified BSD. + * + * Last modified 7/10/13 9:04 PM + */ +package org.nrg.xnat.turbine.modules.screens; + +import org.apache.turbine.util.RunData; +import org.apache.velocity.context.Context; +import org.nrg.xdat.turbine.modules.screens.SecureScreen; +import org.nrg.xdat.turbine.utils.TurbineUtils; +import org.nrg.xft.XFTItem; +import org.nrg.xft.search.ItemSearch; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +/** + * @author XDAT + * + */ +public class XDATScreen_email extends SecureScreen { + + /* (non-Javadoc) + * @see org.apache.turbine.modules.screens.VelocityScreen#doBuildTemplate(org.apache.turbine.util.RunData, org.apache.velocity.context.Context) + */ + protected void doBuildTemplate(RunData data, Context context) + throws Exception { + ArrayList al = ItemSearch.GetAllItems("xdat:user",null,false).items(); + Collections.sort(al, new nameComparator()); + context.put("users",al); + + String s= (String) TurbineUtils.GetPassedParameter("emailTo",data,""); + context.put("emailTo",s); + } + public class nameComparator implements Comparator<XFTItem> { + public int compare(XFTItem object1, XFTItem object2) { + String fn1 = (String) object1.getField("firstname"); + String ln1 = (String) object1.getField("lastname"); + String fn2 = (String) object2.getField("firstname"); + String ln2 = (String) object2.getField("lastname"); + if(fn1==null){ + return 1; + } + if(fn2==null){ + return -1; + } + int c = fn1.toUpperCase().compareTo(fn2.toUpperCase()); + if(c!=0){ + return c; + } + if(ln1==null){ + return 1; + } + if(ln2==null){ + return -1; + } + return ln1.toUpperCase().compareTo(ln2.toUpperCase()); + } + } +} diff --git a/src/main/webapp/scripts/prearchive/PrearchiveFound_actions.js b/src/main/webapp/scripts/prearchive/PrearchiveFound_actions.js new file mode 100644 index 00000000..9954bf0e --- /dev/null +++ b/src/main/webapp/scripts/prearchive/PrearchiveFound_actions.js @@ -0,0 +1,197 @@ +/* + * D:/Development/XNAT/1.6/xnat_builder_1_6dev/plugin-resources/webapp/xnat/scripts/prearchive/PrearchiveDetails_actions.js + * XNAT http://www.xnat.org + * Copyright (c) 2014, Washington University School of Medicine + * All Rights Reserved + * + * Released under the Simplified BSD. + * + * Last modified 1/6/14 3:48 PM + */ +XNAT.app.prearchiveActions={ + requestDelete:function(){ + xModalConfirm({ + content: "Are you sure you want to permanently delete this session?", + okAction: function(){ + XNAT.app.prearchiveActions.doDelete(); + }, + cancelAction: function(){ + } + }); + }, + doDelete:function(){ + this.delCallback={ + success:this.handleDelSuccess, + failure:this.handleDelFailure, + cache:false, // Turn off caching for IE + scope:this + }; + + openModalPanel("delete_scan","Deleting session"); + + YAHOO.util.Connect.asyncRequest('DELETE',serverRoot+"/REST" + this.url+"?XNAT_CSRF=" + csrfToken,this.delCallback,null,this); + }, + handleDelSuccess:function(o){ + closeModalPanel("delete_scan"); + window.close(); + }, + handleDelFailure:function(o){ + closeModalPanel("delete_scan"); + showMessage("page_body", "Error", "Failed to delete session. ("+ o.message + ")"); + }, + requestMoveDialog:function(oldProj, timestamp, folder){ + $('#oldProjString').val(oldProj); + var formattedTimestamp = timestamp.replace(" ","_").replace("-","").replace("-","").replace(":","").replace(":","").replace(".",""); + while(formattedTimestamp.length<18){ + formattedTimestamp+="0" + } + $('#timestampString').val(formattedTimestamp); + $('#folderString').val(folder); + if(this.projects==undefined){ + this.projCallback={ + success:this.handleProjectsLoad, + failure:function(o){ + closeModalPanel("load_projects"); + showMessage("page_body", "Error", "Failed to load projects. ("+ o.message + ")");}, + cache:false, // Turn off caching for IE + scope:this + }; + + openModalPanel("load_projects","Loading projects"); + + YAHOO.util.Connect.asyncRequest('GET',serverRoot+"/REST/projects?format=json&restrict=edit&columns=ID&XNAT_CSRF=" + csrfToken,this.projCallback,null,this); + }else{ + this.showMoveDialog(); + } + }, + handleProjectsLoad:function(o){ + this.projects=[]; + var projectResults= eval("(" + o.responseText +")"); + for(var pC=0;pC<projectResults.ResultSet.Result.length;pC++){ + this.projects.push(projectResults.ResultSet.Result[pC]); + } + + var options = $("#proj_move_select"); + $.each(this.projects, function() { + options.append($("<option />").val(this.ID).text(this.ID)); + }); + + closeModalPanel("load_projects"); + this.showMoveDialog(); + }, + showMoveDialog:function(){ + XNAT.app.move_project_dialog.render(document.body);//need to pre-render it for the height change to take effect. + XNAT.app.move_project_dialog.show(); + }, + move:function(proj){ + this.newProj=proj; + this.moveCallback={ + success:function(o){ + closeModalPanel("move_p"); + window.location=o.responseText; + }, + failure:function(o){ + closeModalPanel("move_p"); + if(o.status==301 || o.status==0){ + window.location=serverRoot+"/REST/prearchive/projects/"+ proj + "/"+ $('#timestampString').val() +"/" + $('#folderString').val()+"?format=html&screen=PrearchiveDetails.vm&popup=false"; + }else{ + showMessage("page_body", "Error", "Failed to move session. ("+ o.message + ")"); + } + }, + cache:false, // Turn off caching for IE + scope:this + }; + + openModalPanel("move_p","Moving session"); + + YAHOO.util.Connect.asyncRequest('POST',serverRoot+"/REST/prearchive/projects/"+$('#oldProjString').val()+"/"+ $('#timestampString').val() +"/" + $('#folderString').val()+"?action=move&newProject=" + proj +"&XNAT_CSRF=" + csrfToken,this.moveCallback,null,this); + }, + loadLogs:function(){ + var logsCallback={ + success:function(o){ + $('#prearcLogs').html("<h3>History</h3>"+o.responseText); + }, + failure:function(o){}, + cache:false // Turn off caching for IE + }; + YAHOO.util.Connect.asyncRequest('GET',serverRoot+"/REST" + this.url+"/logs?template=details&format=html&requested_screen=PrearchiveDetailsLogs.vm&popup=true",logsCallback,null,this); + } +}; + +//validator is used to simply validate if archiving would work (not to actually archive). +XNAT.app.validator={ + validate:function(){ //issues the REST call to see if this would be archivable + var callback={ + success:function(o){ + this.handleValidation(o); + }, + failure:function(o){ + }, + cache:false, // Turn off caching for IE + scope:this + }; + var validate_service=serverRoot+"/REST/services/validate-archive?format=json&XNAT_CSRF=" + csrfToken; + + YAHOO.util.Connect.setForm(document.getElementById("form1"),false); + YAHOO.util.Connect.asyncRequest('POST',validate_service,callback); + }, + indexOf:function(_list,_obj){ + for (var i = 0;i < _list.length; i++) { + if (_list[i] === _obj) { return i; } + } + return -1; + }, + handleValidation:function(o){ + var validation= eval("(" + o.responseText +")"); + this.show=[]; + var matched=false; + var failed=false; + //iterate over the list of reasons why the archive might fail. + for(var valC=0;valC<validation.ResultSet.Result.length;valC++){ + var val=validation.ResultSet.Result[valC]; + if(val.code=="1"){ + //this just means it matched an existing session, which would have been echoed to the page elsewhere + matched=true; + }else if(this.indexOf(this.fail_merge_on,val.code)>-1){ + failed=true; + val.type="FAIL";//these events are standardly conflicts, but this server is configured for them to fail + this.show.push(val); + }else if(val.type=="FAIL"){ + failed=true; + this.show.push(val); + }else{ + this.show.push(val); + } + } + + if(this.show.length>0){ + //show conflicts, ask approval to override + XNAT.app.validator.warnings="<h3>Current Warnings</h3>"; + for(var valC=0;valC<this.show.length;valC++){ + XNAT.app.validator.warnings+="<div>"+this.show[valC].type+"-"+this.show[valC].code+": "+this.show[valC].message+"</div>" + } + + $("#validationAlerts").html(XNAT.app.validator.warnings); + + if(failed){ + $("#archiveLink").hide(); + }else{ + $("#archiveLink").show(); + } + + this.requiresOverwrite=true; + }else{ + $("#validationAlerts").html(""); + } + } +}; + +//project selector dialog +XNAT.app.move_project_dialog = new YAHOO.widget.Dialog("move_project_dialog", { fixedcenter:true, visible:false, width:"400px", height:"150px", modal:true, close:true, draggable:true,resizable:true}); +XNAT.app.move_project_dialog.cfg.queueProperty("buttons", [ + { text:"Cancel", handler:{fn:function(){ + XNAT.app.move_project_dialog.hide(); + }}},{ text:"Move",id:'move_project_continue', handler:{fn:function(){ + XNAT.app.move_project_dialog.hide(); + XNAT.app.prearchiveActions.move($("#proj_move_select").val()); + }, isDefault:true}}]); diff --git a/src/main/webapp/xnat-templates/screens/FindStudyMatch.vm b/src/main/webapp/xnat-templates/screens/FindStudyMatch.vm new file mode 100644 index 00000000..f61071ea --- /dev/null +++ b/src/main/webapp/xnat-templates/screens/FindStudyMatch.vm @@ -0,0 +1,39 @@ +$page.setTitle("Find Study") +$page.setLinkColor($ui.alink) +$page.setVlinkColor($ui.vlink) +## used to create Change Project modal dialog +<div id='move_project_dialog' style='visibility:hidden'> + <div class='hd'>Change project</div> + <div class='bd' style=''> + <div id='move_projec_desc'>Select the project to move this session to.</div> + <div id='move_projec_div'> + <select id="proj_move_select"></select> + </div> + </div> + <input type="hidden" name="oldProjString" id="oldProjString" value=""/> + <input type="hidden" name="timestampString" id="timestampString" value=""/> + <input type="hidden" name="folderString" id="folderString" value=""/> +</div> + +<script type="text/javascript" src="$content.getURI("scripts/prearchive/PrearchiveFound_actions.js")"></script> + +<h2>Matching Unassigned Studies</h2> +$resultsSize matching studies were found: +<br><br> +#foreach( $result in $results ) + <h3>Study $velocityCount</h3> + <table clsss=""> + <tr><th align="left">$displayManager.getSingularDisplayNameForProject():</th><td>$!result[0]</td></tr> + <tr><th align="left">Session:</th><td>$!result[7]</td></tr> + <tr><th align="left">$displayManager.getSingularDisplayNameForSubject():</th><td>$!result[6]</td></tr> + <tr><th align="left">Patient ID:</th><td>$!result[8]</td></tr> + <tr><th align="left">Study Date:</th><td>$!result[4]</td></tr> + <tr><th align="left">Upload Date:</th><td>$!result[3]</td></tr> + <tr><th align="left"></th><td><button onclick='XNAT.app.prearchiveActions.requestMoveDialog("$result[0]", "$result[3]", "$result[7]")'>Change Project</button></td></tr> + </table> +<br> +#end +<form action="$link.setPage("XDATScreen_prearchives.vm")"> + <input type="submit" value="Return to Prearchive"> +</form> + diff --git a/src/main/webapp/xnat-templates/screens/XDATScreen_prearchives.vm b/src/main/webapp/xnat-templates/screens/XDATScreen_prearchives.vm index 9d71bc7e..0adf61cc 100644 --- a/src/main/webapp/xnat-templates/screens/XDATScreen_prearchives.vm +++ b/src/main/webapp/xnat-templates/screens/XDATScreen_prearchives.vm @@ -21,6 +21,26 @@ $!template.setLayoutTemplate("DefaultExptList.vm") <div id="prearchive_table"></div> <div id="progress-bar"></div> <div id="col_table"></div> + +<br> +<h3>Find my study</h3><br> +<div>If you do not see your data in the prearchive, you may have uploaded it without associating it with a project. If you want to find your data and move it to the appropriate project, please enter the Patient Name, Patient ID, or Study Date in the fields below and click the "Find" button:</div> +<form method="post" action="$link.setAction("FindStudy")"> + <table> + <tr><td>Patient Name:</td> + <td><input type="text" name="patientName"></td></tr> + <tr><td>Patient ID:</td> + <td><input type="text" name="patientID"></td></tr> + <tr><td>Study Date:</td> + <td><span id="upload-datepicker" class="single us today" data-value="" data-validate="onblur" data-input-id="studyDate" data-input-name="studyDate"></span> + <script type="text/javascript"> + jQuery('#upload-datepicker').data('value',XNAT.data.todaysDate.us); + XNAT.app.datePicker.init(jQuery('#upload-datepicker')) + </script></td></tr> + <tr><td><input type="submit" value="Find"></td></tr> + </table> +</form> + <div id="prearcs" class="prearcs"></div> <div id="serverRoot" title="$content.getURI('')"></div> <div id="project" title="$!project"></div> @@ -31,6 +51,7 @@ $!template.setLayoutTemplate("DefaultExptList.vm") <div id="match-op" class="match-op"></div> + ##<!-- <script type="text/javascript" src="$content.getURI('scripts/xstypes.js')"></script> --> ##<!-- <script type="text/javascript" src="$content.getURI('scripts/HtmlAlert.js')"></script> --> ##<!-- <script type="text/javascript" src="$content.getURI('scripts/inbox.js')"></script> --> -- GitLab