Added sharing overview page (WIP)
- added sharing overview entries in the sidebar - use OCS Share API to get the list of files
This commit is contained in:
parent
dbbb6c5945
commit
6ebc436505
|
@ -515,6 +515,7 @@
|
||||||
type = fileData.type || 'file',
|
type = fileData.type || 'file',
|
||||||
mtime = parseInt(fileData.mtime, 10) || new Date().getTime(),
|
mtime = parseInt(fileData.mtime, 10) || new Date().getTime(),
|
||||||
mime = fileData.mimetype,
|
mime = fileData.mimetype,
|
||||||
|
path = fileData.path || this.getCurrentDirectory(),
|
||||||
linkUrl;
|
linkUrl;
|
||||||
options = options || {};
|
options = options || {};
|
||||||
|
|
||||||
|
@ -550,10 +551,10 @@
|
||||||
|
|
||||||
// linkUrl
|
// linkUrl
|
||||||
if (type === 'dir') {
|
if (type === 'dir') {
|
||||||
linkUrl = this.linkTo(this.getCurrentDirectory() + '/' + name);
|
linkUrl = this.linkTo(path + '/' + name);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
linkUrl = this.getDownloadUrl(name, this.getCurrentDirectory());
|
linkUrl = this.getDownloadUrl(name, path);
|
||||||
}
|
}
|
||||||
td.append('<input id="select-' + this.id + '-' + fileData.id +
|
td.append('<input id="select-' + this.id + '-' + fileData.id +
|
||||||
'" type="checkbox" /><label for="select-' + this.id + '-' + fileData.id + '"></label>');
|
'" type="checkbox" /><label for="select-' + this.id + '-' + fileData.id + '"></label>');
|
||||||
|
@ -693,6 +694,7 @@
|
||||||
options = options || {};
|
options = options || {};
|
||||||
var type = fileData.type || 'file',
|
var type = fileData.type || 'file',
|
||||||
mime = fileData.mimetype,
|
mime = fileData.mimetype,
|
||||||
|
path = fileData.path || this.getCurrentDirectory(),
|
||||||
permissions = parseInt(fileData.permissions, 10) || 0;
|
permissions = parseInt(fileData.permissions, 10) || 0;
|
||||||
|
|
||||||
if (fileData.isShareMountPoint) {
|
if (fileData.isShareMountPoint) {
|
||||||
|
@ -729,7 +731,7 @@
|
||||||
// lazy load / newly inserted td ?
|
// lazy load / newly inserted td ?
|
||||||
if (!fileData.icon) {
|
if (!fileData.icon) {
|
||||||
this.lazyLoadPreview({
|
this.lazyLoadPreview({
|
||||||
path: this.getCurrentDirectory() + '/' + fileData.name,
|
path: path + '/' + fileData.name,
|
||||||
mime: mime,
|
mime: mime,
|
||||||
etag: fileData.etag,
|
etag: fileData.etag,
|
||||||
callback: function(url) {
|
callback: function(url) {
|
||||||
|
@ -740,7 +742,7 @@
|
||||||
else {
|
else {
|
||||||
// set the preview URL directly
|
// set the preview URL directly
|
||||||
var urlSpec = {
|
var urlSpec = {
|
||||||
file: this.getCurrentDirectory() + '/' + fileData.name,
|
file: path + '/' + fileData.name,
|
||||||
c: fileData.etag
|
c: fileData.etag
|
||||||
};
|
};
|
||||||
var previewUrl = this.generatePreviewUrl(urlSpec);
|
var previewUrl = this.generatePreviewUrl(urlSpec);
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
<?php
|
<?php
|
||||||
|
$l = OC_L10N::get('files_sharing');
|
||||||
|
|
||||||
OC::$CLASSPATH['OC_Share_Backend_File'] = 'files_sharing/lib/share/file.php';
|
OC::$CLASSPATH['OC_Share_Backend_File'] = 'files_sharing/lib/share/file.php';
|
||||||
OC::$CLASSPATH['OC_Share_Backend_Folder'] = 'files_sharing/lib/share/folder.php';
|
OC::$CLASSPATH['OC_Share_Backend_Folder'] = 'files_sharing/lib/share/folder.php';
|
||||||
|
@ -21,3 +22,22 @@ OCP\Util::addScript('files_sharing', 'share');
|
||||||
\OC_Hook::connect('OC_Appconfig', 'post_set_value', '\OCA\Files\Share\Maintainer', 'configChangeHook');
|
\OC_Hook::connect('OC_Appconfig', 'post_set_value', '\OCA\Files\Share\Maintainer', 'configChangeHook');
|
||||||
|
|
||||||
OC_FileProxy::register(new OCA\Files\Share\Proxy());
|
OC_FileProxy::register(new OCA\Files\Share\Proxy());
|
||||||
|
|
||||||
|
\OCA\Files\App::getNavigationManager()->add(
|
||||||
|
array(
|
||||||
|
"id" => 'sharingin',
|
||||||
|
"appname" => 'files_sharing',
|
||||||
|
"script" => 'list.php',
|
||||||
|
"order" => 3,
|
||||||
|
"name" => $l->t('Shared with you')
|
||||||
|
)
|
||||||
|
);
|
||||||
|
\OCA\Files\App::getNavigationManager()->add(
|
||||||
|
array(
|
||||||
|
"id" => 'sharingout',
|
||||||
|
"appname" => 'files_sharing',
|
||||||
|
"script" => 'list.php',
|
||||||
|
"order" => 4,
|
||||||
|
"name" => $l->t('Shared with others')
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
#filestable.shareList .summary .filesize {
|
||||||
|
display: none;
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
OCA.Sharing = {};
|
||||||
|
OCA.Sharing.App = {
|
||||||
|
|
||||||
|
_inFileList: null,
|
||||||
|
_outFileList: null,
|
||||||
|
|
||||||
|
initSharingIn: function($el) {
|
||||||
|
if (this._inFileList) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._inFileList = new OCA.Sharing.FileList(
|
||||||
|
$el,
|
||||||
|
{
|
||||||
|
scrollContainer: $('#app-content'),
|
||||||
|
sharedWithUser: true
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
var fileActions = _.extend({}, OCA.Files.FileActions);
|
||||||
|
fileActions.registerDefaultActions(this._inFileList);
|
||||||
|
this._inFileList.setFileActions(fileActions);
|
||||||
|
},
|
||||||
|
|
||||||
|
initSharingOut: function($el) {
|
||||||
|
if (this._outFileList) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._outFileList = new OCA.Sharing.FileList(
|
||||||
|
$el,
|
||||||
|
{
|
||||||
|
scrollContainer: $('#app-content'),
|
||||||
|
sharedWithUser: false
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
var fileActions = _.extend({}, OCA.Files.FileActions);
|
||||||
|
fileActions.registerDefaultActions(this._outFileList);
|
||||||
|
this._outFileList.setFileActions(fileActions);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
$('#app-content-sharingin').one('show', function(e) {
|
||||||
|
OCA.Sharing.App.initSharingIn($(e.target));
|
||||||
|
});
|
||||||
|
$('#app-content-sharingout').one('show', function(e) {
|
||||||
|
OCA.Sharing.App.initSharingOut($(e.target));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
|
@ -0,0 +1,190 @@
|
||||||
|
/*
|
||||||
|
* 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() {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sharing file list
|
||||||
|
*
|
||||||
|
* Contains both "shared with others" and "shared with you" modes.
|
||||||
|
*/
|
||||||
|
var FileList = function($el, options) {
|
||||||
|
this.initialize($el, options);
|
||||||
|
};
|
||||||
|
|
||||||
|
FileList.prototype = _.extend({}, OCA.Files.FileList.prototype, {
|
||||||
|
appName: 'Shares',
|
||||||
|
|
||||||
|
SHARE_TYPE_TEXT: [
|
||||||
|
t('files_sharing', 'User'),
|
||||||
|
t('files_sharing', 'Group'),
|
||||||
|
t('files_sharing', 'Unknown'),
|
||||||
|
t('files_sharing', 'Public')
|
||||||
|
],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether the list shows the files shared with the user (true) or
|
||||||
|
* the files that the user shared with others (false).
|
||||||
|
*/
|
||||||
|
_sharedWithUser: false,
|
||||||
|
|
||||||
|
initialize: function($el, options) {
|
||||||
|
OCA.Files.FileList.prototype.initialize.apply(this, arguments);
|
||||||
|
if (this.initialized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options && options.sharedWithUser) {
|
||||||
|
this._sharedWithUser = true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare two shares
|
||||||
|
* @param share1 first share
|
||||||
|
* @param share2 second share
|
||||||
|
* @return 1 if share2 should come before share1, -1
|
||||||
|
* if share1 should come before share2, 0 if they
|
||||||
|
* are identical.
|
||||||
|
*/
|
||||||
|
_shareCompare: function(share1, share2) {
|
||||||
|
var result = OCA.Files.FileList.Comparators.name(share1, share2);
|
||||||
|
if (result === 0) {
|
||||||
|
return share2.shareType - share1.shareType;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
},
|
||||||
|
|
||||||
|
_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').remove();
|
||||||
|
var $sharedWith = $('<td class="sharedWith"></td>').text(fileData.shareWithDisplayName);
|
||||||
|
var $shareType = $('<td class="shareType"></td>').text(this.SHARE_TYPE_TEXT[fileData.shareType] ||
|
||||||
|
t('files_sharing', 'Unkown'));
|
||||||
|
$tr.find('td.date').before($sharedWith).before($shareType);
|
||||||
|
$tr.find('td.filename input:checkbox').remove();
|
||||||
|
$tr.attr('data-path', fileData.path);
|
||||||
|
return $tr;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set whether the list should contain outgoing shares
|
||||||
|
* or incoming shares.
|
||||||
|
*
|
||||||
|
* @param state true for incoming shares, false otherwise
|
||||||
|
*/
|
||||||
|
setSharedWithUser: function(state) {
|
||||||
|
this._sharedWithUser = !!state;
|
||||||
|
},
|
||||||
|
|
||||||
|
reload: function() {
|
||||||
|
var self = this;
|
||||||
|
this.showMask();
|
||||||
|
if (this._reloadCall) {
|
||||||
|
this._reloadCall.abort();
|
||||||
|
}
|
||||||
|
this._reloadCall = $.ajax({
|
||||||
|
url: OC.linkToOCS('apps/files_sharing/api/v1') + 'shares',
|
||||||
|
/* jshint camelcase: false */
|
||||||
|
data: {
|
||||||
|
format: 'json',
|
||||||
|
shared_with_me: !!this._sharedWithUser
|
||||||
|
},
|
||||||
|
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();
|
||||||
|
|
||||||
|
this.$el.find('#headerSharedWith').text(
|
||||||
|
t('files_sharing', this._sharedWithUser ? 'Shared by' : 'Shared with')
|
||||||
|
);
|
||||||
|
if (result.ocs && result.ocs.data) {
|
||||||
|
this.setFiles(this._makeFilesFromShares(result.ocs.data));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// TODO: error handling
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
render: function() {
|
||||||
|
// FIXME
|
||||||
|
/*
|
||||||
|
var $el = $('<thead><tr>' +
|
||||||
|
'<th>' + t('files', 'Name') + '</th>' +
|
||||||
|
'<th>' + t('files', 'Shared with') + '</th>' +
|
||||||
|
'<th>' + t('files', 'Type') + '</th>' +
|
||||||
|
'<th>' + t('files', 'Shared since') + '</th>' +
|
||||||
|
'</tr></thead>' +
|
||||||
|
'<tbody class="fileList"></tbody>' +
|
||||||
|
'<tfoot></tfoot>');
|
||||||
|
this.$el.empty().append($el);
|
||||||
|
this.$fileList = this.$el.find('tbody');
|
||||||
|
*/
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts the OCS API share response data to a file info
|
||||||
|
* list
|
||||||
|
* @param OCS API share array
|
||||||
|
* @return array of file info maps
|
||||||
|
*/
|
||||||
|
_makeFilesFromShares: function(data) {
|
||||||
|
var self = this;
|
||||||
|
// OCS API uses non-camelcased names
|
||||||
|
/* jshint camelcase: false */
|
||||||
|
var files = _.map(data, function(share) {
|
||||||
|
var file = {
|
||||||
|
id: share.id,
|
||||||
|
mtime: share.stime * 1000,
|
||||||
|
permissions: share.permissions
|
||||||
|
};
|
||||||
|
if (share.item_type === 'folder') {
|
||||||
|
file.type = 'dir';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
file.type = 'file';
|
||||||
|
// force preview retrieval as we don't have mime types,
|
||||||
|
// the preview endpoint will fall back to the mime type
|
||||||
|
// icon if no preview exists
|
||||||
|
file.isPreviewAvailable = true;
|
||||||
|
file.icon = true;
|
||||||
|
}
|
||||||
|
file.shareType = share.share_type;
|
||||||
|
file.shareWith = share.share_with;
|
||||||
|
if (self._sharedWithUser) {
|
||||||
|
file.shareWithDisplayName = share.displayname_owner;
|
||||||
|
file.name = OC.basename(share.file_target);
|
||||||
|
file.path = OC.dirname(share.file_target);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
file.shareWithDisplayName = share.share_with_displayname;
|
||||||
|
file.name = OC.basename(share.path);
|
||||||
|
file.path = OC.dirname(share.path);
|
||||||
|
}
|
||||||
|
return file;
|
||||||
|
});
|
||||||
|
return files.sort(this._shareCompare);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
OCA.Sharing.FileList = FileList;
|
||||||
|
})();
|
|
@ -0,0 +1,11 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// Check if we are a user
|
||||||
|
OCP\User::checkLoggedIn();
|
||||||
|
|
||||||
|
$tmpl = new OCP\Template('files_sharing', 'list', '');
|
||||||
|
|
||||||
|
OCP\Util::addScript('files_sharing', 'app');
|
||||||
|
OCP\Util::addScript('files_sharing', 'sharedfilelist');
|
||||||
|
|
||||||
|
$tmpl->printPage();
|
|
@ -0,0 +1,43 @@
|
||||||
|
<?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('Nothing in here.'))?></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">
|
||||||
|
<input type="checkbox" id="select_all_trash" class="select-all"/>
|
||||||
|
<label for="select_all_trash"></label>
|
||||||
|
<a class="name sort columntitle" data-sort="name"><span><?php p($l->t( 'Name' )); ?></span><span class="sort-indicator"></span></a>
|
||||||
|
<span id="selectedActionsList" class='selectedActions'>
|
||||||
|
<a href="" class="undelete">
|
||||||
|
<img class="svg" alt="<?php p($l->t( 'Restore' )); ?>"
|
||||||
|
src="<?php print_unescaped(OCP\image_path("core", "actions/history.svg")); ?>" />
|
||||||
|
<?php p($l->t('Restore'))?>
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
<th id="headerSharedWith" class="hidden column-mtime">
|
||||||
|
<a id="sharedwith" class="columntitle" data-sort="shareWith"><span><?php p($l->t( 'Shared with' )); ?></span><span class="sort-indicator"></span></a>
|
||||||
|
</th>
|
||||||
|
<th id="headerSharedWith" class="hidden column-mtime">
|
||||||
|
<a id="shareType" class="columntitle" data-sort="shareType"><span><?php p($l->t( 'Type' )); ?></span><span class="sort-indicator"></span></a>
|
||||||
|
</th>
|
||||||
|
<th id="headerDate" class="hidden column-mtime">
|
||||||
|
<a id="modified" class="columntitle" data-sort="mtime"><span><?php p($l->t( 'Shared since' )); ?></span><span class="sort-indicator"></span></a>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody id="fileList">
|
||||||
|
</tbody>
|
||||||
|
<tfoot>
|
||||||
|
</tfoot>
|
||||||
|
</table>
|
|
@ -212,6 +212,15 @@ var OC={
|
||||||
return window.location.protocol + '//' + window.location.host + OC.linkToRemoteBase(service);
|
return window.location.protocol + '//' + window.location.host + OC.linkToRemoteBase(service);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the base path for the given OCS API service.
|
||||||
|
* @param {string} service name
|
||||||
|
* @return {string} OCS API base path
|
||||||
|
*/
|
||||||
|
linkToOCS: function(service) {
|
||||||
|
return window.location.protocol + '//' + window.location.host + OC.webroot + '/ocs/v1.php/' + service + '/';
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates the absolute url for the given relative url, which can contain parameters.
|
* Generates the absolute url for the given relative url, which can contain parameters.
|
||||||
* @param {string} url
|
* @param {string} url
|
||||||
|
|
Loading…
Reference in New Issue