From 310d79728447ecf69f18d0b61a527397bd961888 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Tue, 1 Sep 2015 19:29:55 +0200 Subject: Add versions tab to files sidebar - move versions to a tab in the files sidebar - added mechanism to auto-update the row in the FileList whenever values are set to the FileInfoModel given to the sidebar - updated tags/favorite action to make use of that new mechanism --- apps/files_versions/ajax/getVersions.php | 2 +- apps/files_versions/ajax/preview.php | 5 +- apps/files_versions/css/versions.css | 27 ++- apps/files_versions/js/filesplugin.js | 34 ++++ apps/files_versions/js/versioncollection.js | 91 +++++++++ apps/files_versions/js/versionmodel.js | 77 ++++++++ apps/files_versions/js/versions.js | 193 ------------------- apps/files_versions/js/versionstabview.js | 198 ++++++++++++++++++++ apps/files_versions/lib/hooks.php | 12 ++ .../tests/js/versioncollectionSpec.js | 161 ++++++++++++++++ apps/files_versions/tests/js/versionmodelSpec.js | 96 ++++++++++ .../files_versions/tests/js/versionstabviewSpec.js | 208 +++++++++++++++++++++ 12 files changed, 895 insertions(+), 209 deletions(-) create mode 100644 apps/files_versions/js/filesplugin.js create mode 100644 apps/files_versions/js/versioncollection.js create mode 100644 apps/files_versions/js/versionmodel.js delete mode 100644 apps/files_versions/js/versions.js create mode 100644 apps/files_versions/js/versionstabview.js create mode 100644 apps/files_versions/tests/js/versioncollectionSpec.js create mode 100644 apps/files_versions/tests/js/versionmodelSpec.js create mode 100644 apps/files_versions/tests/js/versionstabviewSpec.js (limited to 'apps/files_versions') diff --git a/apps/files_versions/ajax/getVersions.php b/apps/files_versions/ajax/getVersions.php index 20d60240179..59bd30f434f 100644 --- a/apps/files_versions/ajax/getVersions.php +++ b/apps/files_versions/ajax/getVersions.php @@ -44,6 +44,6 @@ if( $versions ) { } else { - \OCP\JSON::success(array('data' => array('versions' => false, 'endReached' => true))); + \OCP\JSON::success(array('data' => array('versions' => [], 'endReached' => true))); } diff --git a/apps/files_versions/ajax/preview.php b/apps/files_versions/ajax/preview.php index 8a9a5fba14c..2f33f0278ef 100644 --- a/apps/files_versions/ajax/preview.php +++ b/apps/files_versions/ajax/preview.php @@ -53,7 +53,10 @@ try { $preview->setScalingUp($scalingUp); $preview->showPreview(); -}catch(\Exception $e) { +} catch (\OCP\Files\NotFoundException $e) { + \OC_Response::setStatus(404); + \OCP\Util::writeLog('core', $e->getmessage(), \OCP\Util::DEBUG); +} catch (\Exception $e) { \OC_Response::setStatus(500); \OCP\Util::writeLog('core', $e->getmessage(), \OCP\Util::DEBUG); } diff --git a/apps/files_versions/css/versions.css b/apps/files_versions/css/versions.css index e3ccfc3c864..ec0f0cc9896 100644 --- a/apps/files_versions/css/versions.css +++ b/apps/files_versions/css/versions.css @@ -1,19 +1,18 @@ -#dropdown.drop-versions { - width: 360px; +.versionsTabView .clear-float { + clear: both; } - -#found_versions li { +.versionsTabView li { width: 100%; cursor: default; height: 56px; float: left; border-bottom: 1px solid rgba(100,100,100,.1); } -#found_versions li:last-child { +.versionsTabView li:last-child { border-bottom: none; } -#found_versions li > * { +.versionsTabView li > * { padding: 7px; float: left; vertical-align: top; @@ -22,34 +21,34 @@ opacity: .5; } -#found_versions li > a, -#found_versions li > span { +.versionsTabView li > a, +.versionsTabView li > span { padding: 17px 7px; } -#found_versions li > *:hover, -#found_versions li > *:focus { +.versionsTabView li > *:hover, +.versionsTabView li > *:focus { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter: alpha(opacity=100); opacity: 1; } -#found_versions img { +.versionsTabView img { cursor: pointer; padding-right: 4px; } -#found_versions img.preview { +.versionsTabView img.preview { cursor: default; opacity: 1; } -#found_versions .versionDate { +.versionsTabView .versionDate { min-width: 100px; vertical-align: text-bottom; } -#found_versions .revertVersion { +.versionsTabView .revertVersion { cursor: pointer; float: right; max-width: 130px; diff --git a/apps/files_versions/js/filesplugin.js b/apps/files_versions/js/filesplugin.js new file mode 100644 index 00000000000..42075ce6462 --- /dev/null +++ b/apps/files_versions/js/filesplugin.js @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2015 + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +(function() { + OCA.Versions = OCA.Versions || {}; + + /** + * @namespace + */ + OCA.Versions.Util = { + /** + * Initialize the versions plugin. + * + * @param {OCA.Files.FileList} fileList file list to be extended + */ + attach: function(fileList) { + if (fileList.id === 'trashbin' || fileList.id === 'files.public') { + return; + } + + fileList.registerTabView(new OCA.Versions.VersionsTabView('versionsTabView')); + } + }; +})(); + +OC.Plugins.register('OCA.Files.FileList', OCA.Versions.Util); + diff --git a/apps/files_versions/js/versioncollection.js b/apps/files_versions/js/versioncollection.js new file mode 100644 index 00000000000..3f8214cde8c --- /dev/null +++ b/apps/files_versions/js/versioncollection.js @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2015 + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +(function() { + /** + * @memberof OCA.Versions + */ + var VersionCollection = OC.Backbone.Collection.extend({ + model: OCA.Versions.VersionModel, + + /** + * @var OCA.Files.FileInfoModel + */ + _fileInfo: null, + + _endReached: false, + _currentIndex: 0, + + url: function() { + var url = OC.generateUrl('/apps/files_versions/ajax/getVersions.php'); + var query = { + source: this._fileInfo.getFullPath(), + start: this._currentIndex + }; + return url + '?' + OC.buildQueryString(query); + }, + + setFileInfo: function(fileInfo) { + this._fileInfo = fileInfo; + // reset + this._endReached = false; + this._currentIndex = 0; + }, + + getFileInfo: function() { + return this._fileInfo; + }, + + hasMoreResults: function() { + return !this._endReached; + }, + + fetch: function(options) { + if (!options || options.remove) { + this._currentIndex = 0; + } + return OC.Backbone.Collection.prototype.fetch.apply(this, arguments); + }, + + /** + * Fetch the next set of results + */ + fetchNext: function() { + if (!this.hasMoreResults()) { + return null; + } + if (this._currentIndex === 0) { + return this.fetch(); + } + return this.fetch({remove: false}); + }, + + parse: function(result) { + var results = _.map(result.data.versions, function(version) { + var revision = parseInt(version.version, 10); + return { + id: revision, + name: version.name, + fullPath: version.path, + timestamp: revision, + size: version.size + }; + }); + this._endReached = result.data.endReached; + this._currentIndex += results.length; + return results; + } + }); + + OCA.Versions = OCA.Versions || {}; + + OCA.Versions.VersionCollection = VersionCollection; +})(); + diff --git a/apps/files_versions/js/versionmodel.js b/apps/files_versions/js/versionmodel.js new file mode 100644 index 00000000000..dc610fc2144 --- /dev/null +++ b/apps/files_versions/js/versionmodel.js @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2015 + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +(function() { + /** + * @memberof OCA.Versions + */ + var VersionModel = OC.Backbone.Model.extend({ + + /** + * Restores the original file to this revision + */ + revert: function(options) { + options = options ? _.clone(options) : {}; + var model = this; + var file = this.getFullPath(); + var revision = this.get('timestamp'); + + $.ajax({ + type: 'GET', + url: OC.generateUrl('/apps/files_versions/ajax/rollbackVersion.php'), + dataType: 'json', + data: { + file: file, + revision: revision + }, + success: function(response) { + if (response.status === 'error') { + if (options.error) { + options.error.call(options.context, model, response, options); + } + model.trigger('error', model, response, options); + } else { + if (options.success) { + options.success.call(options.context, model, response, options); + } + model.trigger('revert', model, response, options); + } + } + }); + }, + + getFullPath: function() { + return this.get('fullPath'); + }, + + getPreviewUrl: function() { + var url = OC.generateUrl('/apps/files_versions/preview'); + var params = { + file: this.get('fullPath'), + version: this.get('timestamp') + }; + return url + '?' + OC.buildQueryString(params); + }, + + getDownloadUrl: function() { + var url = OC.generateUrl('/apps/files_versions/download.php'); + var params = { + file: this.get('fullPath'), + revision: this.get('timestamp') + }; + return url + '?' + OC.buildQueryString(params); + } + }); + + OCA.Versions = OCA.Versions || {}; + + OCA.Versions.VersionModel = VersionModel; +})(); + diff --git a/apps/files_versions/js/versions.js b/apps/files_versions/js/versions.js deleted file mode 100644 index e86bb4c3307..00000000000 --- a/apps/files_versions/js/versions.js +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright (c) 2014 - * - * This file is licensed under the Affero General Public License version 3 - * or later. - * - * See the COPYING-README file. - * - */ - -/* global scanFiles, escapeHTML, formatDate */ -$(document).ready(function(){ - - // TODO: namespace all this as OCA.FileVersions - - if ($('#isPublic').val()){ - // no versions actions in public mode - // beware of https://github.com/owncloud/core/issues/4545 - // as enabling this might hang Chrome - return; - } - - if (OCA.Files) { - // Add versions button to 'files/index.php' - OCA.Files.fileActions.register( - 'file', - 'Versions', - OC.PERMISSION_UPDATE, - function() { - // Specify icon for hitory button - return OC.imagePath('core','actions/history'); - }, function(filename, context){ - // Action to perform when clicked - if (scanFiles.scanning){return;}//workaround to prevent additional http request block scanning feedback - - var file = context.dir.replace(/(?!<=\/)$|\/$/, '/' + filename); - var createDropDown = true; - // Check if drop down is already visible for a different file - if (($('#dropdown').length > 0) ) { - if ( $('#dropdown').hasClass('drop-versions') && file == $('#dropdown').data('file')) { - createDropDown = false; - } - $('#dropdown').slideUp(OC.menuSpeed); - $('#dropdown').remove(); - $('tr').removeClass('mouseOver'); - } - - if(createDropDown === true) { - createVersionsDropdown(filename, file, context.fileList); - } - }, t('files_versions', 'Versions') - ); - } - - $(document).on("click", 'span[class="revertVersion"]', function() { - var revision = $(this).attr('id'); - var file = $(this).attr('value'); - revertFile(file, revision); - }); - -}); - -function revertFile(file, revision) { - - $.ajax({ - type: 'GET', - url: OC.linkTo('files_versions', 'ajax/rollbackVersion.php'), - dataType: 'json', - data: {file: file, revision: revision}, - async: false, - success: function(response) { - if (response.status === 'error') { - OC.Notification.show( t('files_version', 'Failed to revert {file} to revision {timestamp}.', {file:file, timestamp:formatDate(revision * 1000)}) ); - } else { - $('#dropdown').slideUp(OC.menuSpeed, function() { - $('#dropdown').closest('tr').find('.modified:first').html(relative_modified_date(revision)); - $('#dropdown').remove(); - $('tr').removeClass('mouseOver'); - }); - } - } - }); - -} - -function goToVersionPage(url){ - window.location.assign(url); -} - -function createVersionsDropdown(filename, files, fileList) { - - var start = 0; - var fileEl; - - var html = '