From 7d4747ea1692f42b9ae007cf5da654a95c610ec3 Mon Sep 17 00:00:00 2001
From: Vincent Petry <pvince81@owncloud.com>
Date: Mon, 23 Jun 2014 16:35:11 +0200
Subject: [PATCH] Fix blurring of invalid file name on rename

When renaming to an existing file name, blurring the field should not
remove it.

This fix keeps the field until escape is pressed instead of replacing it
with a broken empty space.
---
 apps/files/js/filelist.js           | 16 ++++++++---
 apps/files/tests/js/filelistSpec.js | 41 +++++++++++++++++++++++++++++
 2 files changed, 53 insertions(+), 4 deletions(-)

diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index fb97b2f459..fc08d9b54f 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -1195,9 +1195,20 @@
 				return true;
 			};
 
+			function restore() {
+				input.tipsy('hide');
+				tr.data('renaming',false);
+				form.remove();
+				td.children('a.name').show();
+			}
+
 			form.submit(function(event) {
 				event.stopPropagation();
 				event.preventDefault();
+				if (input.hasClass('error')) {
+					return;
+				}
+
 				try {
 					var newName = input.val();
 					input.tipsy('hide');
@@ -1267,10 +1278,7 @@
 					input.addClass('error');
 				}
 				if (event.keyCode === 27) {
-					input.tipsy('hide');
-					tr.data('renaming',false);
-					form.remove();
-					td.children('a.name').show();
+					restore();
 				}
 			});
 			input.click(function(event) {
diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js
index 743ebf9706..0b0ff0412b 100644
--- a/apps/files/tests/js/filelistSpec.js
+++ b/apps/files/tests/js/filelistSpec.js
@@ -591,6 +591,47 @@ describe('OCA.Files.FileList tests', function() {
 			expect($tr.find('.action').hasClass('hidden')).toEqual(true);
 			expect($tr.find('.fileactions').hasClass('hidden')).toEqual(true);
 
+			// input and form are gone
+			expect(fileList.$fileList.find('input.filename').length).toEqual(0);
+			expect(fileList.$fileList.find('form').length).toEqual(0);
+		});
+		it('Validates the file name', function() {
+			var $input, $tr;
+
+			for (var i = 0; i < testFiles.length; i++) {
+				fileList.add(testFiles[i], {silent: true});
+			}
+
+			// trigger rename prompt
+			fileList.rename('One.txt');
+			$input = fileList.$fileList.find('input.filename');
+			$input.val('Two.jpg');
+
+			// simulate key to trigger validation
+			$input.trigger(new $.Event('keyup', {keyCode: 97}));
+
+			// input is still there with error
+			expect(fileList.$fileList.find('input.filename').length).toEqual(1);
+			expect(fileList.$fileList.find('input.filename').hasClass('error')).toEqual(true);
+
+			// trigger submit does not send server request
+			$input.closest('form').trigger('submit');
+			expect(fakeServer.requests.length).toEqual(0);
+
+			// simulate escape key
+			$input.trigger(new $.Event('keyup', {keyCode: 27}));
+
+			// element is added back with the correct name
+			$tr = fileList.findFileEl('One.txt');
+			expect($tr.length).toEqual(1);
+			expect($tr.find('a .nametext').text().trim()).toEqual('One.txt');
+			expect($tr.find('a.name').is(':visible')).toEqual(true);
+
+			$tr = fileList.findFileEl('Two.jpg');
+			expect($tr.length).toEqual(1);
+			expect($tr.find('a .nametext').text().trim()).toEqual('Two.jpg');
+			expect($tr.find('a.name').is(':visible')).toEqual(true);
+
 			// input and form are gone
 			expect(fileList.$fileList.find('input.filename').length).toEqual(0);
 			expect(fileList.$fileList.find('form').length).toEqual(0);
-- 
GitLab