Add pending share list to frontend
Signed-off-by: Julius Härtl <jus@bitgrid.net> Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
This commit is contained in:
parent
fbed6a3416
commit
445274cf93
8 changed files with 146 additions and 6 deletions
|
@ -129,6 +129,7 @@
|
||||||
}
|
}
|
||||||
.nav-icon-sharingin,
|
.nav-icon-sharingin,
|
||||||
.nav-icon-sharingout,
|
.nav-icon-sharingout,
|
||||||
|
.nav-icon-pendingshares,
|
||||||
.nav-icon-shareoverview {
|
.nav-icon-shareoverview {
|
||||||
@include icon-color('share', 'files', $color-black);
|
@include icon-color('share', 'files', $color-black);
|
||||||
}
|
}
|
||||||
|
|
|
@ -288,6 +288,13 @@ class ViewControllerTest extends TestCase {
|
||||||
'order' => 19,
|
'order' => 19,
|
||||||
'name' => \OC::$server->getL10N('files_sharing')->t('Deleted shares'),
|
'name' => \OC::$server->getL10N('files_sharing')->t('Deleted shares'),
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
'id' => 'pendingshares',
|
||||||
|
'appname' => 'files_sharing',
|
||||||
|
'script' => 'list.php',
|
||||||
|
'order' => 19,
|
||||||
|
'name' => \OC::$server->getL10N('files_sharing')->t('Pending shares'),
|
||||||
|
],
|
||||||
],
|
],
|
||||||
'active' => false,
|
'active' => false,
|
||||||
'icon' => '',
|
'icon' => '',
|
||||||
|
@ -348,6 +355,10 @@ class ViewControllerTest extends TestCase {
|
||||||
'id' => 'deletedshares',
|
'id' => 'deletedshares',
|
||||||
'content' => null,
|
'content' => null,
|
||||||
],
|
],
|
||||||
|
'pendingshares' => [
|
||||||
|
'id' => 'pendingshares',
|
||||||
|
'content' => null
|
||||||
|
],
|
||||||
'shareoverview' => [
|
'shareoverview' => [
|
||||||
'id' => 'shareoverview',
|
'id' => 'shareoverview',
|
||||||
'content' => null,
|
'content' => null,
|
||||||
|
|
|
@ -22,6 +22,7 @@ OCA.Sharing.App = {
|
||||||
_inFileList: null,
|
_inFileList: null,
|
||||||
_outFileList: null,
|
_outFileList: null,
|
||||||
_overviewFileList: null,
|
_overviewFileList: null,
|
||||||
|
_pendingFileList: null,
|
||||||
|
|
||||||
initSharingIn: function($el) {
|
initSharingIn: function($el) {
|
||||||
if (this._inFileList) {
|
if (this._inFileList) {
|
||||||
|
@ -129,6 +130,33 @@ OCA.Sharing.App = {
|
||||||
return this._deletedFileList
|
return this._deletedFileList
|
||||||
},
|
},
|
||||||
|
|
||||||
|
initSharingPening: function($el) {
|
||||||
|
if (this._pendingFileList) {
|
||||||
|
return this._pendingFileList
|
||||||
|
}
|
||||||
|
this._pendingFileList = new OCA.Sharing.FileList(
|
||||||
|
$el,
|
||||||
|
{
|
||||||
|
id: 'shares.pending',
|
||||||
|
showPending: true,
|
||||||
|
sharedWithUser: true,
|
||||||
|
fileActions: this._acceptShareAction(),
|
||||||
|
config: OCA.Files.App.getFilesConfig(),
|
||||||
|
// The file list is created when a "show" event is handled, so
|
||||||
|
// it should be marked as "shown" like it would have been done
|
||||||
|
// if handling the event with the file list already created.
|
||||||
|
shown: true,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
this._extendFileList(this._pendingFileList)
|
||||||
|
this._pendingFileList.appName = t('files_sharing', 'Pending shares')
|
||||||
|
this._pendingFileList.$el.find('#emptycontent').html('<div class="icon-share"></div>'
|
||||||
|
+ '<h2>' + t('files_sharing', 'No pending shares') + '</h2>'
|
||||||
|
+ '<p>' + t('files_sharing', 'Shares you have received but not confirmed will show up here') + '</p>')
|
||||||
|
return this._pendingFileList
|
||||||
|
},
|
||||||
|
|
||||||
initShareingOverview: function($el) {
|
initShareingOverview: function($el) {
|
||||||
if (this._overviewFileList) {
|
if (this._overviewFileList) {
|
||||||
return this._overviewFileList
|
return this._overviewFileList
|
||||||
|
@ -178,6 +206,12 @@ OCA.Sharing.App = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
removeSharingPending: function() {
|
||||||
|
if (this._pendingFileList) {
|
||||||
|
this._pendingFileList.$fileList.empty()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
removeSharingOverview: function() {
|
removeSharingOverview: function() {
|
||||||
if (this._overviewFileList) {
|
if (this._overviewFileList) {
|
||||||
this._overviewFileList.$fileList.empty()
|
this._overviewFileList.$fileList.empty()
|
||||||
|
@ -249,6 +283,47 @@ OCA.Sharing.App = {
|
||||||
return fileActions
|
return fileActions
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_acceptShareAction: function() {
|
||||||
|
const fileActions = new OCA.Files.FileActions()
|
||||||
|
fileActions.registerAction({
|
||||||
|
name: 'Accept share',
|
||||||
|
displayName: t('files_sharing', 'Accept share'),
|
||||||
|
mime: 'all',
|
||||||
|
permissions: OC.PERMISSION_ALL,
|
||||||
|
iconClass: 'icon-checkmark',
|
||||||
|
type: OCA.Files.FileActions.TYPE_INLINE,
|
||||||
|
actionHandler: function(fileName, context) {
|
||||||
|
const shareId = context.$file.data('shareId')
|
||||||
|
$.post(OC.linkToOCS('apps/files_sharing/api/v1/shares/pending', 2) + shareId)
|
||||||
|
.success(function(result) {
|
||||||
|
context.fileList.remove(context.fileInfoModel.attributes.name)
|
||||||
|
}).fail(function() {
|
||||||
|
OC.Notification.showTemporary(t('files_sharing', 'Something happened. Unable to accept the share.'))
|
||||||
|
})
|
||||||
|
},
|
||||||
|
})
|
||||||
|
fileActions.registerAction({
|
||||||
|
name: 'Reject share',
|
||||||
|
displayName: t('files_sharing', 'Reject share'),
|
||||||
|
mime: 'all',
|
||||||
|
permissions: OC.PERMISSION_ALL,
|
||||||
|
iconClass: 'icon-close',
|
||||||
|
type: OCA.Files.FileActions.TYPE_INLINE,
|
||||||
|
actionHandler: function(fileName, context) {
|
||||||
|
const shareId = context.$file.data('shareId')
|
||||||
|
$.ajax({
|
||||||
|
url: OC.linkToOCS('apps/files_sharing/api/v1/shares', 2) + shareId,
|
||||||
|
type: 'DELETE',
|
||||||
|
}).success(function(result) {
|
||||||
|
context.fileList.remove(context.fileInfoModel.attributes.name)
|
||||||
|
}).fail(function() {
|
||||||
|
OC.Notification.showTemporary(t('files_sharing', 'Something happened. Unable to reject the share.'))
|
||||||
|
})
|
||||||
|
},
|
||||||
|
})
|
||||||
|
return fileActions
|
||||||
|
},
|
||||||
|
|
||||||
_onActionsUpdated: function(ev) {
|
_onActionsUpdated: function(ev) {
|
||||||
_.each([this._inFileList, this._outFileList, this._linkFileList], function(list) {
|
_.each([this._inFileList, this._outFileList, this._linkFileList], function(list) {
|
||||||
if (!list) {
|
if (!list) {
|
||||||
|
@ -297,6 +372,12 @@ $(document).ready(function() {
|
||||||
$('#app-content-deletedshares').on('hide', function() {
|
$('#app-content-deletedshares').on('hide', function() {
|
||||||
OCA.Sharing.App.removeSharingDeleted()
|
OCA.Sharing.App.removeSharingDeleted()
|
||||||
})
|
})
|
||||||
|
$('#app-content-pendingshares').on('show', function(e) {
|
||||||
|
OCA.Sharing.App.initSharingPening($(e.target))
|
||||||
|
})
|
||||||
|
$('#app-content-pendingshares').on('hide', function() {
|
||||||
|
OCA.Sharing.App.removeSharingPending()
|
||||||
|
})
|
||||||
$('#app-content-shareoverview').on('show', function(e) {
|
$('#app-content-shareoverview').on('show', function(e) {
|
||||||
OCA.Sharing.App.initShareingOverview($(e.target))
|
OCA.Sharing.App.initShareingOverview($(e.target))
|
||||||
})
|
})
|
||||||
|
|
BIN
apps/files_sharing/js/dist/files_sharing.js
vendored
BIN
apps/files_sharing/js/dist/files_sharing.js
vendored
Binary file not shown.
BIN
apps/files_sharing/js/dist/files_sharing.js.map
vendored
BIN
apps/files_sharing/js/dist/files_sharing.js.map
vendored
Binary file not shown.
|
@ -39,6 +39,7 @@
|
||||||
_sharedWithUser: false,
|
_sharedWithUser: false,
|
||||||
_linksOnly: false,
|
_linksOnly: false,
|
||||||
_showDeleted: false,
|
_showDeleted: false,
|
||||||
|
_showPending: false,
|
||||||
_clientSideSort: true,
|
_clientSideSort: true,
|
||||||
_allowSelection: false,
|
_allowSelection: false,
|
||||||
_isOverview: false,
|
_isOverview: false,
|
||||||
|
@ -62,6 +63,9 @@
|
||||||
if (options && options.showDeleted) {
|
if (options && options.showDeleted) {
|
||||||
this._showDeleted = true
|
this._showDeleted = true
|
||||||
}
|
}
|
||||||
|
if (options && options.showPending) {
|
||||||
|
this._showPending = true
|
||||||
|
}
|
||||||
if (options && options.isOverview) {
|
if (options && options.isOverview) {
|
||||||
this._isOverview = true
|
this._isOverview = true
|
||||||
}
|
}
|
||||||
|
@ -87,7 +91,7 @@
|
||||||
var permission = parseInt($tr.attr('data-permissions')) | OC.PERMISSION_DELETE
|
var permission = parseInt($tr.attr('data-permissions')) | OC.PERMISSION_DELETE
|
||||||
$tr.attr('data-permissions', permission)
|
$tr.attr('data-permissions', permission)
|
||||||
}
|
}
|
||||||
if (this._showDeleted) {
|
if (this._showDeleted || this._showPending) {
|
||||||
var permission = fileData.permissions
|
var permission = fileData.permissions
|
||||||
$tr.attr('data-share-permissions', permission)
|
$tr.attr('data-share-permissions', permission)
|
||||||
}
|
}
|
||||||
|
@ -196,6 +200,18 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var pendingShares = {
|
||||||
|
url: OC.linkToOCS('apps/files_sharing/api/v1/shares', 2) + 'pending',
|
||||||
|
/* jshint camelcase: false */
|
||||||
|
data: {
|
||||||
|
format: 'json'
|
||||||
|
},
|
||||||
|
type: 'GET',
|
||||||
|
beforeSend: function(xhr) {
|
||||||
|
xhr.setRequestHeader('OCS-APIREQUEST', 'true')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var shares = {
|
var shares = {
|
||||||
url: OC.linkToOCS('apps/files_sharing/api/v1') + 'shares',
|
url: OC.linkToOCS('apps/files_sharing/api/v1') + 'shares',
|
||||||
/* jshint camelcase: false */
|
/* jshint camelcase: false */
|
||||||
|
@ -227,6 +243,8 @@
|
||||||
// and make sure we have 2 promises
|
// and make sure we have 2 promises
|
||||||
if (this._showDeleted) {
|
if (this._showDeleted) {
|
||||||
promises.push($.ajax(deletedShares))
|
promises.push($.ajax(deletedShares))
|
||||||
|
} else if (this._showPending) {
|
||||||
|
promises.push($.ajax(pendingShares))
|
||||||
} else {
|
} else {
|
||||||
promises.push($.ajax(shares))
|
promises.push($.ajax(shares))
|
||||||
|
|
||||||
|
|
|
@ -278,6 +278,15 @@ class Application extends App {
|
||||||
'name' => $l->t('Deleted shares'),
|
'name' => $l->t('Deleted shares'),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
array_push($sharingSublistArray, [
|
||||||
|
'id' => 'pendingshares',
|
||||||
|
'appname' => 'files_sharing',
|
||||||
|
'script' => 'list.php',
|
||||||
|
'order' => 19,
|
||||||
|
'name' => $l->t('Pending shares'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
|
||||||
// show_Quick_Access stored as string
|
// show_Quick_Access stored as string
|
||||||
\OCA\Files\App::getNavigationManager()->add([
|
\OCA\Files\App::getNavigationManager()->add([
|
||||||
'id' => 'shareoverview',
|
'id' => 'shareoverview',
|
||||||
|
|
|
@ -1100,11 +1100,31 @@ class ShareAPIController extends OCSController {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$result = array_map(function (IShare $share) {
|
$result = array_filter(array_map(function (IShare $share) {
|
||||||
return [
|
$userFolder = $this->rootFolder->getUserFolder($share->getSharedBy());
|
||||||
'id' => $share->getFullId(),
|
$nodes = $userFolder->getById($share->getNodeId());
|
||||||
];
|
if (empty($nodes)) {
|
||||||
}, $pendingShares);
|
// fallback to guessing the path
|
||||||
|
$node = $userFolder->get($share->getTarget());
|
||||||
|
if ($node === null || $share->getTarget() === '') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$node = $nodes[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$formattedShare = $this->formatShare($share, $node);
|
||||||
|
$formattedShare['status'] = $share->getStatus();
|
||||||
|
$formattedShare['path'] = $share->getNode()->getName();
|
||||||
|
$formattedShare['permissions'] = 0;
|
||||||
|
return $formattedShare;
|
||||||
|
} catch (NotFoundException $e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}, $pendingShares), function ($entry) {
|
||||||
|
return $entry !== null;
|
||||||
|
});
|
||||||
|
|
||||||
return new DataResponse($result);
|
return new DataResponse($result);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue