[Pkg-owncloud-commits] [owncloud] 159/199: Distinguish legacy file actions from regular file actions

David Prévot taffit at moszumanska.debian.org
Sun Jun 1 18:53:21 UTC 2014


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch master
in repository owncloud.

commit ef59c69dc822c9ff69c564c41e0dfdce142b9cdf
Author: Vincent Petry <pvince81 at owncloud.com>
Date:   Tue May 20 16:01:34 2014 +0200

    Distinguish legacy file actions from regular file actions
    
    Legacy file actions are registered by legacy apps through
    window.FileActions.register(). These actions can only be used by the
    main file list ("all files") because legacy apps can only deal with a
    single list / container.
    
    New file actions of compatible apps must be registered through
    OCA.Files.fileActions. These will be used for other lists like the
    sharing overview.
    
    Fixed versions and sharing actions to use OCA.Files.fileActions, which
    makes them available in the sharing overview list.
---
 apps/files/js/app.js                         | 19 +++++---
 apps/files/js/fileactions.js                 | 69 +++++++++++++++++++++-------
 apps/files/js/filelist.js                    | 21 +++++----
 apps/files/tests/js/appSpec.js               | 53 ++++++++++++++++++++-
 apps/files/tests/js/fileactionsSpec.js       |  7 +--
 apps/files/tests/js/filelistSpec.js          |  5 --
 apps/files_sharing/js/app.js                 | 22 +++++----
 apps/files_sharing/js/public.js              | 18 ++++++--
 apps/files_sharing/js/share.js               | 11 ++---
 apps/files_trashbin/js/app.js                | 18 ++++----
 apps/files_trashbin/js/filelist.js           |  4 +-
 apps/files_trashbin/tests/js/filelistSpec.js | 11 +++--
 apps/files_versions/js/versions.js           |  6 +--
 13 files changed, 183 insertions(+), 81 deletions(-)

diff --git a/apps/files/js/app.js b/apps/files/js/app.js
index 6d8a978..6ccf513 100644
--- a/apps/files/js/app.js
+++ b/apps/files/js/app.js
@@ -24,20 +24,27 @@
 		initialize: function() {
 			this.navigation = new OCA.Files.Navigation($('#app-navigation'));
 
-			// TODO: ideally these should be in a separate class / app (the embedded "all files" app)
-			this.fileActions = OCA.Files.FileActions.clone();
+			var fileActions = new OCA.Files.FileActions();
+			// default actions
+			fileActions.registerDefaultActions();
+			// legacy actions
+			fileActions.merge(window.FileActions);
+			// regular actions
+			fileActions.merge(OCA.Files.fileActions);
+
 			this.files = OCA.Files.Files;
 
+			// TODO: ideally these should be in a separate class / app (the embedded "all files" app)
 			this.fileList = new OCA.Files.FileList(
 				$('#app-content-files'), {
 					scrollContainer: $('#app-content'),
 					dragOptions: dragOptions,
-					folderDropOptions: folderDropOptions
+					folderDropOptions: folderDropOptions,
+					fileActions: fileActions,
+					allowLegacyActions: true
 				}
 			);
 			this.files.initialize();
-			this.fileActions.registerDefaultActions();
-			this.fileList.setFileActions(this.fileActions);
 
 			// for backward compatibility, the global FileList will
 			// refer to the one of the "files" view
@@ -146,7 +153,7 @@
 })();
 
 $(document).ready(function() {
-	// wait for other apps/extensions to register their event handlers
+	// wait for other apps/extensions to register their event handlers and file actions
 	// in the "ready" clause
 	_.defer(function() {
 		OCA.Files.App.initialize();
diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js
index a12b1f0..8cee037 100644
--- a/apps/files/js/fileactions.js
+++ b/apps/files/js/fileactions.js
@@ -11,11 +11,40 @@
 /* global trashBinApp */
 (function() {
 
-	var FileActions = {
+	/**
+	 * Construct a new FileActions instance
+	 */
+	var FileActions = function() {
+		this.initialize();
+	}
+	FileActions.prototype = {
 		actions: {},
 		defaults: {},
 		icons: {},
 		currentFile: null,
+		initialize: function() {
+			this.clear();
+		},
+		/**
+		 * Merges the actions from the given fileActions into
+		 * this instance.
+		 *
+		 * @param fileActions instance of OCA.Files.FileActions
+		 */
+		merge: function(fileActions) {
+			var self = this;
+			// merge first level to avoid unintended overwriting
+			_.each(fileActions.actions, function(sourceMimeData, mime) {
+				var targetMimeData = self.actions[mime];
+				if (!targetMimeData) {
+					targetMimeData = {};
+				}
+				self.actions[mime] = _.extend(targetMimeData, sourceMimeData);
+			});
+
+			this.defaults = _.extend(this.defaults, fileActions.defaults);
+			this.icons = _.extend(this.icons, fileActions.icons);
+		},
 		register: function (mime, name, permissions, icon, action, displayName) {
 			if (!this.actions[mime]) {
 				this.actions[mime] = {};
@@ -31,18 +60,6 @@
 			this.actions[mime][name]['displayName'] = displayName;
 			this.icons[name] = icon;
 		},
-		/**
-		 * Clones the current file actions handler including the already
-		 * registered actions.
-		 */
-		clone: function() {
-			var fileActions = _.extend({}, this);
-			// need to deep copy the actions as well
-			fileActions.actions = _.extend({}, this.actions);
-			fileActions.defaults = _.extend({}, this.defaults);
-			//fileActions.icons = _.extend({}, this.icons);
-			return fileActions;
-		},
 		clear: function() {
 			this.actions = {};
 			this.defaults = {};
@@ -137,6 +154,9 @@
 				event.preventDefault();
 
 				self.currentFile = event.data.elem;
+				// also set on global object for legacy apps
+				window.FileActions.currentFile = self.currentFile;
+
 				var file = self.getCurrentFile();
 				var $tr = $(this).closest('tr');
 
@@ -276,8 +296,25 @@
 	};
 
 	OCA.Files.FileActions = FileActions;
-})();
 
-// for backward compatibility
-window.FileActions = OCA.Files.FileActions;
+	// global file actions to be used by all lists
+	OCA.Files.fileActions = new OCA.Files.FileActions();
+	OCA.Files.legacyFileActions = new OCA.Files.FileActions();
+
+	// for backward compatibility
+	// 
+	// legacy apps are expecting a stateful global FileActions object to register
+	// their actions on. Since legacy apps are very likely to break with other
+	// FileList views than the main one ("All files"), actions registered
+	// through window.FileActions will be limited to the main file list.
+	window.FileActions = OCA.Files.legacyFileActions;
+	window.FileActions.register = function (mime, name, permissions, icon, action, displayName) {
+		console.warn('FileActions.register() is deprecated, please use OCA.Files.fileActions.register() instead');
+		OCA.Files.FileActions.prototype.register.call(window.FileActions, mime, name, permissions, icon, action, displayName);
+	};
+	window.FileActions.setDefault = function (mime, name) {
+		console.warn('FileActions.setDefault() is deprecated, please use OCA.Files.fileActions.setDefault() instead');
+		OCA.Files.FileActions.prototype.setDefault.call(window.FileActions, mime, name);
+	};
+})();
 
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index e1cbfc3..52d4c8b 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -125,7 +125,7 @@
 			this.$container = options.scrollContainer || $(window);
 			this.$table = $el.find('table:first');
 			this.$fileList = $el.find('#fileList');
-			this.fileActions = OCA.Files.FileActions;
+			this._initFileActions(options.fileActions);
 			this.files = [];
 			this._selectedFiles = {};
 			this._selectionSummary = new OCA.Files.FileSummary();
@@ -168,6 +168,14 @@
 			this.$container.on('scroll', _.bind(this._onScroll, this));
 		},
 
+		_initFileActions: function(fileActions) {
+			this.fileActions = fileActions;
+			if (!this.fileActions) {
+				this.fileActions = new OCA.Files.FileActions();
+				this.fileActions.registerDefaultActions();
+			}
+		},
+
 		/**
 		 * Event handler for when the URL changed
 		 */
@@ -248,6 +256,8 @@
 					var action = this.fileActions.getDefault(mime,type, permissions);
 					if (action) {
 						event.preventDefault();
+						// also set on global object for legacy apps
+						window.FileActions.currentFile = this.fileActions.currentFile;
 						action(filename, {
 							$file: $tr,
 							fileList: this,
@@ -792,15 +802,6 @@
 		},
 
 		/**
-		 * Sets the file actions handler.
-		 *
-		 * @param fileActions FileActions handler
-		 */
-		setFileActions: function(fileActions) {
-			this.fileActions = fileActions;
-		},
-
-		/**
 		 * Sets the current directory name and updates the breadcrumb.
 		 * @param targetDir directory to display
 		 * @param changeUrl true to also update the URL, false otherwise (default)
diff --git a/apps/files/tests/js/appSpec.js b/apps/files/tests/js/appSpec.js
index 0e9abad..a9bbab0 100644
--- a/apps/files/tests/js/appSpec.js
+++ b/apps/files/tests/js/appSpec.js
@@ -41,6 +41,10 @@ describe('OCA.Files.App tests', function() {
 			'</div>'
 		);
 
+		window.FileActions = new OCA.Files.FileActions();
+		OCA.Files.legacyFileActions = window.FileActions;
+		OCA.Files.fileActions = new OCA.Files.FileActions();
+
 		pushStateStub = sinon.stub(OC.Util.History, 'pushState');
 		parseUrlQueryStub = sinon.stub(OC.Util.History, 'parseUrlQuery');
 		parseUrlQueryStub.returns({});
@@ -51,8 +55,6 @@ describe('OCA.Files.App tests', function() {
 		App.navigation = null;
 		App.fileList = null;
 		App.files = null;
-		App.fileActions.clear();
-		App.fileActions = null;
 
 		pushStateStub.restore();
 		parseUrlQueryStub.restore();
@@ -64,6 +66,53 @@ describe('OCA.Files.App tests', function() {
 			expect(App.fileList.fileActions.actions.all).toBeDefined();
 			expect(App.fileList.$el.is('#app-content-files')).toEqual(true);
 		});
+		it('merges the legacy file actions with the default ones', function() {
+			var legacyActionStub = sinon.stub();
+			var actionStub = sinon.stub();
+			// legacy action
+			window.FileActions.register(
+					'all',
+					'LegacyTest',
+					OC.PERMISSION_READ,
+					OC.imagePath('core', 'actions/test'),
+					legacyActionStub
+			);
+			// legacy action to be overwritten
+			window.FileActions.register(
+					'all',
+					'OverwriteThis',
+					OC.PERMISSION_READ,
+					OC.imagePath('core', 'actions/test'),
+					legacyActionStub
+			);
+
+			// regular file actions
+			OCA.Files.fileActions.register(
+					'all',
+					'RegularTest',
+					OC.PERMISSION_READ,
+					OC.imagePath('core', 'actions/test'),
+					actionStub
+			);
+
+			// overwrite
+			OCA.Files.fileActions.register(
+					'all',
+					'OverwriteThis',
+					OC.PERMISSION_READ,
+					OC.imagePath('core', 'actions/test'),
+					actionStub
+			);
+
+			App.initialize();
+
+			var actions = App.fileList.fileActions.actions;
+			expect(actions.all.OverwriteThis.action).toBe(actionStub);
+			expect(actions.all.LegacyTest.action).toBe(legacyActionStub);
+			expect(actions.all.RegularTest.action).toBe(actionStub);
+			// default one still there
+			expect(actions.dir.Open.action).toBeDefined();
+		});
 	});
 
 	describe('URL handling', function() {
diff --git a/apps/files/tests/js/fileactionsSpec.js b/apps/files/tests/js/fileactionsSpec.js
index edd7e34..fa634da 100644
--- a/apps/files/tests/js/fileactionsSpec.js
+++ b/apps/files/tests/js/fileactionsSpec.js
@@ -21,7 +21,7 @@
 
 describe('OCA.Files.FileActions tests', function() {
 	var $filesTable, fileList;
-	var FileActions = OCA.Files.FileActions;
+	var FileActions; 
 
 	beforeEach(function() {
 		// init horrible parameters
@@ -31,10 +31,11 @@ describe('OCA.Files.FileActions tests', function() {
 		// dummy files table
 		$filesTable = $body.append('<table id="filestable"></table>');
 		fileList = new OCA.Files.FileList($('#testArea'));
-		FileActions.registerDefaultActions(fileList);
+		FileActions = new OCA.Files.FileActions();
+		FileActions.registerDefaultActions();
 	});
 	afterEach(function() {
-		FileActions.clear();
+		FileActions = null;
 		fileList = undefined;
 		$('#dir, #permissions, #filestable').remove();
 	});
diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js
index 739ae59..a197fd5 100644
--- a/apps/files/tests/js/filelistSpec.js
+++ b/apps/files/tests/js/filelistSpec.js
@@ -21,7 +21,6 @@
 
 describe('OCA.Files.FileList tests', function() {
 	var testFiles, alertStub, notificationStub, fileList;
-	var FileActions = OCA.Files.FileActions;
 
 	/**
 	 * Generate test file data
@@ -117,15 +116,11 @@ describe('OCA.Files.FileList tests', function() {
 		}];
 
 		fileList = new OCA.Files.FileList($('#app-content-files'));
-		FileActions.clear();
-		FileActions.registerDefaultActions(fileList);
-		fileList.setFileActions(FileActions);
 	});
 	afterEach(function() {
 		testFiles = undefined;
 		fileList = undefined;
 
-		FileActions.clear();
 		notificationStub.restore();
 		alertStub.restore();
 	});
diff --git a/apps/files_sharing/js/app.js b/apps/files_sharing/js/app.js
index 5755123..7a71684 100644
--- a/apps/files_sharing/js/app.js
+++ b/apps/files_sharing/js/app.js
@@ -23,11 +23,11 @@ OCA.Sharing.App = {
 			$el,
 			{
 				scrollContainer: $('#app-content'),
-				sharedWithUser: true
+				sharedWithUser: true,
+				fileActions: this._createFileActions()
 			}
 		);
 
-		this._initFileActions(this._inFileList);
 		this._extendFileList(this._inFileList);
 		this._inFileList.appName = t('files_sharing', 'Shared with you');
 		this._inFileList.$el.find('#emptycontent').text(t('files_sharing', 'No files have been shared with you yet.'));
@@ -41,25 +41,31 @@ OCA.Sharing.App = {
 			$el,
 			{
 				scrollContainer: $('#app-content'),
-				sharedWithUser: false
+				sharedWithUser: false,
+				fileActions: this._createFileActions()
 			}
 		);
 
-		this._initFileActions(this._outFileList);
 		this._extendFileList(this._outFileList);
 		this._outFileList.appName = t('files_sharing', 'Shared with others');
 		this._outFileList.$el.find('#emptycontent').text(t('files_sharing', 'You haven\'t shared any files yet.'));
 	},
 
-	_initFileActions: function(fileList) {
-		var fileActions = OCA.Files.FileActions.clone();
+	_createFileActions: function() {
+		// inherit file actions from the files app
+		var fileActions = new OCA.Files.FileActions();
+		// note: not merging the legacy actions because legacy apps are not
+		// compatible with the sharing overview and need to be adapted first
+		fileActions.merge(OCA.Files.fileActions);
+
 		// when the user clicks on a folder, redirect to the corresponding
-		// folder in the files app
+		// folder in the files app instead of opening it directly
 		fileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename, context) {
 			OCA.Files.App.setActiveView('files', {silent: true});
 			OCA.Files.App.fileList.changeDirectory(context.$file.attr('data-path') + '/' + filename, true, true);
 		});
-		fileList.setFileActions(fileActions);
+		fileActions.setDefault('dir', 'Open');
+		return fileActions;
 	},
 
 	_extendFileList: function(fileList) {
diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js
index d825ee9..446f3f2 100644
--- a/apps/files_sharing/js/public.js
+++ b/apps/files_sharing/js/public.js
@@ -19,9 +19,18 @@ OCA.Sharing.PublicApp = {
 
 	initialize: function($el) {
 		var self = this;
+		var fileActions;
 		if (this._initialized) {
 			return;
 		}
+		fileActions = new OCA.Files.FileActions();
+		// default actions
+		fileActions.registerDefaultActions();
+		// legacy actions
+		fileActions.merge(window.FileActions);
+		// regular actions
+		fileActions.merge(OCA.Files.fileActions);
+
 		this._initialized = true;
 		this.initialDir = $('#dir').val();
 
@@ -32,7 +41,8 @@ OCA.Sharing.PublicApp = {
 				{
 					scrollContainer: $(window),
 					dragOptions: dragOptions,
-					folderDropOptions: folderDropOptions
+					folderDropOptions: folderDropOptions,
+					fileActions: fileActions
 				}
 			);
 			this.files = OCA.Files.Files;
@@ -121,10 +131,8 @@ OCA.Sharing.PublicApp = {
 				};
 			});
 
-			this.fileActions = _.extend({}, OCA.Files.FileActions);
-			this.fileActions.registerDefaultActions(this.fileList);
-			delete this.fileActions.actions.all.Share;
-			this.fileList.setFileActions(this.fileActions);
+			// do not allow sharing from the public page
+			delete this.fileList.fileActions.actions.all.Share;
 
 			this.fileList.changeDirectory(this.initialDir || '/', false, true);
 
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
index 28586a1..1fcb1f0 100644
--- a/apps/files_sharing/js/share.js
+++ b/apps/files_sharing/js/share.js
@@ -9,10 +9,7 @@
  */
 
 $(document).ready(function() {
-
-	var sharesLoaded = false;
-
-	if (typeof OC.Share !== 'undefined' && typeof FileActions !== 'undefined') {
+	if (!_.isUndefined(OC.Share) && !_.isUndefined(OCA.Files)) {
 		// TODO: make a separate class for this or a hook or jQuery event ?
 		if (OCA.Files.FileList) {
 			var oldCreateRow = OCA.Files.FileList.prototype._createRow;
@@ -64,18 +61,18 @@ $(document).ready(function() {
 				}
 			})
 
-			if (!sharesLoaded){
+			if (!OCA.Sharing.sharesLoaded){
 				OC.Share.loadIcons('file', $fileList);
 				// assume that we got all shares, so switching directories
 				// will not invalidate that list
-				sharesLoaded = true;
+				OCA.Sharing.sharesLoaded = true;
 			}
 			else{
 				OC.Share.updateIcons('file', $fileList);
 			}
 		});
 
-		OCA.Files.FileActions.register(
+		OCA.Files.fileActions.register(
 				'all',
 				'Share',
 				OC.PERMISSION_SHARE,
diff --git a/apps/files_trashbin/js/app.js b/apps/files_trashbin/js/app.js
index cf3fb1d..c59a132 100644
--- a/apps/files_trashbin/js/app.js
+++ b/apps/files_trashbin/js/app.js
@@ -19,22 +19,20 @@ OCA.Trashbin.App = {
 		this._initialized = true;
 		this.fileList = new OCA.Trashbin.FileList(
 			$('#app-content-trashbin'), {
-				scrollContainer: $('#app-content')
+				scrollContainer: $('#app-content'),
+				fileActions: this._createFileActions()
 			}
 		);
-		this.registerFileActions(this.fileList);
 	},
 
-	registerFileActions: function(fileList) {
-		var self = this;
-		var fileActions = _.extend({}, OCA.Files.FileActions);
-		fileActions.clear();
-		fileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename) {
-			var dir = fileList.getCurrentDirectory();
+	_createFileActions: function() {
+		var fileActions = new OCA.Files.FileActions();
+		fileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename, context) {
+			var dir = context.fileList.getCurrentDirectory();
 			if (dir !== '/') {
 				dir = dir + '/';
 			}
-			fileList.changeDirectory(dir + filename);
+			context.fileList.changeDirectory(dir + filename);
 		});
 
 		fileActions.setDefault('dir', 'Open');
@@ -69,7 +67,7 @@ OCA.Trashbin.App = {
 				_.bind(fileList._removeCallback, fileList)
 			);
 		});
-		fileList.setFileActions(fileActions);
+		return fileActions;
 	}
 };
 
diff --git a/apps/files_trashbin/js/filelist.js b/apps/files_trashbin/js/filelist.js
index 205f879..826c1bd 100644
--- a/apps/files_trashbin/js/filelist.js
+++ b/apps/files_trashbin/js/filelist.js
@@ -26,8 +26,8 @@
 		return name;
 	}
 
-	var FileList = function($el) {
-		this.initialize($el);
+	var FileList = function($el, options) {
+		this.initialize($el, options);
 	};
 	FileList.prototype = _.extend({}, OCA.Files.FileList.prototype, {
 		id: 'trashbin',
diff --git a/apps/files_trashbin/tests/js/filelistSpec.js b/apps/files_trashbin/tests/js/filelistSpec.js
index d41c24c..11eeff6 100644
--- a/apps/files_trashbin/tests/js/filelistSpec.js
+++ b/apps/files_trashbin/tests/js/filelistSpec.js
@@ -21,7 +21,6 @@
 
 describe('OCA.Trashbin.FileList tests', function() {
 	var testFiles, alertStub, notificationStub, fileList;
-	var FileActions = OCA.Files.FileActions;
 
 	beforeEach(function() {
 		alertStub = sinon.stub(OC.dialogs, 'alert');
@@ -87,14 +86,18 @@ describe('OCA.Trashbin.FileList tests', function() {
 			etag: '456'
 		}];
 
-		fileList = new OCA.Trashbin.FileList($('#app-content-trashbin'));
-		OCA.Trashbin.App.registerFileActions(fileList);
+		// register file actions like the trashbin App does
+		var fileActions = OCA.Trashbin.App._createFileActions(fileList);
+		fileList = new OCA.Trashbin.FileList(
+			$('#app-content-trashbin'), {
+				fileActions: fileActions
+			}
+		);
 	});
 	afterEach(function() {
 		testFiles = undefined;
 		fileList = undefined;
 
-		FileActions.clear();
 		$('#dir').remove();
 		notificationStub.restore();
 		alertStub.restore();
diff --git a/apps/files_versions/js/versions.js b/apps/files_versions/js/versions.js
index a239354..942a1a9 100644
--- a/apps/files_versions/js/versions.js
+++ b/apps/files_versions/js/versions.js
@@ -8,7 +8,7 @@
  *
  */
 
-/* global FileActions, scanFiles, escapeHTML, formatDate */
+/* global scanFiles, escapeHTML, formatDate */
 $(document).ready(function(){
 
 	if ($('#isPublic').val()){
@@ -18,9 +18,9 @@ $(document).ready(function(){
 		return;
 	}
 
-	if (typeof FileActions !== 'undefined') {
+	if (OCA.Files) {
 		// Add versions button to 'files/index.php'
-		FileActions.register(
+		OCA.Files.fileActions.register(
 			'file',
 			'Versions',
 			OC.PERMISSION_UPDATE,

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud.git



More information about the Pkg-owncloud-commits mailing list