From 8f53289ff27673aee768089f6c4ad50a66f4d2ce Mon Sep 17 00:00:00 2001
From: Mike Hodge <hodgem@wustl.edu>
Date: Fri, 19 Aug 2016 20:52:09 -0500
Subject: [PATCH] XNAT-4440, XNAT-4441 and XNAT-4443 file uploader issues plus
 other minor fixes

---
 .../scripts/project/projResourceMgmt.js       |  3 +-
 .../uploaders/AutomationBasedUploader.js      | 63 ++++++++++++++++---
 .../webapp/scripts/uploaders/fileuploader.js  | 39 +++++++++++-
 3 files changed, 93 insertions(+), 12 deletions(-)

diff --git a/src/main/webapp/scripts/project/projResourceMgmt.js b/src/main/webapp/scripts/project/projResourceMgmt.js
index d8b71d12..70944351 100644
--- a/src/main/webapp/scripts/project/projResourceMgmt.js
+++ b/src/main/webapp/scripts/project/projResourceMgmt.js
@@ -157,7 +157,8 @@ XNAT.app.pResources={
 					      			scriptId: scriptToRun,
 					      			eventClass: "org.nrg.xft.event.entities.WorkflowStatusEvent",
 					      			filters: { "status":["Complete"] },
-					      			description: "Run " + scriptToRun + " upon " + props.name + " upload." };
+					      			//description: "Run " + scriptToRun + " upon " + props.name + " upload." };
+					      			description: props.name + " --> " + scriptToRun };
 					var eventHandlerAjax = $.ajax({
 						type : "PUT",
 						url:serverRoot+"/data/projects/" + this.id + "/automation/handlers?XNAT_CSRF=" + window.csrfToken,
diff --git a/src/main/webapp/scripts/uploaders/AutomationBasedUploader.js b/src/main/webapp/scripts/uploaders/AutomationBasedUploader.js
index c8cad9d7..236e3d3c 100644
--- a/src/main/webapp/scripts/uploaders/AutomationBasedUploader.js
+++ b/src/main/webapp/scripts/uploaders/AutomationBasedUploader.js
@@ -93,6 +93,25 @@ if(typeof XNAT.app.abu.abuConfigs === 'undefined'){
 				}
 			}
 			
+			// NOTE: $.inArray didn't work here
+			var alreadyContains = function(array, val){
+				outer:
+				for (var i=0; i<array.length; i++) {
+					if (Object.keys(val).length !== Object.keys(array[i]).length) {
+						continue;
+					}
+					for (var j=0; j<Object.keys(val).length; j++) {
+						var key = (Object.keys(val))[j];
+						var tval = val[key];
+						var cval = (array[i])[key];
+						if (tval !== cval) {
+							continue outer;
+						}
+					}
+					return true;
+				}
+				return false;
+			};
 			var tempConfigs2=new Array();
 			//allow filtering of links
 			jq.each(tmpConfigs,function(i1,v1){
@@ -106,15 +125,15 @@ if(typeof XNAT.app.abu.abuConfigs === 'undefined'){
 							}
 						}
 					});
-					if(matched){
+					if(matched && (!alreadyContains(tempConfigs2,v1))){
 						tempConfigs2.push(v1);
 					}
-				}else{
+				}else if (!alreadyContains(tempConfigs2,v1)){
 					tempConfigs2.push(v1);
 				}
 			});
 			return tempConfigs2;
-		}
+		},
 
 
 	}
@@ -452,7 +471,15 @@ XNAT.app.abu.populateWhatToDoSelect = function(){
 								}
 								if (doAssign) {
 									$('#whatToDoSelect').append('<option value="resource- ' + resourceConfigs[h].name + ':launch-' + currEvent.triggerId + '" class="' + currEvent.scope + '">' + 
-				                                                ((typeof resourceConfigs[h].description !== 'undefined' && resourceConfigs[h].description.length>0) ? resourceConfigs[h].description : resourceConfigs[h].name) + " --> " + 
+				                                                (
+											(typeof currEvent == 'undefined' || typeof currEvent.description == 'undefined' || currEvent.description.indexOf("-->")<0)
+											/*
+											Per XNAT-4333, Use name rather than description
+ 											? (((typeof resourceConfigs[h].description !== 'undefined' && resourceConfigs[h].description.length>0) ? resourceConfigs[h].description : resourceConfigs[h].name) + " --> ") : ""
+											*/
+ 											? (resourceConfigs[h].name + " --> ") : ""
+										) +
+
 									 ((typeof(currEvent.description) !== 'undefined' && currEvent.description.length>0) ? currEvent.description : currEvent.scriptId) + '</option>');
 									resourceMatch = true;
 								}
