From 445274cf93dbae31c6995008dcc0f9834c05d9ca Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Julius=20H=C3=A4rtl?= <jus@bitgrid.net>
Date: Tue, 7 Jan 2020 12:57:57 +0100
Subject: [PATCH] Add pending share list to frontend
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Julius Härtl <jus@bitgrid.net>
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
---
 apps/files/css/files.scss                     |   1 +
 .../tests/Controller/ViewControllerTest.php   |  11 +++
 apps/files_sharing/js/app.js                  |  81 ++++++++++++++++++
 apps/files_sharing/js/dist/files_sharing.js   | Bin 13316 -> 15666 bytes
 .../js/dist/files_sharing.js.map              | Bin 45678 -> 51206 bytes
 apps/files_sharing/js/sharedfilelist.js       |  20 ++++-
 .../files_sharing/lib/AppInfo/Application.php |   9 ++
 .../lib/Controller/ShareAPIController.php     |  30 +++++--
 8 files changed, 146 insertions(+), 6 deletions(-)

diff --git a/apps/files/css/files.scss b/apps/files/css/files.scss
index 40248360c29..bedca77a6f7 100644
--- a/apps/files/css/files.scss
+++ b/apps/files/css/files.scss
@@ -129,6 +129,7 @@
 }
 .nav-icon-sharingin,
 .nav-icon-sharingout,
+.nav-icon-pendingshares,
 .nav-icon-shareoverview {
 	@include icon-color('share', 'files', $color-black);
 }
diff --git a/apps/files/tests/Controller/ViewControllerTest.php b/apps/files/tests/Controller/ViewControllerTest.php
index fd6ec5aaa3c..f07af2a2fe5 100644
--- a/apps/files/tests/Controller/ViewControllerTest.php
+++ b/apps/files/tests/Controller/ViewControllerTest.php
@@ -288,6 +288,13 @@ class ViewControllerTest extends TestCase {
 						'order' => 19,
 						'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,
 				'icon' => '',
@@ -348,6 +355,10 @@ class ViewControllerTest extends TestCase {
 						'id' => 'deletedshares',
 						'content' => null,
 					],
+					'pendingshares' => [
+						'id' => 'pendingshares',
+						'content' => null
+					],
 					'shareoverview' => [
 						'id' => 'shareoverview',
 						'content' => null,
diff --git a/apps/files_sharing/js/app.js b/apps/files_sharing/js/app.js
index 6cf7a805ada..1a686ee228d 100644
--- a/apps/files_sharing/js/app.js
+++ b/apps/files_sharing/js/app.js
@@ -22,6 +22,7 @@ OCA.Sharing.App = {
 	_inFileList: null,
 	_outFileList: null,
 	_overviewFileList: null,
+	_pendingFileList: null,
 
 	initSharingIn: function($el) {
 		if (this._inFileList) {
@@ -129,6 +130,33 @@ OCA.Sharing.App = {
 		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) {
 		if (this._overviewFileList) {
 			return this._overviewFileList
@@ -178,6 +206,12 @@ OCA.Sharing.App = {
 		}
 	},
 
+	removeSharingPending: function() {
+		if (this._pendingFileList) {
+			this._pendingFileList.$fileList.empty()
+		}
+	},
+
 	removeSharingOverview: function() {
 		if (this._overviewFileList) {
 			this._overviewFileList.$fileList.empty()
@@ -249,6 +283,47 @@ OCA.Sharing.App = {
 		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) {
 		_.each([this._inFileList, this._outFileList, this._linkFileList], function(list) {
 			if (!list) {
@@ -297,6 +372,12 @@ $(document).ready(function() {
 	$('#app-content-deletedshares').on('hide', function() {
 		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) {
 		OCA.Sharing.App.initShareingOverview($(e.target))
 	})
diff --git a/apps/files_sharing/js/dist/files_sharing.js b/apps/files_sharing/js/dist/files_sharing.js
index e89a4075e70d9640847db1b8a46e71ded47199e4..ee608f58f6c8139bd8b19030585da22709209185 100644
GIT binary patch
delta 963
zcmZ`%O;6NN6is0m<XfXKVHly)!c1SR9W*2)qZ35Ig(4_^EZmSsd!dDycGCA|5P`^o
zoiQffr3*u1)Rh?f19YVeet<C~?)(Az3+zl=GlMZ{n&#ZzbI&>V?wKDSe|Q!<u~Y`z
zu<TXuN$hS%hyQUKZ2yfvdXf`i>AF>fIg9ZrZdy!>8X`2WG{Knb9Z!UflFCeH!zZi_
z$fw7#w{0v=bsfqaC%YdGALA!#Gt*S(=y2F9GLyQ%q~pK*>ekys7ToR2$(v3^G-(w?
z7j&?yV2H~VF4_(kb;n+@+!7f0zE6&NyiYyPTPGudD-~PkmSZbqt4T=YG?Qt9v2>Dn
z^QT_NBTH}lA0(&i?gF`zYFMmXq?_}!1bN&~oQ?-&oE*5?p_`zum#Djry8|zJ1An>5
z%Sghz6$B-669PI-B4o#Zc8Cg^3#<M{z?}{hZ`rjG(ju&Z&i^|-DA%U9=|zWuKN;HS
z8hxbTP*zRl!jRRA<Q!A^X4z+)nVp-xH!JPnSmGd7Blo^1p2nj5aDV7h+>ftzFbAph
zU$`rExjjr3KPQu(nc_lM!!3B<&W;Hq4L~LnUQq+){T^O!X~bus2po*<?O+WJzY>J>
zmsYB}s7Z5!w6JhZyU(qnw&J)Y%4aAC#U_3gCAozbYMa1AX;5(Sr&JUuF3RTx*V~o9
zww`IsK#I0;C)<y&vU_+l`$n)anZ1Cr@^0cE6;q&<E6h|zwR)zUki60iF+5VP<ZKe1
xvBegu;8rcz@B?6)K{?gxOE8u;EN(89ppa&GgUA9y-+(XmB`Nqmsdq$3=O3mHR)7Ei

delta 236
zcmdl~)snHHmu2%}7FW*ADFQXjn;k@!ux+-HFJhUjpv1DdTBU?>^M6$Z#?2n;5ln(5
z8JWd;@x>YW<u0i?sU@i?laFa0V=mH3oZPSFBUxnY@2nSEl9{8ImS2>cSmKgclB$uX
z36%Y!rOa3~S&>6zvW~VSW8!2t?HnL~v$if{;^v3i$C)Pw8myYEY+y85*Kmc1Myg&x
zX>o>zie6$?VuePDrlyX@<OT!D$!bQ*62(9s#1)yv{$;5}WtpkvYHAuKlM{`^7(t}S
c<Q^k_AZw114rAWrlSa18c{+KUIgK^B0Nrv=6#xJL

diff --git a/apps/files_sharing/js/dist/files_sharing.js.map b/apps/files_sharing/js/dist/files_sharing.js.map
index 208ceb155b43f2e2f8ace596d642549230536cfd..447bb7f9afe975d695dfa5095c5f2cd0e1af5dfe 100644
GIT binary patch
delta 8555
zcmbtaU2I#)b%wlaukB*J-dL6`dnM79ZCMs=lKQ8;yWN@L6-7~36h+Ij6z{Gnn&OZ6
zBasv(3vQVpK#^vfWViF&21Wt|ZG)hNngT@&WEW^(iZ<v|p9&Od3p5Cd^rg+d6h*&t
z=3a`F=|z#kfX#b3bAG;a&UelX{fmD+_FEsn^2a|qcJjlmbm>X1lsWjrWB0qR;KO3N
zgukzPuU50=T|Cg2c=|AzN~O1I`e(0v?=|P`!LwH<j-5{ClY97nr&7>AJn@5HYuR=1
z;I&VW>9<b5`?{kekxf?8RlRch*1^|L2Tq<<C8@kQDa5AqMuk<-fAOV$|AKc_sE~~p
zBD&yBitxJoc~yv%HzGu2mj71XxDfG#K6NhCy}@rX(rXK0KjDY8etho6Ws;x*vPHyd
zPSVEZJ^lP#_nAr3Oo||UHL9QY^u4mB0{UOhjX!FBm4Xdr=}ij(1qmS%8{V)`d(s<&
zEsFQglbTS}`J58gy8AgPM4IiHYcsmqZN1FsoA**=a*Kc@^s>pyYYAa_Gk^?URHaZp
z<(Nqph-8F4sK5jJ{J87fJWPiN`rGFt=k{f*8SqAJ=`-gp=wm(CUuMq@{kZ3?p1pS6
zo6wyNP3qt6xziQUpY@D)P3m9vteu%?ldnIxka)S+pI;d0B(?;x0~h@eyLfRt<+xXr
z-lBvTVJ|cbJW(9#k^(W-8i-lSClv~FBxY%`g*_Bv{)To^1}(Ir04w{>Y)b|Z0IT&a
zsXyuNy|yd8+YnZe1=bLMS&|9XgOIf<%E?rxm=SJp&}5x4DJLyNt@pKUCDcA5w|Md9
zgAC%lX+eP6pJ^^;0LIxUQ8fqz7=d6b0(0cF3PsrIIYP}^cOLXlE?(?P=zqI7INZq>
zhOQ=2j8qIjBC?j3+TYv%9*cp4u271>rc8Hoa2Xlp`p2eVVYumE0RH{3ceLU7H0Lc-
zP)DSj(knu(A)apStEJY$-BjLX6s|(-BU6XWfj#R$fcDILQ94Vlm6L1P6O<OgA<9yJ
zc<Feb&+I{MrLig7d`f|4R`pjeT{@Ok`u8sNH4=wv3o1f6LGVLuUgk~tn*>;Dk3YO>
znp;p&Dp#??`;bv)pTTvh9oEdD$+42My$zIpg48WdC{A04=4LreSWOA-eG2J*xn<;T
zD{@rrhk{?QV-h>2kL;KVRg8pD$!Ro?U<g8Xn(I%^J3zxXDvfyuL#EFZLI6fL5o0<^
z)0-_B)jz&`sox|6cog(ra5AZ?yrYx=d8I$U+}Budbq|iMifuwFCJIuNn15Ewiab?o
za1<r73P)`)ej(Jla~73s)#V(g1XPTp1n$?G$WZc@L9axmd5aezEO4?Bg*f`QD1m|v
ziVxjymrHfAqd+<$>;OL26ia~bbp+hqVE}L6G2sFZI|&Pc`VNa|LBVfwaF?<j;fI$o
z>NoNI5Ucm=yL|)a_uBk6eQ!q>``+>fI(+jq#Ih6@TSjIrmXx#fpZ49p95DKdA!M3Z
zG5SD1by*7O|L(iqAvVPqViTesnf8Lm0y4|RV50=oLM}|HnuI#F&RsiEpJDjjvM0`-
zkh?P!1)Gpxpx}$-zA@2ndG&Ytd(Q4zt>MTh{a5`fr%E&IMtMeG8(3;=&B8}j4{gtq
z3sEYY#ei8cI)l6rNd=A&sflo#0iz)i2`Z39ScI35qlPAEcZnN@y(MYA89zFtDTOO0
zwp62;r=73>&$w9B+5tdES6TH%0AOzxoCii(VV-`-iDw^yq>C}}G%;ZY@{TIx6{l@<
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
H?GFAgVCtv1

delta 6509
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

diff --git a/apps/files_sharing/js/sharedfilelist.js b/apps/files_sharing/js/sharedfilelist.js
index 5b198300589..f40a1f1a853 100644
--- a/apps/files_sharing/js/sharedfilelist.js
+++ b/apps/files_sharing/js/sharedfilelist.js
@@ -39,6 +39,7 @@
 			_sharedWithUser: false,
 			_linksOnly: false,
 			_showDeleted: false,
+			_showPending: false,
 			_clientSideSort: true,
 			_allowSelection: false,
 			_isOverview: false,
@@ -62,6 +63,9 @@
 				if (options && options.showDeleted) {
 					this._showDeleted = true
 				}
+				if (options && options.showPending) {
+					this._showPending = true
+				}
 				if (options && options.isOverview) {
 					this._isOverview = true
 				}
@@ -87,7 +91,7 @@
 					var permission = parseInt($tr.attr('data-permissions')) | OC.PERMISSION_DELETE
 					$tr.attr('data-permissions', permission)
 				}
-				if (this._showDeleted) {
+				if (this._showDeleted || this._showPending) {
 					var permission = fileData.permissions
 					$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 = {
 					url: OC.linkToOCS('apps/files_sharing/api/v1') + 'shares',
 					/* jshint camelcase: false */
@@ -227,6 +243,8 @@
 				// and make sure we have 2 promises
 				if (this._showDeleted) {
 					promises.push($.ajax(deletedShares))
+				} else if (this._showPending) {
+					promises.push($.ajax(pendingShares))
 				} else {
 					promises.push($.ajax(shares))
 
diff --git a/apps/files_sharing/lib/AppInfo/Application.php b/apps/files_sharing/lib/AppInfo/Application.php
index 48802617b4f..5a18cce8e49 100644
--- a/apps/files_sharing/lib/AppInfo/Application.php
+++ b/apps/files_sharing/lib/AppInfo/Application.php
@@ -278,6 +278,15 @@ class Application extends App {
 			'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
 		\OCA\Files\App::getNavigationManager()->add([
 			'id' => 'shareoverview',
diff --git a/apps/files_sharing/lib/Controller/ShareAPIController.php b/apps/files_sharing/lib/Controller/ShareAPIController.php
index e7c9a414958..b71d3dac3a7 100644
--- a/apps/files_sharing/lib/Controller/ShareAPIController.php
+++ b/apps/files_sharing/lib/Controller/ShareAPIController.php
@@ -1100,11 +1100,31 @@ class ShareAPIController extends OCSController {
 			}
 		}
 
-		$result = array_map(function (IShare $share) {
-			return [
-				'id' => $share->getFullId(),
-			];
-		}, $pendingShares);
+		$result = array_filter(array_map(function (IShare $share) {
+			$userFolder = $this->rootFolder->getUserFolder($share->getSharedBy());
+			$nodes = $userFolder->getById($share->getNodeId());
+			if (empty($nodes)) {
+				// 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);
 	}
-- 
GitLab