parent
933c05566e
commit
01c2c3107a
@ -0,0 +1,27 @@ |
||||
<?php |
||||
/** |
||||
* ownCloud - External Storage Routes |
||||
* |
||||
* @author Vincent Petry |
||||
* @copyright 2014 Vincent Petry <pvince81@owncloud.com> |
||||
* |
||||
* This library is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
* License as published by the Free Software Foundation; either |
||||
* version 3 of the License, or any later version. |
||||
* |
||||
* This library is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public |
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
|
||||
OC_API::register('get', |
||||
'/apps/files_external/api/v1/mounts', |
||||
array('\OCA\Files\External\Api', 'getUserMounts'), |
||||
'files_external'); |
||||
|
||||
@ -0,0 +1,71 @@ |
||||
/* |
||||
* Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com> |
||||
* |
||||
* This file is licensed under the Affero General Public License version 3 |
||||
* or later. |
||||
* |
||||
* See the COPYING-README file. |
||||
* |
||||
*/ |
||||
|
||||
if (!OCA.External) { |
||||
OCA.External = {}; |
||||
} |
||||
OCA.External.App = { |
||||
|
||||
fileList: null, |
||||
|
||||
initList: function($el) { |
||||
if (this.fileList) { |
||||
return this.fileList; |
||||
} |
||||
|
||||
this.fileList = new OCA.External.FileList( |
||||
$el, |
||||
{ |
||||
scrollContainer: $('#app-content'), |
||||
fileActions: this._createFileActions() |
||||
} |
||||
); |
||||
|
||||
this._extendFileList(this.fileList); |
||||
this.fileList.appName = t('files_external', 'External storage'); |
||||
return this.fileList; |
||||
}, |
||||
|
||||
removeList: function() { |
||||
if (this.fileList) { |
||||
this.fileList.$fileList.empty(); |
||||
} |
||||
}, |
||||
|
||||
_createFileActions: function() { |
||||
// inherit file actions from the files app
|
||||
var fileActions = new OCA.Files.FileActions(); |
||||
fileActions.registerDefaultActions(); |
||||
|
||||
// when the user clicks on a folder, redirect to the corresponding
|
||||
// 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); |
||||
}); |
||||
fileActions.setDefault('dir', 'Open'); |
||||
return fileActions; |
||||
}, |
||||
|
||||
_extendFileList: function(fileList) { |
||||
// remove size column from summary
|
||||
fileList.fileSummary.$el.find('.filesize').remove(); |
||||
} |
||||
}; |
||||
|
||||
$(document).ready(function() { |
||||
$('#app-content-extstoragemounts').on('show', function(e) { |
||||
OCA.External.App.initList($(e.target)); |
||||
}); |
||||
$('#app-content-extstoragemounts').on('hide', function() { |
||||
OCA.External.App.removeList(); |
||||
}); |
||||
}); |
||||
|
||||
@ -0,0 +1,116 @@ |
||||
/* |
||||
* Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com> |
||||
* |
||||
* This file is licensed under the Affero General Public License version 3 |
||||
* or later. |
||||
* |
||||
* See the COPYING-README file. |
||||
* |
||||
*/ |
||||
(function() { |
||||
|
||||
/** |
||||
* External storage file list |
||||
*/ |
||||
var FileList = function($el, options) { |
||||
this.initialize($el, options); |
||||
}; |
||||
|
||||
FileList.prototype = _.extend({}, OCA.Files.FileList.prototype, { |
||||
appName: 'External storage', |
||||
|
||||
initialize: function($el, options) { |
||||
OCA.Files.FileList.prototype.initialize.apply(this, arguments); |
||||
if (this.initialized) { |
||||
return; |
||||
} |
||||
}, |
||||
|
||||
_createRow: function(fileData) { |
||||
// TODO: hook earlier and render the whole row here
|
||||
var $tr = OCA.Files.FileList.prototype._createRow.apply(this, arguments); |
||||
$tr.find('.filesize,.date').remove(); |
||||
$tr.find('td.filename').after('<td></td>'); |
||||
$tr.find('td.filename input:checkbox').remove(); |
||||
return $tr; |
||||
}, |
||||
|
||||
updateEmptyContent: function() { |
||||
var dir = this.getCurrentDirectory(); |
||||
if (dir === '/') { |
||||
// root has special permissions
|
||||
this.$el.find('#emptycontent').toggleClass('hidden', !this.isEmpty); |
||||
this.$el.find('#filestable thead th').toggleClass('hidden', this.isEmpty); |
||||
} |
||||
else { |
||||
OCA.Files.FileList.prototype.updateEmptyContent.apply(this, arguments); |
||||
} |
||||
}, |
||||
|
||||
getDirectoryPermissions: function() { |
||||
return OC.PERMISSION_READ | OC.PERMISSION_DELETE; |
||||
}, |
||||
|
||||
updateStorageStatistics: function() { |
||||
// no op because it doesn't have
|
||||
// storage info like free space / used space
|
||||
}, |
||||
|
||||
reload: function() { |
||||
var self = this; |
||||
this.showMask(); |
||||
if (this._reloadCall) { |
||||
this._reloadCall.abort(); |
||||
} |
||||
this._reloadCall = $.ajax({ |
||||
url: OC.linkToOCS('apps/files_external/api/v1') + 'mounts', |
||||
data: { |
||||
format: 'json' |
||||
}, |
||||
type: 'GET', |
||||
beforeSend: function(xhr) { |
||||
xhr.setRequestHeader('OCS-APIREQUEST', 'true'); |
||||
}, |
||||
error: function(result) { |
||||
self.reloadCallback(result); |
||||
}, |
||||
success: function(result) { |
||||
self.reloadCallback(result); |
||||
} |
||||
}); |
||||
}, |
||||
|
||||
reloadCallback: function(result) { |
||||
delete this._reloadCall; |
||||
this.hideMask(); |
||||
|
||||
if (result.ocs && result.ocs.data) { |
||||
this.setFiles(this._makeFiles(result.ocs.data)); |
||||
} |
||||
else { |
||||
// TODO: error handling
|
||||
} |
||||
}, |
||||
|
||||
/** |
||||
* Converts the OCS API response data to a file info |
||||
* list |
||||
* @param OCS API mounts array |
||||
* @return array of file info maps |
||||
*/ |
||||
_makeFiles: function(data) { |
||||
var files = _.chain(data) |
||||
.map(function(fileData) { |
||||
fileData.icon = OC.imagePath('core', 'filetypes/folder-external'); |
||||
return fileData; |
||||
}) |
||||
// Sort by expected sort comparator
|
||||
.sortBy(this._sortComparator) |
||||
.value(); |
||||
|
||||
return files; |
||||
} |
||||
}); |
||||
|
||||
OCA.External.FileList = FileList; |
||||
})(); |
||||
@ -0,0 +1,64 @@ |
||||
<?php |
||||
/** |
||||
* ownCloud |
||||
* |
||||
* @author Vincent Petry |
||||
* @copyright 2014 Vincent Petry pvince81@owncloud.com |
||||
* |
||||
* This library is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
* License as published by the Free Software Foundation; either |
||||
* version 3 of the License, or any later version. |
||||
* |
||||
* This library is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public |
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
|
||||
namespace OCA\Files\External; |
||||
|
||||
class Api { |
||||
|
||||
/** |
||||
* Returns the mount points visible for this user. |
||||
* |
||||
* @param array $params |
||||
* @return \OC_OCS_Result share information |
||||
*/ |
||||
public static function getUserMounts($params) { |
||||
$entries = array(); |
||||
$user = \OC_User::getUser(); |
||||
$mounts = \OC_Mount_Config::getAbsoluteMountPoints($user); |
||||
|
||||
foreach ($mounts as $mountPoint => $config) { |
||||
// split user name from mount point |
||||
$parts = explode('/', ltrim($mountPoint, '/')); |
||||
array_shift($parts); // use name |
||||
array_shift($parts); // files |
||||
$mountPoint = implode('/', $parts); |
||||
|
||||
$path = dirname($mountPoint); |
||||
if ($path === '.') { |
||||
$path = ''; |
||||
} |
||||
|
||||
// TODO: give delete permissions if mount type is personal |
||||
$permissions = \OCP\PERMISSION_READ; |
||||
|
||||
// TODO: add storageType, might need to use another OC_Mount_Config method |
||||
$entries[] = array( |
||||
'name' => basename($mountPoint), |
||||
'path' => $path, |
||||
'type' => 'dir', |
||||
'permissions' => $permissions |
||||
); |
||||
} |
||||
|
||||
return new \OC_OCS_Result($entries); |
||||
} |
||||
} |
||||
@ -0,0 +1,11 @@ |
||||
<?php |
||||
|
||||
// Check if we are a user |
||||
OCP\User::checkLoggedIn(); |
||||
|
||||
$tmpl = new OCP\Template('files_external', 'list', ''); |
||||
|
||||
OCP\Util::addScript('files_external', 'app'); |
||||
OCP\Util::addScript('files_external', 'mountsfilelist'); |
||||
|
||||
$tmpl->printPage(); |
||||
@ -0,0 +1,25 @@ |
||||
<?php /** @var $l OC_L10N */ ?> |
||||
<div id="controls"> |
||||
<div id="file_action_panel"></div> |
||||
</div> |
||||
<div id='notification'></div> |
||||
|
||||
<div id="emptycontent" class="hidden"><?php p($l->t( 'You don\'t have any external storages' )); ?></div>
|
||||
|
||||
<input type="hidden" name="dir" value="" id="dir"> |
||||
|
||||
<table id="filestable"> |
||||
<thead> |
||||
<tr> |
||||
<th id='headerName' class="hidden column-name"> |
||||
<div id="headerName-container"> |
||||
<a class="name sort columntitle" data-sort="name"><span><?php p($l->t( 'Name' )); ?></span><span class="sort-indicator"></span></a>
|
||||
</div> |
||||
</th> |
||||
</tr> |
||||
</thead> |
||||
<tbody id="fileList"> |
||||
</tbody> |
||||
<tfoot> |
||||
</tfoot> |
||||
</table> |
||||
Loading…
Reference in new issue