@@ -468,7 +495,11 @@ XNAT.app.abu.populateWhatToDoSelect = function(){
 				}
 			} 
 			if (!resourceMatch) {
+				/*
+				Per XNAT-4333, Use name rather than description
 				$("#whatToDoSelect").append('<option value="resource-' + resourceConfigs[h].name + '">' + ((typeof resourceConfigs[h].description !== 'undefined' && resourceConfigs[h].description.length>0) ? resourceConfigs[h].description : resourceConfigs[h].name) + '</option>');
+				*/
+				$("#whatToDoSelect").append('<option value="resource-' + resourceConfigs[h].name + '">' + resourceConfigs[h].name + '</option>');
 			}
 		}
 	} 
@@ -571,10 +602,15 @@ XNAT.app.abu.initializeAbuUploader = function(usageType){
 							XNAT.app.abu.sendWorkflowWhenDone();
 						}
 					}
+					var isCancel = ($(".abu-done-button-cancel").length>0);
+					var fileUploaded = ($(".abu-done-button-file-uploaded").length>0);
 					xmodal.close(XNAT.app.abu.abuConfigs.modalOpts.id);
-					//if (abu._fileUploader.uploadsStarted>0 && abu._fileUploader.uploadsInProgress==0) {
-					//	window.location.reload(true);
-					//}
+					if (abu._fileUploader.uploadsStarted>0 && abu._fileUploader.uploadsInProgress==0 && !isCancel && fileUploaded) {
+						setTimeout(function(){
+							window.location.reload(true);
+						},20);
+						xmodal.message('Please Wait','Reloading page.  Please wait.');
+					}
 				},
 			uploadStartedFunction:function(){
 					if (abu._fileUploader._currentAction.indexOf("import-handler=" + XNAT.app.abu.importHandler)>=0 && (typeof(XNAT.app.abu.buildPath) == 'undefined' || XNAT.app.abu.buildPath == '')) {
@@ -594,11 +630,18 @@ XNAT.app.abu.initializeAbuUploader = function(usageType){
 			uploadCompletedFunction:function(){
 					var eventHandler = $('#eventHandlerSelect').val();
 					if (typeof eventHandler !== 'undefined' && eventHandler != null && eventHandler.length>0) {
+						if ($(".abu-upload-complete-text").length==0) {
+							$("#abu-done-button").removeClass("abu-button-disabled");
+						} else {
+							$("#abu-done-button").addClass("abu-button-disabled");
+						}
 						$("#abu-process-button").removeClass("abu-button-disabled");
 						$("#abu-process-button-text").html("Process Files");
 						$("#abu-process-button").css("visibility","visible");
 					} else {
 						$("#abu-done-button-text").html("Done");
+						$("#abu-done-button-text").addClass("abu-done-button-done");
+						$("#abu-done-button-text").removeClass("abu-done-button-cancel");
 						$("#abu-done-button").removeClass("abu-button-disabled");
 					}
 				},
@@ -625,6 +668,8 @@ XNAT.app.abu.initializeAbuUploader = function(usageType){
 				} else {
 					$("#abu-done-button").removeClass("abu-button-disabled");
 					$("#abu-done-button-text").html("Done");
+					$("#abu-done-button-text").addClass("abu-done-button-done");
+					$("#abu-done-button-text").removeClass("abu-done-button-cancel");
 				}
 				$(".upload-area").css("display","none");
 				$(".whattodo-area").css("display","none");
@@ -633,6 +678,8 @@ XNAT.app.abu.initializeAbuUploader = function(usageType){
 				$("#abu-upload-button").css("display","none");
 				$("#abu-process-button-text").html("Run script");
 				$("#abu-done-button-text").html("Cancel");
+				$("#abu-done-button-text").addClass("abu-done-button-cancel");
+				$("#abu-done-button-text").removeClass("abu-done-button-done");
 				if ($('#eventHandlerSelect option').size()>1 && $('#eventHandlerSelect').val()=="") {
 					$("#abu-process-button").addClass("abu-button-disabled");
 					//$("#abu-process-button-text").html("&nbsp;");
@@ -797,7 +844,7 @@ XNAT.app.abu.updateResourceStats=function() {
 		if (abu._fileUploader._currentAction.indexOf("import-handler=" + XNAT.app.abu.importHandler)<0) {
 			var updateStatsUrl = "/data/services/refresh/catalog?resource=" + 
 				abu._fileUploader._currentAction.replace(/\/files[\/?].*$/i,'').replace(/^\/data\//i,"/archive/").replace(/^\/REST\//i,"/archive/" +
-				"&options=populateStats") + "&XNAT_CSRF=" + window.csrfToken;
+				"&options=populateStats") + "&options=populateStats,append,delete,checksum&XNAT_CSRF=" + window.csrfToken;
 			var updateStatsAjax = $.ajax({
 				type : "POST",
 				url:serverRoot+updateStatsUrl,
diff --git a/src/main/webapp/scripts/uploaders/fileuploader.js b/src/main/webapp/scripts/uploaders/fileuploader.js
index c00698bc..777a8608 100644
--- a/src/main/webapp/scripts/uploaders/fileuploader.js
+++ b/src/main/webapp/scripts/uploaders/fileuploader.js
@@ -35,7 +35,7 @@ abu.FileUploader = function(o){
 				'Upload files<input multiple="multiple" type="file" id="file-upload-input" class="abu-button-input">' + 
 			'</div>' +
 			'<div id="abu-done-button" class="abu-done-button" style="position: relative; overflow: hidden; direction: ltr;">' + 
-				'<span id="abu-done-button-text">Cancel</span><input type="image" name="done" class="abu-button-input" style="width:105px">' +
+				'<span id="abu-done-button-text" class="abu-done-button-cancel">Cancel</span><input type="image" name="done" class="abu-button-input" style="width:105px">' +
 			'</div>' +
 			'<div id="abu-process-button" class="abu-process-button " style="position: relative; overflow: hidden; direction: ltr;">' +
 				'<span id="abu-process-button-text">Process Files</span>' +
@@ -187,6 +187,8 @@ abu.FileUploader = function(o){
 
 	this.processingComplete = function() {
 		$("#abu-done-button-text").html("Done");
+		$("#abu-done-button-text").addClass("abu-done-button-done");
+		$("#abu-done-button-text").removeClass("abu-done-button-cancel");
 		//$("#abu-upload-button").css("display","None");
 		$("#abu-process-button").addClass("abu-button-disabled");
 		//$("#abu-process-button-text").html("&nbsp;");
@@ -248,6 +250,34 @@ abu.FileUploader = function(o){
 		$(formSelector).on("submit",function(e, uploader) {
 			 $(this).ajaxSubmit({
 				beforeSend: function(arr, $form, options) {
+					var formURL = $form.url;
+					if (typeof formURL !== 'undefined' && formURL.toLowerCase().indexOf("overwrite=true")>=0 && formURL.indexOf("/files")>0) {
+						// See if file already exists
+						var dupURL = formURL.substring(0,formURL.indexOf("/files")+6) + "?format=json";
+						this.fileName = formURL.substring(formURL.indexOf("/files")+7);
+						if (this.fileName.indexOf("?")>0) {
+							this.fileName = this.fileName.substring(0,this.fileName.indexOf("?"))
+						}
+						this.isOverwrite = false;
+						$.ajax({
+							type: "GET",
+							url: dupURL,
+							async: false,
+							dataType: 'json',
+						}).done(function(data, textStatus, jqXHR) {
+							//console.log(data);
+							if (typeof data.ResultSet !== 'undefined' && typeof data.ResultSet.Result !== 'undefined' && Array.isArray(data.ResultSet.Result)) {
+								var resultArr = data.ResultSet.Result;
+								for (var i=0; i<resultArr.length; i++) {
+									if (typeof resultArr[i].Name !== 'undefined' && (resultArr[i].Name == this.fileName  ||
+										(typeof resultArr[i].URI !== 'undefined' && resultArr[i].URI.endsWith('/' + this.fileName)))) {
+										this.isOverwrite = true;
+										break;
+									}
+								}
+							}
+						}.bind(this));
+					}
 					$form.data = formData;
 					$form.processData=false;
 					$form.contentType=false;
@@ -288,10 +318,13 @@ abu.FileUploader = function(o){
 					} 
 					if (!isDuplicate) {
 						if (typeof result.status !== 'undefined' || result.length > 150) {
-				 			status.html('<a href="javascript:abu._fileUploader.showReturnedText(\'' + $(status).attr('id') + '\')" class="underline abu-upload-complete abu-upload-complete-text">Upload complete</a>');
+				 			status.html('<a href="javascript:abu._fileUploader.showReturnedText(\'' + $(status).attr('id') + '\')" class="underline abu-upload-complete abu-upload-complete-text">Upload complete' + 
+								((this.isOverwrite) ? ' (Existing file overwritten) ' : '') + '</a>');
 						} else {
-				 			status.html('<span class="abu-upload-complete abu-upload-complete-text">Upload complete</span>');
+				 			status.html('<span class="abu-upload-complete abu-upload-complete-text">Upload complete' + 
+								((this.isOverwrite) ? ' (Existing file overwritten) ' : '') + '</span>');
 						}
+						$("#abu-done-button-text").addClass("abu-done-button-file-uploaded");
 					} else {
 			 			status.html('<a href="javascript:abu._fileUploader.showReturnedText(\'' + $(status).attr('id') + '\')" class="underline abu-upload-fail">Duplicate file and overwrite=false.  Not uploaded.</a>');
 					}
-- 
GitLab