From 4baeaeccdb2fd079418d85881ba4e7d2ebd649e9 Mon Sep 17 00:00:00 2001 From: Richard Steinmetz Date: Sun, 11 Oct 2020 15:19:30 +0200 Subject: [PATCH] Indicate preview availability in share api responses Signed-off-by: Richard Steinmetz Signed-off-by: npmbuildbot-nextcloud[bot] --- apps/files_sharing/js/dist/files_sharing.js | 2 +- .../js/dist/files_sharing.js.map | 2 +- apps/files_sharing/js/sharedfilelist.js | 1 + .../lib/Controller/ShareAPIController.php | 8 +- apps/files_sharing/tests/ApiTest.php | 5 +- .../Controller/ShareAPIControllerTest.php | 91 ++++++++++++++++++- 6 files changed, 104 insertions(+), 5 deletions(-) diff --git a/apps/files_sharing/js/dist/files_sharing.js b/apps/files_sharing/js/dist/files_sharing.js index 0cf5890c43..51b8a255f1 100644 --- a/apps/files_sharing/js/dist/files_sharing.js +++ b/apps/files_sharing/js/dist/files_sharing.js @@ -1,2 +1,2 @@ -!function(e){var i={};function t(s){if(i[s])return i[s].exports;var n=i[s]={i:s,l:!1,exports:{}};return e[s].call(n.exports,n,n.exports,t),n.l=!0,n.exports}t.m=e,t.c=i,t.d=function(e,i,s){t.o(e,i)||Object.defineProperty(e,i,{enumerable:!0,get:s})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,i){if(1&i&&(e=t(e)),8&i)return e;if(4&i&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(t.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&i&&"string"!=typeof e)for(var n in e)t.d(s,n,function(i){return e[i]}.bind(null,n));return s},t.n=function(e){var i=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(i,"a",i),i},t.o=function(e,i){return Object.prototype.hasOwnProperty.call(e,i)},t.p="/js/",t(t.s=274)}({274:function(e,i,t){"use strict";t.r(i);t(275),t(276);t.nc=btoa(OC.requestToken),t.p=OC.linkTo("files_sharing","js/dist/")},275:function(e,i){OCA.Sharing||(OCA.Sharing={}),OCA.Sharing.App={_inFileList:null,_outFileList:null,_overviewFileList:null,_pendingFileList:null,initSharingIn:function(e){return this._inFileList||(this._inFileList=new OCA.Sharing.FileList(e,{id:"shares.self",sharedWithUser:!0,fileActions:this._createFileActions(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._inFileList),this._inFileList.appName=t("files_sharing","Shared with you"),this._inFileList.$el.find("#emptycontent").html('

'+t("files_sharing","Nothing shared with you yet")+"

"+t("files_sharing","Files and folders others share with you will show up here")+"

")),this._inFileList},initSharingOut:function(e){return this._outFileList||(this._outFileList=new OCA.Sharing.FileList(e,{id:"shares.others",sharedWithUser:!1,fileActions:this._createFileActions(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._outFileList),this._outFileList.appName=t("files_sharing","Shared with others"),this._outFileList.$el.find("#emptycontent").html('

'+t("files_sharing","Nothing shared yet")+"

"+t("files_sharing","Files and folders you share will show up here")+"

")),this._outFileList},initSharingLinks:function(e){return this._linkFileList||(this._linkFileList=new OCA.Sharing.FileList(e,{id:"shares.link",linksOnly:!0,fileActions:this._createFileActions(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._linkFileList),this._linkFileList.appName=t("files_sharing","Shared by link"),this._linkFileList.$el.find("#emptycontent").html('

'+t("files_sharing","No shared links")+"

"+t("files_sharing","Files and folders you share by link will show up here")+"

")),this._linkFileList},initSharingDeleted:function(e){return this._deletedFileList||(this._deletedFileList=new OCA.Sharing.FileList(e,{id:"shares.deleted",defaultFileActionsDisabled:!0,showDeleted:!0,sharedWithUser:!0,fileActions:this._restoreShareAction(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._deletedFileList),this._deletedFileList.appName=t("files_sharing","Deleted shares"),this._deletedFileList.$el.find("#emptycontent").html('

'+t("files_sharing","No deleted shares")+"

"+t("files_sharing","Shares you deleted will show up here")+"

")),this._deletedFileList},initSharingPening:function(e){return this._pendingFileList||(this._pendingFileList=new OCA.Sharing.FileList(e,{id:"shares.pending",showPending:!0,sharedWithUser:!0,fileActions:this._acceptShareAction(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._pendingFileList),this._pendingFileList.appName=t("files_sharing","Pending shares"),this._pendingFileList.$el.find("#emptycontent").html('

'+t("files_sharing","No pending shares")+"

"+t("files_sharing","Shares you have received but not confirmed will show up here")+"

")),this._pendingFileList},initShareingOverview:function(e){return this._overviewFileList||(this._overviewFileList=new OCA.Sharing.FileList(e,{id:"shares.overview",config:OCA.Files.App.getFilesConfig(),isOverview:!0,shown:!0}),this._extendFileList(this._overviewFileList),this._overviewFileList.appName=t("files_sharing","Shares"),this._overviewFileList.$el.find("#emptycontent").html('

'+t("files_sharing","No shares")+"

"+t("files_sharing","Shares will show up here")+"

")),this._overviewFileList},removeSharingIn:function(){this._inFileList&&this._inFileList.$fileList.empty()},removeSharingOut:function(){this._outFileList&&this._outFileList.$fileList.empty()},removeSharingLinks:function(){this._linkFileList&&this._linkFileList.$fileList.empty()},removeSharingDeleted:function(){this._deletedFileList&&this._deletedFileList.$fileList.empty()},removeSharingPending:function(){this._pendingFileList&&this._pendingFileList.$fileList.empty()},removeSharingOverview:function(){this._overviewFileList&&this._overviewFileList.$fileList.empty()},destroy:function(){OCA.Files.fileActions.off("setDefault.app-sharing",this._onActionsUpdated),OCA.Files.fileActions.off("registerAction.app-sharing",this._onActionsUpdated),this.removeSharingIn(),this.removeSharingOut(),this.removeSharingLinks(),this._inFileList=null,this._outFileList=null,this._linkFileList=null,this._overviewFileList=null,delete this._globalActionsInitialized},_createFileActions:function(){var e=new OCA.Files.FileActions;return e.registerDefaultActions(),e.merge(OCA.Files.fileActions),this._globalActionsInitialized||(this._onActionsUpdated=_.bind(this._onActionsUpdated,this),OCA.Files.fileActions.on("setDefault.app-sharing",this._onActionsUpdated),OCA.Files.fileActions.on("registerAction.app-sharing",this._onActionsUpdated),this._globalActionsInitialized=!0),e.register("dir","Open",OC.PERMISSION_READ,"",(function(e,i){OCA.Files.App.setActiveView("files",{silent:!0}),OCA.Files.App.fileList.changeDirectory(OC.joinPaths(i.$file.attr("data-path"),e),!0,!0)})),e.setDefault("dir","Open"),e},_restoreShareAction:function(){var e=new OCA.Files.FileActions;return e.registerAction({name:"Restore",displayName:t("files_sharing","Restore"),altText:t("files_sharing","Restore share"),mime:"all",permissions:OC.PERMISSION_ALL,iconClass:"icon-history",type:OCA.Files.FileActions.TYPE_INLINE,actionHandler:function(e,i){var s=i.$file.data("shareId");$.post(OC.linkToOCS("apps/files_sharing/api/v1/deletedshares",2)+s).success((function(e){i.fileList.remove(i.fileInfoModel.attributes.name)})).fail((function(){OC.Notification.showTemporary(t("files_sharing","Something happened. Unable to restore the share."))}))}}),e},_acceptShareAction:function(){var e=new OCA.Files.FileActions;return e.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(e,i){var s=i.$file.data("shareId");$.post(OC.linkToOCS("apps/files_sharing/api/v1/shares/pending",2)+s).success((function(e){i.fileList.remove(i.fileInfoModel.attributes.name)})).fail((function(){OC.Notification.showTemporary(t("files_sharing","Something happened. Unable to accept the share."))}))}}),e.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(e,i){var s=i.$file.data("shareId");$.ajax({url:OC.linkToOCS("apps/files_sharing/api/v1/shares",2)+s,type:"DELETE"}).success((function(e){i.fileList.remove(i.fileInfoModel.attributes.name)})).fail((function(){OC.Notification.showTemporary(t("files_sharing","Something happened. Unable to reject the share."))}))}}),e},_onActionsUpdated:function(e){_.each([this._inFileList,this._outFileList,this._linkFileList],(function(i){i&&(e.action?i.fileActions.registerAction(e.action):e.defaultAction&&i.fileActions.setDefault(e.defaultAction.mime,e.defaultAction.name))}))},_extendFileList:function(e){e.fileSummary.$el.find(".filesize").remove()}},window.addEventListener("DOMContentLoaded",(function(){$("#app-content-sharingin").on("show",(function(e){OCA.Sharing.App.initSharingIn($(e.target))})),$("#app-content-sharingin").on("hide",(function(){OCA.Sharing.App.removeSharingIn()})),$("#app-content-sharingout").on("show",(function(e){OCA.Sharing.App.initSharingOut($(e.target))})),$("#app-content-sharingout").on("hide",(function(){OCA.Sharing.App.removeSharingOut()})),$("#app-content-sharinglinks").on("show",(function(e){OCA.Sharing.App.initSharingLinks($(e.target))})),$("#app-content-sharinglinks").on("hide",(function(){OCA.Sharing.App.removeSharingLinks()})),$("#app-content-deletedshares").on("show",(function(e){OCA.Sharing.App.initSharingDeleted($(e.target))})),$("#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))})),$("#app-content-shareoverview").on("hide",(function(){OCA.Sharing.App.removeSharingOverview()}))}))},276:function(e,i){var s;(s=function(e,i){this.initialize(e,i)}).prototype=_.extend({},OCA.Files.FileList.prototype,{appName:"Shares",_sharedWithUser:!1,_linksOnly:!1,_showDeleted:!1,_showPending:!1,_clientSideSort:!0,_allowSelection:!1,_isOverview:!1,initialize:function(e,i){OCA.Files.FileList.prototype.initialize.apply(this,arguments),this.initialized||(i&&i.sharedWithUser&&(this._sharedWithUser=!0),i&&i.linksOnly&&(this._linksOnly=!0),i&&i.showDeleted&&(this._showDeleted=!0),i&&i.showPending&&(this._showPending=!0),i&&i.isOverview&&(this._isOverview=!0))},_renderRow:function(){return OCA.Files.FileList.prototype._renderRow.apply(this,arguments)},_createRow:function(e){var i=OCA.Files.FileList.prototype._createRow.apply(this,arguments);if(i.find(".filesize").remove(),i.find("td.date").before(i.children("td:first")),i.find("td.filename input:checkbox").remove(),i.attr("data-share-id",_.pluck(e.shares,"id").join(",")),this._sharedWithUser){i.attr("data-share-owner",e.shareOwner),i.attr("data-mounttype","shared-root");var s=parseInt(i.attr("data-permissions"))|OC.PERMISSION_DELETE;i.attr("data-permissions",s)}if((this._showDeleted||this._showPending)&&(s=e.permissions,i.attr("data-share-permissions",s)),this._linksOnly){var n=0;e.shares&&null!==e.shares[0].expiration&&(n=moment(e.shares[0].expiration).valueOf()),i.attr("data-expiration",n);var a,r,o=Math.round((n-(new Date).getTime())/1e3/60/60/24*5);o>=160&&(o=160),n>0?(a=OC.Util.formatDate(n),r=OC.Util.relativeModifiedDate(n)):(a=t("files_sharing","No expiration date set"),r="",o=160),td=$("").attr({"class":"date"}),td.append($("").attr({"class":"modified","title":a,"style":"color:rgb("+o+","+o+","+o+")"}).text(r).tooltip({placement:"top"})),i.append(td)}return i},setSharedWithUser:function(e){this._sharedWithUser=!!e},updateEmptyContent:function(){var e=this.getCurrentDirectory();"/"===e?(this.$el.find("#emptycontent").toggleClass("hidden",!this.isEmpty),this.$el.find("#filestable thead th").toggleClass("hidden",this.isEmpty),this._linksOnly||this.$el.find("th.column-expiration").addClass("hidden")):OCA.Files.FileList.prototype.updateEmptyContent.apply(this,arguments)},getDirectoryPermissions:function(){return OC.PERMISSION_READ|OC.PERMISSION_DELETE},updateStorageStatistics:function(){},updateRow:function(e,i,t){return e},reload:function(){this.showMask(),this._reloadCall&&this._reloadCall.abort(),this._setCurrentDir("/",!1);var e=[],i={url:OC.linkToOCS("apps/files_sharing/api/v1",2)+"deletedshares",data:{format:"json",include_tags:!0},type:"GET",beforeSend:function(e){e.setRequestHeader("OCS-APIREQUEST","true")}},t={url:OC.linkToOCS("apps/files_sharing/api/v1/shares",2)+"pending",data:{format:"json"},type:"GET",beforeSend:function(e){e.setRequestHeader("OCS-APIREQUEST","true")}},s={url:OC.linkToOCS("apps/files_sharing/api/v1")+"shares",data:{format:"json",shared_with_me:!1!==this._sharedWithUser,include_tags:!0},type:"GET",beforeSend:function(e){e.setRequestHeader("OCS-APIREQUEST","true")}},n={url:OC.linkToOCS("apps/files_sharing/api/v1")+"remote_shares",data:{format:"json",include_tags:!0},type:"GET",beforeSend:function(e){e.setRequestHeader("OCS-APIREQUEST","true")}};this._showDeleted?e.push($.ajax(i)):this._showPending?e.push($.ajax(t)):(e.push($.ajax(s)),(!1!==this._sharedWithUser||this._isOverview)&&e.push($.ajax(n)),this._isOverview&&(s.data.shared_with_me=!s.data.shared_with_me,e.push($.ajax(s)))),this._reloadCall=$.when.apply($,e);var a=this.reloadCallback.bind(this);return this._reloadCall.then(a,a)},reloadCallback:function(e,i,s){delete this._reloadCall,this.hideMask(),this.$el.find("#headerSharedWith").text(t("files_sharing",this._sharedWithUser?"Shared by":"Shared with"));var n=[];return e[0]&&e[0].ocs&&(e=e[0]),i&&i[0]&&i[0].ocs&&(i=i[0]),s&&s[0]&&s[0].ocs&&(s=s[0]),e.ocs&&e.ocs.data&&(n=n.concat(this._makeFilesFromShares(e.ocs.data,this._sharedWithUser))),i&&i.ocs&&i.ocs.data&&(n=n.concat(this._makeFilesFromRemoteShares(i.ocs.data))),s&&s.ocs&&s.ocs.data&&(n=n.concat(this._makeFilesFromShares(s.ocs.data,!this._sharedWithUser))),this.setFiles(n),!0},_makeFilesFromRemoteShares:function(e){var i=e;return i=_.chain(i).map((function(e){var i={shareOwner:e.owner+"@"+e.remote.replace(/.*?:\/\//g,""),name:OC.basename(e.mountpoint),mtime:1e3*e.mtime,mimetype:e.mimetype,type:e.type,id:e.file_id,path:OC.dirname(e.mountpoint),permissions:e.permissions,tags:e.tags||[]};return i.shares=[{id:e.id,type:OC.Share.SHARE_TYPE_REMOTE}],i})).value()},_makeFilesFromShares:function(e,i){var t=e;return this._linksOnly&&(t=_.filter(e,(function(e){return e.share_type===OC.Share.SHARE_TYPE_LINK}))),(t=_.chain(t).map((function(e){var t={id:e.file_source,icon:OC.MimeType.getIconUrl(e.mimetype),mimetype:e.mimetype,tags:e.tags||[]};return"folder"===e.item_type?(t.type="dir",t.mimetype="httpd/unix-directory"):t.type="file",t.share={id:e.id,type:e.share_type,target:e.share_with,stime:1e3*e.stime,expiration:e.expiration},i?(t.shareOwner=e.displayname_owner,t.shareOwnerId=e.uid_owner,t.name=OC.basename(e.file_target),t.path=OC.dirname(e.file_target),t.permissions=e.permissions,t.path&&(t.extraData=e.file_target)):(e.share_type!==OC.Share.SHARE_TYPE_LINK&&(t.share.targetDisplayName=e.share_with_displayname,t.share.targetShareWithId=e.share_with),t.name=OC.basename(e.path),t.path=OC.dirname(e.path),t.permissions=OC.PERMISSION_ALL,t.path&&(t.extraData=e.path)),t})).reduce((function(e,i){var t=e[i.id],s=i.share.targetDisplayName,n=i.share.targetShareWithId;return t?(i.share.stime>t.mtime&&(t.mtime=i.share.stime),t.shares.push(i.share)):((t=e[i.id]=i).shares=[i.share],t.recipients={},t.recipientData={},t.shareTypes={},t.recipientsCount=0,t.mtime=i.share.stime),s&&(t.recipientsCount<4&&(t.recipients[s]=!0,t.recipientData[t.recipientsCount]={"shareWith":n,"shareWithDisplayName":s}),t.recipientsCount++),t.shareTypes[i.share.type]=!0,delete i.share,e}),{}).values().each((function(e){e.mountType="shared",delete e.recipientsCount,i?delete e.shareTypes:e.shareTypes=_.keys(e.shareTypes)})).value()).sort(this._sortComparator)}}),OCA.Sharing.FileList=s}}); +!function(e){var i={};function t(s){if(i[s])return i[s].exports;var n=i[s]={i:s,l:!1,exports:{}};return e[s].call(n.exports,n,n.exports,t),n.l=!0,n.exports}t.m=e,t.c=i,t.d=function(e,i,s){t.o(e,i)||Object.defineProperty(e,i,{enumerable:!0,get:s})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,i){if(1&i&&(e=t(e)),8&i)return e;if(4&i&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(t.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&i&&"string"!=typeof e)for(var n in e)t.d(s,n,function(i){return e[i]}.bind(null,n));return s},t.n=function(e){var i=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(i,"a",i),i},t.o=function(e,i){return Object.prototype.hasOwnProperty.call(e,i)},t.p="/js/",t(t.s=274)}({274:function(e,i,t){"use strict";t.r(i);t(275),t(276);t.nc=btoa(OC.requestToken),t.p=OC.linkTo("files_sharing","js/dist/")},275:function(e,i){OCA.Sharing||(OCA.Sharing={}),OCA.Sharing.App={_inFileList:null,_outFileList:null,_overviewFileList:null,_pendingFileList:null,initSharingIn:function(e){return this._inFileList||(this._inFileList=new OCA.Sharing.FileList(e,{id:"shares.self",sharedWithUser:!0,fileActions:this._createFileActions(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._inFileList),this._inFileList.appName=t("files_sharing","Shared with you"),this._inFileList.$el.find("#emptycontent").html('

'+t("files_sharing","Nothing shared with you yet")+"

"+t("files_sharing","Files and folders others share with you will show up here")+"

")),this._inFileList},initSharingOut:function(e){return this._outFileList||(this._outFileList=new OCA.Sharing.FileList(e,{id:"shares.others",sharedWithUser:!1,fileActions:this._createFileActions(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._outFileList),this._outFileList.appName=t("files_sharing","Shared with others"),this._outFileList.$el.find("#emptycontent").html('

'+t("files_sharing","Nothing shared yet")+"

"+t("files_sharing","Files and folders you share will show up here")+"

")),this._outFileList},initSharingLinks:function(e){return this._linkFileList||(this._linkFileList=new OCA.Sharing.FileList(e,{id:"shares.link",linksOnly:!0,fileActions:this._createFileActions(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._linkFileList),this._linkFileList.appName=t("files_sharing","Shared by link"),this._linkFileList.$el.find("#emptycontent").html('

'+t("files_sharing","No shared links")+"

"+t("files_sharing","Files and folders you share by link will show up here")+"

")),this._linkFileList},initSharingDeleted:function(e){return this._deletedFileList||(this._deletedFileList=new OCA.Sharing.FileList(e,{id:"shares.deleted",defaultFileActionsDisabled:!0,showDeleted:!0,sharedWithUser:!0,fileActions:this._restoreShareAction(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._deletedFileList),this._deletedFileList.appName=t("files_sharing","Deleted shares"),this._deletedFileList.$el.find("#emptycontent").html('

'+t("files_sharing","No deleted shares")+"

"+t("files_sharing","Shares you deleted will show up here")+"

")),this._deletedFileList},initSharingPening:function(e){return this._pendingFileList||(this._pendingFileList=new OCA.Sharing.FileList(e,{id:"shares.pending",showPending:!0,sharedWithUser:!0,fileActions:this._acceptShareAction(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._pendingFileList),this._pendingFileList.appName=t("files_sharing","Pending shares"),this._pendingFileList.$el.find("#emptycontent").html('

'+t("files_sharing","No pending shares")+"

"+t("files_sharing","Shares you have received but not confirmed will show up here")+"

")),this._pendingFileList},initShareingOverview:function(e){return this._overviewFileList||(this._overviewFileList=new OCA.Sharing.FileList(e,{id:"shares.overview",config:OCA.Files.App.getFilesConfig(),isOverview:!0,shown:!0}),this._extendFileList(this._overviewFileList),this._overviewFileList.appName=t("files_sharing","Shares"),this._overviewFileList.$el.find("#emptycontent").html('

'+t("files_sharing","No shares")+"

"+t("files_sharing","Shares will show up here")+"

")),this._overviewFileList},removeSharingIn:function(){this._inFileList&&this._inFileList.$fileList.empty()},removeSharingOut:function(){this._outFileList&&this._outFileList.$fileList.empty()},removeSharingLinks:function(){this._linkFileList&&this._linkFileList.$fileList.empty()},removeSharingDeleted:function(){this._deletedFileList&&this._deletedFileList.$fileList.empty()},removeSharingPending:function(){this._pendingFileList&&this._pendingFileList.$fileList.empty()},removeSharingOverview:function(){this._overviewFileList&&this._overviewFileList.$fileList.empty()},destroy:function(){OCA.Files.fileActions.off("setDefault.app-sharing",this._onActionsUpdated),OCA.Files.fileActions.off("registerAction.app-sharing",this._onActionsUpdated),this.removeSharingIn(),this.removeSharingOut(),this.removeSharingLinks(),this._inFileList=null,this._outFileList=null,this._linkFileList=null,this._overviewFileList=null,delete this._globalActionsInitialized},_createFileActions:function(){var e=new OCA.Files.FileActions;return e.registerDefaultActions(),e.merge(OCA.Files.fileActions),this._globalActionsInitialized||(this._onActionsUpdated=_.bind(this._onActionsUpdated,this),OCA.Files.fileActions.on("setDefault.app-sharing",this._onActionsUpdated),OCA.Files.fileActions.on("registerAction.app-sharing",this._onActionsUpdated),this._globalActionsInitialized=!0),e.register("dir","Open",OC.PERMISSION_READ,"",(function(e,i){OCA.Files.App.setActiveView("files",{silent:!0}),OCA.Files.App.fileList.changeDirectory(OC.joinPaths(i.$file.attr("data-path"),e),!0,!0)})),e.setDefault("dir","Open"),e},_restoreShareAction:function(){var e=new OCA.Files.FileActions;return e.registerAction({name:"Restore",displayName:t("files_sharing","Restore"),altText:t("files_sharing","Restore share"),mime:"all",permissions:OC.PERMISSION_ALL,iconClass:"icon-history",type:OCA.Files.FileActions.TYPE_INLINE,actionHandler:function(e,i){var s=i.$file.data("shareId");$.post(OC.linkToOCS("apps/files_sharing/api/v1/deletedshares",2)+s).success((function(e){i.fileList.remove(i.fileInfoModel.attributes.name)})).fail((function(){OC.Notification.showTemporary(t("files_sharing","Something happened. Unable to restore the share."))}))}}),e},_acceptShareAction:function(){var e=new OCA.Files.FileActions;return e.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(e,i){var s=i.$file.data("shareId");$.post(OC.linkToOCS("apps/files_sharing/api/v1/shares/pending",2)+s).success((function(e){i.fileList.remove(i.fileInfoModel.attributes.name)})).fail((function(){OC.Notification.showTemporary(t("files_sharing","Something happened. Unable to accept the share."))}))}}),e.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(e,i){var s=i.$file.data("shareId");$.ajax({url:OC.linkToOCS("apps/files_sharing/api/v1/shares",2)+s,type:"DELETE"}).success((function(e){i.fileList.remove(i.fileInfoModel.attributes.name)})).fail((function(){OC.Notification.showTemporary(t("files_sharing","Something happened. Unable to reject the share."))}))}}),e},_onActionsUpdated:function(e){_.each([this._inFileList,this._outFileList,this._linkFileList],(function(i){i&&(e.action?i.fileActions.registerAction(e.action):e.defaultAction&&i.fileActions.setDefault(e.defaultAction.mime,e.defaultAction.name))}))},_extendFileList:function(e){e.fileSummary.$el.find(".filesize").remove()}},window.addEventListener("DOMContentLoaded",(function(){$("#app-content-sharingin").on("show",(function(e){OCA.Sharing.App.initSharingIn($(e.target))})),$("#app-content-sharingin").on("hide",(function(){OCA.Sharing.App.removeSharingIn()})),$("#app-content-sharingout").on("show",(function(e){OCA.Sharing.App.initSharingOut($(e.target))})),$("#app-content-sharingout").on("hide",(function(){OCA.Sharing.App.removeSharingOut()})),$("#app-content-sharinglinks").on("show",(function(e){OCA.Sharing.App.initSharingLinks($(e.target))})),$("#app-content-sharinglinks").on("hide",(function(){OCA.Sharing.App.removeSharingLinks()})),$("#app-content-deletedshares").on("show",(function(e){OCA.Sharing.App.initSharingDeleted($(e.target))})),$("#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))})),$("#app-content-shareoverview").on("hide",(function(){OCA.Sharing.App.removeSharingOverview()}))}))},276:function(e,i){var s;(s=function(e,i){this.initialize(e,i)}).prototype=_.extend({},OCA.Files.FileList.prototype,{appName:"Shares",_sharedWithUser:!1,_linksOnly:!1,_showDeleted:!1,_showPending:!1,_clientSideSort:!0,_allowSelection:!1,_isOverview:!1,initialize:function(e,i){OCA.Files.FileList.prototype.initialize.apply(this,arguments),this.initialized||(i&&i.sharedWithUser&&(this._sharedWithUser=!0),i&&i.linksOnly&&(this._linksOnly=!0),i&&i.showDeleted&&(this._showDeleted=!0),i&&i.showPending&&(this._showPending=!0),i&&i.isOverview&&(this._isOverview=!0))},_renderRow:function(){return OCA.Files.FileList.prototype._renderRow.apply(this,arguments)},_createRow:function(e){var i=OCA.Files.FileList.prototype._createRow.apply(this,arguments);if(i.find(".filesize").remove(),i.find("td.date").before(i.children("td:first")),i.find("td.filename input:checkbox").remove(),i.attr("data-share-id",_.pluck(e.shares,"id").join(",")),this._sharedWithUser){i.attr("data-share-owner",e.shareOwner),i.attr("data-mounttype","shared-root");var s=parseInt(i.attr("data-permissions"))|OC.PERMISSION_DELETE;i.attr("data-permissions",s)}if((this._showDeleted||this._showPending)&&(s=e.permissions,i.attr("data-share-permissions",s)),this._linksOnly){var n=0;e.shares&&null!==e.shares[0].expiration&&(n=moment(e.shares[0].expiration).valueOf()),i.attr("data-expiration",n);var a,r,o=Math.round((n-(new Date).getTime())/1e3/60/60/24*5);o>=160&&(o=160),n>0?(a=OC.Util.formatDate(n),r=OC.Util.relativeModifiedDate(n)):(a=t("files_sharing","No expiration date set"),r="",o=160),td=$("").attr({"class":"date"}),td.append($("").attr({"class":"modified","title":a,"style":"color:rgb("+o+","+o+","+o+")"}).text(r).tooltip({placement:"top"})),i.append(td)}return i},setSharedWithUser:function(e){this._sharedWithUser=!!e},updateEmptyContent:function(){var e=this.getCurrentDirectory();"/"===e?(this.$el.find("#emptycontent").toggleClass("hidden",!this.isEmpty),this.$el.find("#filestable thead th").toggleClass("hidden",this.isEmpty),this._linksOnly||this.$el.find("th.column-expiration").addClass("hidden")):OCA.Files.FileList.prototype.updateEmptyContent.apply(this,arguments)},getDirectoryPermissions:function(){return OC.PERMISSION_READ|OC.PERMISSION_DELETE},updateStorageStatistics:function(){},updateRow:function(e,i,t){return e},reload:function(){this.showMask(),this._reloadCall&&this._reloadCall.abort(),this._setCurrentDir("/",!1);var e=[],i={url:OC.linkToOCS("apps/files_sharing/api/v1",2)+"deletedshares",data:{format:"json",include_tags:!0},type:"GET",beforeSend:function(e){e.setRequestHeader("OCS-APIREQUEST","true")}},t={url:OC.linkToOCS("apps/files_sharing/api/v1/shares",2)+"pending",data:{format:"json"},type:"GET",beforeSend:function(e){e.setRequestHeader("OCS-APIREQUEST","true")}},s={url:OC.linkToOCS("apps/files_sharing/api/v1")+"shares",data:{format:"json",shared_with_me:!1!==this._sharedWithUser,include_tags:!0},type:"GET",beforeSend:function(e){e.setRequestHeader("OCS-APIREQUEST","true")}},n={url:OC.linkToOCS("apps/files_sharing/api/v1")+"remote_shares",data:{format:"json",include_tags:!0},type:"GET",beforeSend:function(e){e.setRequestHeader("OCS-APIREQUEST","true")}};this._showDeleted?e.push($.ajax(i)):this._showPending?e.push($.ajax(t)):(e.push($.ajax(s)),(!1!==this._sharedWithUser||this._isOverview)&&e.push($.ajax(n)),this._isOverview&&(s.data.shared_with_me=!s.data.shared_with_me,e.push($.ajax(s)))),this._reloadCall=$.when.apply($,e);var a=this.reloadCallback.bind(this);return this._reloadCall.then(a,a)},reloadCallback:function(e,i,s){delete this._reloadCall,this.hideMask(),this.$el.find("#headerSharedWith").text(t("files_sharing",this._sharedWithUser?"Shared by":"Shared with"));var n=[];return e[0]&&e[0].ocs&&(e=e[0]),i&&i[0]&&i[0].ocs&&(i=i[0]),s&&s[0]&&s[0].ocs&&(s=s[0]),e.ocs&&e.ocs.data&&(n=n.concat(this._makeFilesFromShares(e.ocs.data,this._sharedWithUser))),i&&i.ocs&&i.ocs.data&&(n=n.concat(this._makeFilesFromRemoteShares(i.ocs.data))),s&&s.ocs&&s.ocs.data&&(n=n.concat(this._makeFilesFromShares(s.ocs.data,!this._sharedWithUser))),this.setFiles(n),!0},_makeFilesFromRemoteShares:function(e){var i=e;return i=_.chain(i).map((function(e){var i={shareOwner:e.owner+"@"+e.remote.replace(/.*?:\/\//g,""),name:OC.basename(e.mountpoint),mtime:1e3*e.mtime,mimetype:e.mimetype,type:e.type,id:e.file_id,path:OC.dirname(e.mountpoint),permissions:e.permissions,tags:e.tags||[]};return i.shares=[{id:e.id,type:OC.Share.SHARE_TYPE_REMOTE}],i})).value()},_makeFilesFromShares:function(e,i){var t=e;return this._linksOnly&&(t=_.filter(e,(function(e){return e.share_type===OC.Share.SHARE_TYPE_LINK}))),(t=_.chain(t).map((function(e){var t={id:e.file_source,icon:OC.MimeType.getIconUrl(e.mimetype),mimetype:e.mimetype,hasPreview:e.has_preview,tags:e.tags||[]};return"folder"===e.item_type?(t.type="dir",t.mimetype="httpd/unix-directory"):t.type="file",t.share={id:e.id,type:e.share_type,target:e.share_with,stime:1e3*e.stime,expiration:e.expiration},i?(t.shareOwner=e.displayname_owner,t.shareOwnerId=e.uid_owner,t.name=OC.basename(e.file_target),t.path=OC.dirname(e.file_target),t.permissions=e.permissions,t.path&&(t.extraData=e.file_target)):(e.share_type!==OC.Share.SHARE_TYPE_LINK&&(t.share.targetDisplayName=e.share_with_displayname,t.share.targetShareWithId=e.share_with),t.name=OC.basename(e.path),t.path=OC.dirname(e.path),t.permissions=OC.PERMISSION_ALL,t.path&&(t.extraData=e.path)),t})).reduce((function(e,i){var t=e[i.id],s=i.share.targetDisplayName,n=i.share.targetShareWithId;return t?(i.share.stime>t.mtime&&(t.mtime=i.share.stime),t.shares.push(i.share)):((t=e[i.id]=i).shares=[i.share],t.recipients={},t.recipientData={},t.shareTypes={},t.recipientsCount=0,t.mtime=i.share.stime),s&&(t.recipientsCount<4&&(t.recipients[s]=!0,t.recipientData[t.recipientsCount]={"shareWith":n,"shareWithDisplayName":s}),t.recipientsCount++),t.shareTypes[i.share.type]=!0,delete i.share,e}),{}).values().each((function(e){e.mountType="shared",delete e.recipientsCount,i?delete e.shareTypes:e.shareTypes=_.keys(e.shareTypes)})).value()).sort(this._sortComparator)}}),OCA.Sharing.FileList=s}}); //# sourceMappingURL=files_sharing.js.map \ No newline at end of file diff --git a/apps/files_sharing/js/dist/files_sharing.js.map b/apps/files_sharing/js/dist/files_sharing.js.map index 88e5f079b3..7ca06bc707 100644 --- a/apps/files_sharing/js/dist/files_sharing.js.map +++ b/apps/files_sharing/js/dist/files_sharing.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./apps/files_sharing/src/files_sharing.js","webpack:///./apps/files_sharing/js/app.js","webpack:///./apps/files_sharing/js/sharedfilelist.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","__webpack_nonce__","btoa","OC","requestToken","__webpack_public_path__","linkTo","OCA","Sharing","App","_inFileList","_outFileList","_overviewFileList","_pendingFileList","initSharingIn","$el","this","FileList","id","sharedWithUser","fileActions","_createFileActions","config","Files","getFilesConfig","shown","_extendFileList","appName","find","html","initSharingOut","initSharingLinks","_linkFileList","linksOnly","initSharingDeleted","_deletedFileList","defaultFileActionsDisabled","showDeleted","_restoreShareAction","initSharingPening","showPending","_acceptShareAction","initShareingOverview","isOverview","removeSharingIn","$fileList","empty","removeSharingOut","removeSharingLinks","removeSharingDeleted","removeSharingPending","removeSharingOverview","destroy","off","_onActionsUpdated","_globalActionsInitialized","FileActions","registerDefaultActions","merge","_","on","register","PERMISSION_READ","filename","context","setActiveView","silent","fileList","changeDirectory","joinPaths","$file","attr","setDefault","registerAction","displayName","altText","mime","permissions","PERMISSION_ALL","iconClass","type","TYPE_INLINE","actionHandler","fileName","shareId","data","$","post","linkToOCS","success","result","remove","fileInfoModel","attributes","fail","Notification","showTemporary","ajax","url","ev","each","list","action","defaultAction","fileSummary","window","addEventListener","e","target","options","initialize","extend","_sharedWithUser","_linksOnly","_showDeleted","_showPending","_clientSideSort","_allowSelection","_isOverview","apply","arguments","initialized","_renderRow","_createRow","fileData","$tr","before","children","pluck","shares","join","shareOwner","permission","parseInt","PERMISSION_DELETE","expirationTimestamp","expiration","moment","valueOf","formatted","text","modifiedColor","Math","round","Date","getTime","Util","formatDate","relativeModifiedDate","td","append","tooltip","placement","setSharedWithUser","state","updateEmptyContent","dir","getCurrentDirectory","toggleClass","isEmpty","addClass","getDirectoryPermissions","updateStorageStatistics","updateRow","fileInfo","reload","showMask","_reloadCall","abort","_setCurrentDir","promises","deletedShares","format","include_tags","beforeSend","xhr","setRequestHeader","pendingShares","shared_with_me","remoteShares","push","when","callBack","reloadCallback","then","additionalShares","hideMask","files","ocs","concat","_makeFilesFromShares","_makeFilesFromRemoteShares","setFiles","chain","map","share","file","owner","remote","replace","basename","mountpoint","mtime","mimetype","file_id","path","dirname","tags","Share","SHARE_TYPE_REMOTE","filter","share_type","SHARE_TYPE_LINK","file_source","icon","MimeType","getIconUrl","item_type","share_with","stime","displayname_owner","shareOwnerId","uid_owner","file_target","extraData","targetDisplayName","share_with_displayname","targetShareWithId","reduce","memo","recipient","recipientId","recipients","recipientData","shareTypes","recipientsCount","values","mountType","keys","sort","_sortComparator"],"mappings":"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","file":"files_sharing.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/js/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 274);\n","import '../js/app'\nimport '../js/sharedfilelist'\n\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(OC.requestToken)\n\n// eslint-disable-next-line camelcase\n__webpack_public_path__ = OC.linkTo('files_sharing', 'js/dist/')\n","/**\n * Copyright (c) 2014 Vincent Petry \n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n\nif (!OCA.Sharing) {\n\t/**\n\t * @namespace OCA.Sharing\n\t */\n\tOCA.Sharing = {}\n}\n\n/**\n * @namespace\n */\nOCA.Sharing.App = {\n\n\t_inFileList: null,\n\t_outFileList: null,\n\t_overviewFileList: null,\n\t_pendingFileList: null,\n\n\tinitSharingIn($el) {\n\t\tif (this._inFileList) {\n\t\t\treturn this._inFileList\n\t\t}\n\n\t\tthis._inFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.self',\n\t\t\t\tsharedWithUser: true,\n\t\t\t\tfileActions: this._createFileActions(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._inFileList)\n\t\tthis._inFileList.appName = t('files_sharing', 'Shared with you')\n\t\tthis._inFileList.$el.find('#emptycontent').html('
'\n\t\t\t+ '

' + t('files_sharing', 'Nothing shared with you yet') + '

'\n\t\t\t+ '

' + t('files_sharing', 'Files and folders others share with you will show up here') + '

')\n\t\treturn this._inFileList\n\t},\n\n\tinitSharingOut($el) {\n\t\tif (this._outFileList) {\n\t\t\treturn this._outFileList\n\t\t}\n\t\tthis._outFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.others',\n\t\t\t\tsharedWithUser: false,\n\t\t\t\tfileActions: this._createFileActions(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._outFileList)\n\t\tthis._outFileList.appName = t('files_sharing', 'Shared with others')\n\t\tthis._outFileList.$el.find('#emptycontent').html('
'\n\t\t\t+ '

' + t('files_sharing', 'Nothing shared yet') + '

'\n\t\t\t+ '

' + t('files_sharing', 'Files and folders you share will show up here') + '

')\n\t\treturn this._outFileList\n\t},\n\n\tinitSharingLinks($el) {\n\t\tif (this._linkFileList) {\n\t\t\treturn this._linkFileList\n\t\t}\n\t\tthis._linkFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.link',\n\t\t\t\tlinksOnly: true,\n\t\t\t\tfileActions: this._createFileActions(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._linkFileList)\n\t\tthis._linkFileList.appName = t('files_sharing', 'Shared by link')\n\t\tthis._linkFileList.$el.find('#emptycontent').html('
'\n\t\t\t+ '

' + t('files_sharing', 'No shared links') + '

'\n\t\t\t+ '

' + t('files_sharing', 'Files and folders you share by link will show up here') + '

')\n\t\treturn this._linkFileList\n\t},\n\n\tinitSharingDeleted($el) {\n\t\tif (this._deletedFileList) {\n\t\t\treturn this._deletedFileList\n\t\t}\n\t\tthis._deletedFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.deleted',\n\t\t\t\tdefaultFileActionsDisabled: true,\n\t\t\t\tshowDeleted: true,\n\t\t\t\tsharedWithUser: true,\n\t\t\t\tfileActions: this._restoreShareAction(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._deletedFileList)\n\t\tthis._deletedFileList.appName = t('files_sharing', 'Deleted shares')\n\t\tthis._deletedFileList.$el.find('#emptycontent').html('
'\n\t\t\t+ '

' + t('files_sharing', 'No deleted shares') + '

'\n\t\t\t+ '

' + t('files_sharing', 'Shares you deleted will show up here') + '

')\n\t\treturn this._deletedFileList\n\t},\n\n\tinitSharingPening($el) {\n\t\tif (this._pendingFileList) {\n\t\t\treturn this._pendingFileList\n\t\t}\n\t\tthis._pendingFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.pending',\n\t\t\t\tshowPending: true,\n\t\t\t\tsharedWithUser: true,\n\t\t\t\tfileActions: this._acceptShareAction(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._pendingFileList)\n\t\tthis._pendingFileList.appName = t('files_sharing', 'Pending shares')\n\t\tthis._pendingFileList.$el.find('#emptycontent').html('
'\n\t\t\t+ '

' + t('files_sharing', 'No pending shares') + '

'\n\t\t\t+ '

' + t('files_sharing', 'Shares you have received but not confirmed will show up here') + '

')\n\t\treturn this._pendingFileList\n\t},\n\n\tinitShareingOverview($el) {\n\t\tif (this._overviewFileList) {\n\t\t\treturn this._overviewFileList\n\t\t}\n\t\tthis._overviewFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.overview',\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\tisOverview: true,\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._overviewFileList)\n\t\tthis._overviewFileList.appName = t('files_sharing', 'Shares')\n\t\tthis._overviewFileList.$el.find('#emptycontent').html('
'\n\t\t\t+ '

' + t('files_sharing', 'No shares') + '

'\n\t\t\t+ '

' + t('files_sharing', 'Shares will show up here') + '

')\n\t\treturn this._overviewFileList\n\t},\n\n\tremoveSharingIn() {\n\t\tif (this._inFileList) {\n\t\t\tthis._inFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingOut() {\n\t\tif (this._outFileList) {\n\t\t\tthis._outFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingLinks() {\n\t\tif (this._linkFileList) {\n\t\t\tthis._linkFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingDeleted() {\n\t\tif (this._deletedFileList) {\n\t\t\tthis._deletedFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingPending() {\n\t\tif (this._pendingFileList) {\n\t\t\tthis._pendingFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingOverview() {\n\t\tif (this._overviewFileList) {\n\t\t\tthis._overviewFileList.$fileList.empty()\n\t\t}\n\t},\n\n\t/**\n\t * Destroy the app\n\t */\n\tdestroy() {\n\t\tOCA.Files.fileActions.off('setDefault.app-sharing', this._onActionsUpdated)\n\t\tOCA.Files.fileActions.off('registerAction.app-sharing', this._onActionsUpdated)\n\t\tthis.removeSharingIn()\n\t\tthis.removeSharingOut()\n\t\tthis.removeSharingLinks()\n\t\tthis._inFileList = null\n\t\tthis._outFileList = null\n\t\tthis._linkFileList = null\n\t\tthis._overviewFileList = null\n\t\tdelete this._globalActionsInitialized\n\t},\n\n\t_createFileActions() {\n\t\t// inherit file actions from the files app\n\t\tconst fileActions = new OCA.Files.FileActions()\n\t\t// note: not merging the legacy actions because legacy apps are not\n\t\t// compatible with the sharing overview and need to be adapted first\n\t\tfileActions.registerDefaultActions()\n\t\tfileActions.merge(OCA.Files.fileActions)\n\n\t\tif (!this._globalActionsInitialized) {\n\t\t\t// in case actions are registered later\n\t\t\tthis._onActionsUpdated = _.bind(this._onActionsUpdated, this)\n\t\t\tOCA.Files.fileActions.on('setDefault.app-sharing', this._onActionsUpdated)\n\t\t\tOCA.Files.fileActions.on('registerAction.app-sharing', this._onActionsUpdated)\n\t\t\tthis._globalActionsInitialized = true\n\t\t}\n\n\t\t// when the user clicks on a folder, redirect to the corresponding\n\t\t// folder in the files app instead of opening it directly\n\t\tfileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function(filename, context) {\n\t\t\tOCA.Files.App.setActiveView('files', { silent: true })\n\t\t\tOCA.Files.App.fileList.changeDirectory(OC.joinPaths(context.$file.attr('data-path'), filename), true, true)\n\t\t})\n\t\tfileActions.setDefault('dir', 'Open')\n\t\treturn fileActions\n\t},\n\n\t_restoreShareAction() {\n\t\tconst fileActions = new OCA.Files.FileActions()\n\t\tfileActions.registerAction({\n\t\t\tname: 'Restore',\n\t\t\tdisplayName: t('files_sharing', 'Restore'),\n\t\t\taltText: t('files_sharing', 'Restore share'),\n\t\t\tmime: 'all',\n\t\t\tpermissions: OC.PERMISSION_ALL,\n\t\t\ticonClass: 'icon-history',\n\t\t\ttype: OCA.Files.FileActions.TYPE_INLINE,\n\t\t\tactionHandler(fileName, context) {\n\t\t\t\tconst shareId = context.$file.data('shareId')\n\t\t\t\t$.post(OC.linkToOCS('apps/files_sharing/api/v1/deletedshares', 2) + shareId)\n\t\t\t\t\t.success(function(result) {\n\t\t\t\t\t\tcontext.fileList.remove(context.fileInfoModel.attributes.name)\n\t\t\t\t\t}).fail(function() {\n\t\t\t\t\t\tOC.Notification.showTemporary(t('files_sharing', 'Something happened. Unable to restore the share.'))\n\t\t\t\t\t})\n\t\t\t},\n\t\t})\n\t\treturn fileActions\n\t},\n\n\t_acceptShareAction() {\n\t\tconst fileActions = new OCA.Files.FileActions()\n\t\tfileActions.registerAction({\n\t\t\tname: 'Accept share',\n\t\t\tdisplayName: t('files_sharing', 'Accept share'),\n\t\t\tmime: 'all',\n\t\t\tpermissions: OC.PERMISSION_ALL,\n\t\t\ticonClass: 'icon-checkmark',\n\t\t\ttype: OCA.Files.FileActions.TYPE_INLINE,\n\t\t\tactionHandler(fileName, context) {\n\t\t\t\tconst shareId = context.$file.data('shareId')\n\t\t\t\t$.post(OC.linkToOCS('apps/files_sharing/api/v1/shares/pending', 2) + shareId)\n\t\t\t\t\t.success(function(result) {\n\t\t\t\t\t\tcontext.fileList.remove(context.fileInfoModel.attributes.name)\n\t\t\t\t\t}).fail(function() {\n\t\t\t\t\t\tOC.Notification.showTemporary(t('files_sharing', 'Something happened. Unable to accept the share.'))\n\t\t\t\t\t})\n\t\t\t},\n\t\t})\n\t\tfileActions.registerAction({\n\t\t\tname: 'Reject share',\n\t\t\tdisplayName: t('files_sharing', 'Reject share'),\n\t\t\tmime: 'all',\n\t\t\tpermissions: OC.PERMISSION_ALL,\n\t\t\ticonClass: 'icon-close',\n\t\t\ttype: OCA.Files.FileActions.TYPE_INLINE,\n\t\t\tactionHandler(fileName, context) {\n\t\t\t\tconst shareId = context.$file.data('shareId')\n\t\t\t\t$.ajax({\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1/shares', 2) + shareId,\n\t\t\t\t\ttype: 'DELETE',\n\t\t\t\t}).success(function(result) {\n\t\t\t\t\tcontext.fileList.remove(context.fileInfoModel.attributes.name)\n\t\t\t\t}).fail(function() {\n\t\t\t\t\tOC.Notification.showTemporary(t('files_sharing', 'Something happened. Unable to reject the share.'))\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\t\treturn fileActions\n\t},\n\n\t_onActionsUpdated(ev) {\n\t\t_.each([this._inFileList, this._outFileList, this._linkFileList], function(list) {\n\t\t\tif (!list) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (ev.action) {\n\t\t\t\tlist.fileActions.registerAction(ev.action)\n\t\t\t} else if (ev.defaultAction) {\n\t\t\t\tlist.fileActions.setDefault(\n\t\t\t\t\tev.defaultAction.mime,\n\t\t\t\t\tev.defaultAction.name\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\t},\n\n\t_extendFileList(fileList) {\n\t\t// remove size column from summary\n\t\tfileList.fileSummary.$el.find('.filesize').remove()\n\t},\n}\n\nwindow.addEventListener('DOMContentLoaded', function() {\n\t$('#app-content-sharingin').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingIn($(e.target))\n\t})\n\t$('#app-content-sharingin').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingIn()\n\t})\n\t$('#app-content-sharingout').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingOut($(e.target))\n\t})\n\t$('#app-content-sharingout').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingOut()\n\t})\n\t$('#app-content-sharinglinks').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingLinks($(e.target))\n\t})\n\t$('#app-content-sharinglinks').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingLinks()\n\t})\n\t$('#app-content-deletedshares').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingDeleted($(e.target))\n\t})\n\t$('#app-content-deletedshares').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingDeleted()\n\t})\n\t$('#app-content-pendingshares').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingPening($(e.target))\n\t})\n\t$('#app-content-pendingshares').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingPending()\n\t})\n\t$('#app-content-shareoverview').on('show', function(e) {\n\t\tOCA.Sharing.App.initShareingOverview($(e.target))\n\t})\n\t$('#app-content-shareoverview').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingOverview()\n\t})\n})\n","/* eslint-disable */\n/*\n * Copyright (c) 2014 Vincent Petry \n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n(function() {\n\n\t/**\n\t * @class OCA.Sharing.FileList\n\t * @augments OCA.Files.FileList\n\t *\n\t * @classdesc Sharing file list.\n\t * Contains both \"shared with others\" and \"shared with you\" modes.\n\t *\n\t * @param $el container element with existing markup for the #controls\n\t * and a table\n\t * @param [options] map of options, see other parameters\n\t * @param {boolean} [options.sharedWithUser] true to return files shared with\n\t * the current user, false to return files that the user shared with others.\n\t * Defaults to false.\n\t * @param {boolean} [options.linksOnly] true to return only link shares\n\t */\n\tvar FileList = function($el, options) {\n\t\tthis.initialize($el, options)\n\t}\n\tFileList.prototype = _.extend({}, OCA.Files.FileList.prototype,\n\t\t/** @lends OCA.Sharing.FileList.prototype */ {\n\t\t\tappName: 'Shares',\n\n\t\t\t/**\n\t\t * Whether the list shows the files shared with the user (true) or\n\t\t * the files that the user shared with others (false).\n\t\t */\n\t\t\t_sharedWithUser: false,\n\t\t\t_linksOnly: false,\n\t\t\t_showDeleted: false,\n\t\t\t_showPending: false,\n\t\t\t_clientSideSort: true,\n\t\t\t_allowSelection: false,\n\t\t\t_isOverview: false,\n\n\t\t\t/**\n\t\t * @private\n\t\t */\n\t\t\tinitialize: function($el, options) {\n\t\t\t\tOCA.Files.FileList.prototype.initialize.apply(this, arguments)\n\t\t\t\tif (this.initialized) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// TODO: consolidate both options\n\t\t\t\tif (options && options.sharedWithUser) {\n\t\t\t\t\tthis._sharedWithUser = true\n\t\t\t\t}\n\t\t\t\tif (options && options.linksOnly) {\n\t\t\t\t\tthis._linksOnly = true\n\t\t\t\t}\n\t\t\t\tif (options && options.showDeleted) {\n\t\t\t\t\tthis._showDeleted = true\n\t\t\t\t}\n\t\t\t\tif (options && options.showPending) {\n\t\t\t\t\tthis._showPending = true\n\t\t\t\t}\n\t\t\t\tif (options && options.isOverview) {\n\t\t\t\t\tthis._isOverview = true\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t_renderRow: function() {\n\t\t\t// HACK: needed to call the overridden _renderRow\n\t\t\t// this is because at the time this class is created\n\t\t\t// the overriding hasn't been done yet...\n\t\t\t\treturn OCA.Files.FileList.prototype._renderRow.apply(this, arguments)\n\t\t\t},\n\n\t\t\t_createRow: function(fileData) {\n\t\t\t// TODO: hook earlier and render the whole row here\n\t\t\t\tvar $tr = OCA.Files.FileList.prototype._createRow.apply(this, arguments)\n\t\t\t\t$tr.find('.filesize').remove()\n\t\t\t\t$tr.find('td.date').before($tr.children('td:first'))\n\t\t\t\t$tr.find('td.filename input:checkbox').remove()\n\t\t\t\t$tr.attr('data-share-id', _.pluck(fileData.shares, 'id').join(','))\n\t\t\t\tif (this._sharedWithUser) {\n\t\t\t\t\t$tr.attr('data-share-owner', fileData.shareOwner)\n\t\t\t\t\t$tr.attr('data-mounttype', 'shared-root')\n\t\t\t\t\tvar permission = parseInt($tr.attr('data-permissions')) | OC.PERMISSION_DELETE\n\t\t\t\t\t$tr.attr('data-permissions', permission)\n\t\t\t\t}\n\t\t\t\tif (this._showDeleted || this._showPending) {\n\t\t\t\t\tvar permission = fileData.permissions\n\t\t\t\t\t$tr.attr('data-share-permissions', permission)\n\t\t\t\t}\n\n\t\t\t\t// add row with expiration date for link only shares - influenced by _createRow of filelist\n\t\t\t\tif (this._linksOnly) {\n\t\t\t\t\tvar expirationTimestamp = 0\n\t\t\t\t\tif (fileData.shares && fileData.shares[0].expiration !== null) {\n\t\t\t\t\t\texpirationTimestamp = moment(fileData.shares[0].expiration).valueOf()\n\t\t\t\t\t}\n\t\t\t\t\t$tr.attr('data-expiration', expirationTimestamp)\n\n\t\t\t\t\t// date column (1000 milliseconds to seconds, 60 seconds, 60 minutes, 24 hours)\n\t\t\t\t\t// difference in days multiplied by 5 - brightest shade for expiry dates in more than 32 days (160/5)\n\t\t\t\t\tvar modifiedColor = Math.round((expirationTimestamp - (new Date()).getTime()) / 1000 / 60 / 60 / 24 * 5)\n\t\t\t\t\t// ensure that the brightest color is still readable\n\t\t\t\t\tif (modifiedColor >= 160) {\n\t\t\t\t\t\tmodifiedColor = 160\n\t\t\t\t\t}\n\n\t\t\t\t\tvar formatted\n\t\t\t\t\tvar text\n\t\t\t\t\tif (expirationTimestamp > 0) {\n\t\t\t\t\t\tformatted = OC.Util.formatDate(expirationTimestamp)\n\t\t\t\t\t\ttext = OC.Util.relativeModifiedDate(expirationTimestamp)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tformatted = t('files_sharing', 'No expiration date set')\n\t\t\t\t\t\ttext = ''\n\t\t\t\t\t\tmodifiedColor = 160\n\t\t\t\t\t}\n\t\t\t\t\ttd = $('').attr({ 'class': 'date' })\n\t\t\t\t\ttd.append($('').attr({\n\t\t\t\t\t\t'class': 'modified',\n\t\t\t\t\t\t'title': formatted,\n\t\t\t\t\t\t'style': 'color:rgb(' + modifiedColor + ',' + modifiedColor + ',' + modifiedColor + ')'\n\t\t\t\t\t}).text(text)\n\t\t\t\t\t\t.tooltip({ placement: 'top' })\n\t\t\t\t\t)\n\n\t\t\t\t\t$tr.append(td)\n\t\t\t\t}\n\t\t\t\treturn $tr\n\t\t\t},\n\n\t\t\t/**\n\t\t * Set whether the list should contain outgoing shares\n\t\t * or incoming shares.\n\t\t *\n\t\t * @param state true for incoming shares, false otherwise\n\t\t */\n\t\t\tsetSharedWithUser: function(state) {\n\t\t\t\tthis._sharedWithUser = !!state\n\t\t\t},\n\n\t\t\tupdateEmptyContent: function() {\n\t\t\t\tvar dir = this.getCurrentDirectory()\n\t\t\t\tif (dir === '/') {\n\t\t\t\t// root has special permissions\n\t\t\t\t\tthis.$el.find('#emptycontent').toggleClass('hidden', !this.isEmpty)\n\t\t\t\t\tthis.$el.find('#filestable thead th').toggleClass('hidden', this.isEmpty)\n\n\t\t\t\t\t// hide expiration date header for non link only shares\n\t\t\t\t\tif (!this._linksOnly) {\n\t\t\t\t\t\tthis.$el.find('th.column-expiration').addClass('hidden')\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tOCA.Files.FileList.prototype.updateEmptyContent.apply(this, arguments)\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tgetDirectoryPermissions: function() {\n\t\t\t\treturn OC.PERMISSION_READ | OC.PERMISSION_DELETE\n\t\t\t},\n\n\t\t\tupdateStorageStatistics: function() {\n\t\t\t// no op because it doesn't have\n\t\t\t// storage info like free space / used space\n\t\t\t},\n\n\t\t\tupdateRow: function($tr, fileInfo, options) {\n\t\t\t// no-op, suppress re-rendering\n\t\t\t\treturn $tr\n\t\t\t},\n\n\t\t\treload: function() {\n\t\t\t\tthis.showMask()\n\t\t\t\tif (this._reloadCall) {\n\t\t\t\t\tthis._reloadCall.abort()\n\t\t\t\t}\n\n\t\t\t\t// there is only root\n\t\t\t\tthis._setCurrentDir('/', false)\n\n\t\t\t\tvar promises = []\n\n\t\t\t\tvar deletedShares = {\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1', 2) + 'deletedshares',\n\t\t\t\t\t/* jshint camelcase: false */\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tformat: 'json',\n\t\t\t\t\t\tinclude_tags: true\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\tbeforeSend: function(xhr) {\n\t\t\t\t\t\txhr.setRequestHeader('OCS-APIREQUEST', 'true')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar pendingShares = {\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1/shares', 2) + 'pending',\n\t\t\t\t\t/* jshint camelcase: false */\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tformat: 'json'\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\tbeforeSend: function(xhr) {\n\t\t\t\t\t\txhr.setRequestHeader('OCS-APIREQUEST', 'true')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar shares = {\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1') + 'shares',\n\t\t\t\t\t/* jshint camelcase: false */\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tformat: 'json',\n\t\t\t\t\t\tshared_with_me: this._sharedWithUser !== false,\n\t\t\t\t\t\tinclude_tags: true\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\tbeforeSend: function(xhr) {\n\t\t\t\t\t\txhr.setRequestHeader('OCS-APIREQUEST', 'true')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar remoteShares = {\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1') + 'remote_shares',\n\t\t\t\t\t/* jshint camelcase: false */\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tformat: 'json',\n\t\t\t\t\t\tinclude_tags: true\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\tbeforeSend: function(xhr) {\n\t\t\t\t\t\txhr.setRequestHeader('OCS-APIREQUEST', 'true')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Add the proper ajax requests to the list and run them\n\t\t\t\t// and make sure we have 2 promises\n\t\t\t\tif (this._showDeleted) {\n\t\t\t\t\tpromises.push($.ajax(deletedShares))\n\t\t\t\t} else if (this._showPending) {\n\t\t\t\t\tpromises.push($.ajax(pendingShares))\n\t\t\t\t} else {\n\t\t\t\t\tpromises.push($.ajax(shares))\n\n\t\t\t\t\tif (this._sharedWithUser !== false || this._isOverview) {\n\t\t\t\t\t\tpromises.push($.ajax(remoteShares))\n\t\t\t\t\t}\n\t\t\t\t\tif (this._isOverview) {\n\t\t\t\t\t\tshares.data.shared_with_me = !shares.data.shared_with_me\n\t\t\t\t\t\tpromises.push($.ajax(shares))\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis._reloadCall = $.when.apply($, promises)\n\t\t\t\tvar callBack = this.reloadCallback.bind(this)\n\t\t\t\treturn this._reloadCall.then(callBack, callBack)\n\t\t\t},\n\n\t\t\treloadCallback: function(shares, remoteShares, additionalShares) {\n\t\t\t\tdelete this._reloadCall\n\t\t\t\tthis.hideMask()\n\n\t\t\t\tthis.$el.find('#headerSharedWith').text(\n\t\t\t\t\tt('files_sharing', this._sharedWithUser ? 'Shared by' : 'Shared with')\n\t\t\t\t)\n\n\t\t\t\tvar files = []\n\n\t\t\t\t// make sure to use the same format\n\t\t\t\tif (shares[0] && shares[0].ocs) {\n\t\t\t\t\tshares = shares[0]\n\t\t\t\t}\n\t\t\t\tif (remoteShares && remoteShares[0] && remoteShares[0].ocs) {\n\t\t\t\t\tremoteShares = remoteShares[0]\n\t\t\t\t}\n\t\t\t\tif (additionalShares && additionalShares[0] && additionalShares[0].ocs) {\n\t\t\t\t\tadditionalShares = additionalShares[0]\n\t\t\t\t}\n\n\t\t\t\tif (shares.ocs && shares.ocs.data) {\n\t\t\t\t\tfiles = files.concat(this._makeFilesFromShares(shares.ocs.data, this._sharedWithUser))\n\t\t\t\t}\n\n\t\t\t\tif (remoteShares && remoteShares.ocs && remoteShares.ocs.data) {\n\t\t\t\t\tfiles = files.concat(this._makeFilesFromRemoteShares(remoteShares.ocs.data))\n\t\t\t\t}\n\n\t\t\t\tif (additionalShares && additionalShares.ocs && additionalShares.ocs.data) {\n\t\t\t\t\tfiles = files.concat(this._makeFilesFromShares(additionalShares.ocs.data, !this._sharedWithUser))\n\t\t\t\t}\n\n\t\t\t\tthis.setFiles(files)\n\t\t\t\treturn true\n\t\t\t},\n\n\t\t\t_makeFilesFromRemoteShares: function(data) {\n\t\t\t\tvar files = data\n\n\t\t\t\tfiles = _.chain(files)\n\t\t\t\t// convert share data to file data\n\t\t\t\t\t.map(function(share) {\n\t\t\t\t\t\tvar file = {\n\t\t\t\t\t\t\tshareOwner: share.owner + '@' + share.remote.replace(/.*?:\\/\\//g, ''),\n\t\t\t\t\t\t\tname: OC.basename(share.mountpoint),\n\t\t\t\t\t\t\tmtime: share.mtime * 1000,\n\t\t\t\t\t\t\tmimetype: share.mimetype,\n\t\t\t\t\t\t\ttype: share.type,\n\t\t\t\t\t\t\tid: share.file_id,\n\t\t\t\t\t\t\tpath: OC.dirname(share.mountpoint),\n\t\t\t\t\t\t\tpermissions: share.permissions,\n\t\t\t\t\t\t\ttags: share.tags || []\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfile.shares = [{\n\t\t\t\t\t\t\tid: share.id,\n\t\t\t\t\t\t\ttype: OC.Share.SHARE_TYPE_REMOTE\n\t\t\t\t\t\t}]\n\t\t\t\t\t\treturn file\n\t\t\t\t\t})\n\t\t\t\t\t.value()\n\t\t\t\treturn files\n\t\t\t},\n\n\t\t\t/**\n\t\t * Converts the OCS API share response data to a file info\n\t\t * list\n\t\t * @param {Array} data OCS API share array\n\t\t * @param {bool} sharedWithUser\n\t\t * @returns {Array.} array of shared file info\n\t\t */\n\t\t\t_makeFilesFromShares: function(data, sharedWithUser) {\n\t\t\t/* jshint camelcase: false */\n\t\t\t\tvar files = data\n\n\t\t\t\tif (this._linksOnly) {\n\t\t\t\t\tfiles = _.filter(data, function(share) {\n\t\t\t\t\t\treturn share.share_type === OC.Share.SHARE_TYPE_LINK\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\t// OCS API uses non-camelcased names\n\t\t\t\tfiles = _.chain(files)\n\t\t\t\t// convert share data to file data\n\t\t\t\t\t.map(function(share) {\n\t\t\t\t\t// TODO: use OC.Files.FileInfo\n\t\t\t\t\t\tvar file = {\n\t\t\t\t\t\t\tid: share.file_source,\n\t\t\t\t\t\t\ticon: OC.MimeType.getIconUrl(share.mimetype),\n\t\t\t\t\t\t\tmimetype: share.mimetype,\n\t\t\t\t\t\t\ttags: share.tags || []\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (share.item_type === 'folder') {\n\t\t\t\t\t\t\tfile.type = 'dir'\n\t\t\t\t\t\t\tfile.mimetype = 'httpd/unix-directory'\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfile.type = 'file'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfile.share = {\n\t\t\t\t\t\t\tid: share.id,\n\t\t\t\t\t\t\ttype: share.share_type,\n\t\t\t\t\t\t\ttarget: share.share_with,\n\t\t\t\t\t\t\tstime: share.stime * 1000,\n\t\t\t\t\t\t\texpiration: share.expiration\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (sharedWithUser) {\n\t\t\t\t\t\t\tfile.shareOwner = share.displayname_owner\n\t\t\t\t\t\t\tfile.shareOwnerId = share.uid_owner\n\t\t\t\t\t\t\tfile.name = OC.basename(share.file_target)\n\t\t\t\t\t\t\tfile.path = OC.dirname(share.file_target)\n\t\t\t\t\t\t\tfile.permissions = share.permissions\n\t\t\t\t\t\t\tif (file.path) {\n\t\t\t\t\t\t\t\tfile.extraData = share.file_target\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (share.share_type !== OC.Share.SHARE_TYPE_LINK) {\n\t\t\t\t\t\t\t\tfile.share.targetDisplayName = share.share_with_displayname\n\t\t\t\t\t\t\t\tfile.share.targetShareWithId = share.share_with\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfile.name = OC.basename(share.path)\n\t\t\t\t\t\t\tfile.path = OC.dirname(share.path)\n\t\t\t\t\t\t\tfile.permissions = OC.PERMISSION_ALL\n\t\t\t\t\t\t\tif (file.path) {\n\t\t\t\t\t\t\t\tfile.extraData = share.path\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn file\n\t\t\t\t\t})\n\t\t\t\t// Group all files and have a \"shares\" array with\n\t\t\t\t// the share info for each file.\n\t\t\t\t//\n\t\t\t\t// This uses a hash memo to cumulate share information\n\t\t\t\t// inside the same file object (by file id).\n\t\t\t\t\t.reduce(function(memo, file) {\n\t\t\t\t\t\tvar data = memo[file.id]\n\t\t\t\t\t\tvar recipient = file.share.targetDisplayName\n\t\t\t\t\t\tvar recipientId = file.share.targetShareWithId\n\t\t\t\t\t\tif (!data) {\n\t\t\t\t\t\t\tdata = memo[file.id] = file\n\t\t\t\t\t\t\tdata.shares = [file.share]\n\t\t\t\t\t\t\t// using a hash to make them unique,\n\t\t\t\t\t\t\t// this is only a list to be displayed\n\t\t\t\t\t\t\tdata.recipients = {}\n\t\t\t\t\t\t\tdata.recipientData = {}\n\t\t\t\t\t\t\t// share types\n\t\t\t\t\t\t\tdata.shareTypes = {}\n\t\t\t\t\t\t\t// counter is cheaper than calling _.keys().length\n\t\t\t\t\t\t\tdata.recipientsCount = 0\n\t\t\t\t\t\t\tdata.mtime = file.share.stime\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t// always take the most recent stime\n\t\t\t\t\t\t\tif (file.share.stime > data.mtime) {\n\t\t\t\t\t\t\t\tdata.mtime = file.share.stime\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdata.shares.push(file.share)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (recipient) {\n\t\t\t\t\t\t// limit counterparts for output\n\t\t\t\t\t\t\tif (data.recipientsCount < 4) {\n\t\t\t\t\t\t\t// only store the first ones, they will be the only ones\n\t\t\t\t\t\t\t// displayed\n\t\t\t\t\t\t\t\tdata.recipients[recipient] = true\n\t\t\t\t\t\t\t\tdata.recipientData[data.recipientsCount] = {\n\t\t\t\t\t\t\t\t\t'shareWith': recipientId,\n\t\t\t\t\t\t\t\t\t'shareWithDisplayName': recipient\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdata.recipientsCount++\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata.shareTypes[file.share.type] = true\n\n\t\t\t\t\t\tdelete file.share\n\t\t\t\t\t\treturn memo\n\t\t\t\t\t}, {})\n\t\t\t\t// Retrieve only the values of the returned hash\n\t\t\t\t\t.values()\n\t\t\t\t// Clean up\n\t\t\t\t\t.each(function(data) {\n\t\t\t\t\t// convert the recipients map to a flat\n\t\t\t\t\t// array of sorted names\n\t\t\t\t\t\tdata.mountType = 'shared'\n\t\t\t\t\t\tdelete data.recipientsCount\n\t\t\t\t\t\tif (sharedWithUser) {\n\t\t\t\t\t\t// only for outgoing shares\n\t\t\t\t\t\t\tdelete data.shareTypes\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdata.shareTypes = _.keys(data.shareTypes)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t// Finish the chain by getting the result\n\t\t\t\t\t.value()\n\n\t\t\t\t// Sort by expected sort comparator\n\t\t\t\treturn files.sort(this._sortComparator)\n\t\t\t}\n\t\t})\n\n\t/**\n\t * Share info attributes.\n\t *\n\t * @typedef {Object} OCA.Sharing.ShareInfo\n\t *\n\t * @property {int} id share ID\n\t * @property {int} type share type\n\t * @property {String} target share target, either user name or group name\n\t * @property {int} stime share timestamp in milliseconds\n\t * @property {String} [targetDisplayName] display name of the recipient\n\t * (only when shared with others)\n\t * @property {String} [targetShareWithId] id of the recipient\n\t *\n\t */\n\n\t/**\n\t * Recipient attributes\n\t *\n\t * @typedef {Object} OCA.Sharing.RecipientInfo\n\t * @property {String} shareWith the id of the recipient\n\t * @property {String} shareWithDisplayName the display name of the recipient\n\t */\n\n\t/**\n\t * Shared file info attributes.\n\t *\n\t * @typedef {OCA.Files.FileInfo} OCA.Sharing.SharedFileInfo\n\t *\n\t * @property {Array.} shares array of shares for\n\t * this file\n\t * @property {int} mtime most recent share time (if multiple shares)\n\t * @property {String} shareOwner name of the share owner\n\t * @property {Array.} recipients name of the first 4 recipients\n\t * (this is mostly for display purposes)\n\t * @property {Object.} recipientData (as object for easier\n\t * passing to HTML data attributes with jQuery)\n\t */\n\n\tOCA.Sharing.FileList = FileList\n})()\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./apps/files_sharing/src/files_sharing.js","webpack:///./apps/files_sharing/js/app.js","webpack:///./apps/files_sharing/js/sharedfilelist.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","__webpack_nonce__","btoa","OC","requestToken","__webpack_public_path__","linkTo","OCA","Sharing","App","_inFileList","_outFileList","_overviewFileList","_pendingFileList","initSharingIn","$el","this","FileList","id","sharedWithUser","fileActions","_createFileActions","config","Files","getFilesConfig","shown","_extendFileList","appName","find","html","initSharingOut","initSharingLinks","_linkFileList","linksOnly","initSharingDeleted","_deletedFileList","defaultFileActionsDisabled","showDeleted","_restoreShareAction","initSharingPening","showPending","_acceptShareAction","initShareingOverview","isOverview","removeSharingIn","$fileList","empty","removeSharingOut","removeSharingLinks","removeSharingDeleted","removeSharingPending","removeSharingOverview","destroy","off","_onActionsUpdated","_globalActionsInitialized","FileActions","registerDefaultActions","merge","_","on","register","PERMISSION_READ","filename","context","setActiveView","silent","fileList","changeDirectory","joinPaths","$file","attr","setDefault","registerAction","displayName","altText","mime","permissions","PERMISSION_ALL","iconClass","type","TYPE_INLINE","actionHandler","fileName","shareId","data","$","post","linkToOCS","success","result","remove","fileInfoModel","attributes","fail","Notification","showTemporary","ajax","url","ev","each","list","action","defaultAction","fileSummary","window","addEventListener","e","target","options","initialize","extend","_sharedWithUser","_linksOnly","_showDeleted","_showPending","_clientSideSort","_allowSelection","_isOverview","apply","arguments","initialized","_renderRow","_createRow","fileData","$tr","before","children","pluck","shares","join","shareOwner","permission","parseInt","PERMISSION_DELETE","expirationTimestamp","expiration","moment","valueOf","formatted","text","modifiedColor","Math","round","Date","getTime","Util","formatDate","relativeModifiedDate","td","append","tooltip","placement","setSharedWithUser","state","updateEmptyContent","dir","getCurrentDirectory","toggleClass","isEmpty","addClass","getDirectoryPermissions","updateStorageStatistics","updateRow","fileInfo","reload","showMask","_reloadCall","abort","_setCurrentDir","promises","deletedShares","format","include_tags","beforeSend","xhr","setRequestHeader","pendingShares","shared_with_me","remoteShares","push","when","callBack","reloadCallback","then","additionalShares","hideMask","files","ocs","concat","_makeFilesFromShares","_makeFilesFromRemoteShares","setFiles","chain","map","share","file","owner","remote","replace","basename","mountpoint","mtime","mimetype","file_id","path","dirname","tags","Share","SHARE_TYPE_REMOTE","filter","share_type","SHARE_TYPE_LINK","file_source","icon","MimeType","getIconUrl","hasPreview","has_preview","item_type","share_with","stime","displayname_owner","shareOwnerId","uid_owner","file_target","extraData","targetDisplayName","share_with_displayname","targetShareWithId","reduce","memo","recipient","recipientId","recipients","recipientData","shareTypes","recipientsCount","values","mountType","keys","sort","_sortComparator"],"mappings":"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","file":"files_sharing.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/js/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 274);\n","import '../js/app'\nimport '../js/sharedfilelist'\n\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(OC.requestToken)\n\n// eslint-disable-next-line camelcase\n__webpack_public_path__ = OC.linkTo('files_sharing', 'js/dist/')\n","/**\n * Copyright (c) 2014 Vincent Petry \n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n\nif (!OCA.Sharing) {\n\t/**\n\t * @namespace OCA.Sharing\n\t */\n\tOCA.Sharing = {}\n}\n\n/**\n * @namespace\n */\nOCA.Sharing.App = {\n\n\t_inFileList: null,\n\t_outFileList: null,\n\t_overviewFileList: null,\n\t_pendingFileList: null,\n\n\tinitSharingIn($el) {\n\t\tif (this._inFileList) {\n\t\t\treturn this._inFileList\n\t\t}\n\n\t\tthis._inFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.self',\n\t\t\t\tsharedWithUser: true,\n\t\t\t\tfileActions: this._createFileActions(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._inFileList)\n\t\tthis._inFileList.appName = t('files_sharing', 'Shared with you')\n\t\tthis._inFileList.$el.find('#emptycontent').html('
'\n\t\t\t+ '

' + t('files_sharing', 'Nothing shared with you yet') + '

'\n\t\t\t+ '

' + t('files_sharing', 'Files and folders others share with you will show up here') + '

')\n\t\treturn this._inFileList\n\t},\n\n\tinitSharingOut($el) {\n\t\tif (this._outFileList) {\n\t\t\treturn this._outFileList\n\t\t}\n\t\tthis._outFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.others',\n\t\t\t\tsharedWithUser: false,\n\t\t\t\tfileActions: this._createFileActions(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._outFileList)\n\t\tthis._outFileList.appName = t('files_sharing', 'Shared with others')\n\t\tthis._outFileList.$el.find('#emptycontent').html('
'\n\t\t\t+ '

' + t('files_sharing', 'Nothing shared yet') + '

'\n\t\t\t+ '

' + t('files_sharing', 'Files and folders you share will show up here') + '

')\n\t\treturn this._outFileList\n\t},\n\n\tinitSharingLinks($el) {\n\t\tif (this._linkFileList) {\n\t\t\treturn this._linkFileList\n\t\t}\n\t\tthis._linkFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.link',\n\t\t\t\tlinksOnly: true,\n\t\t\t\tfileActions: this._createFileActions(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._linkFileList)\n\t\tthis._linkFileList.appName = t('files_sharing', 'Shared by link')\n\t\tthis._linkFileList.$el.find('#emptycontent').html('
'\n\t\t\t+ '

' + t('files_sharing', 'No shared links') + '

'\n\t\t\t+ '

' + t('files_sharing', 'Files and folders you share by link will show up here') + '

')\n\t\treturn this._linkFileList\n\t},\n\n\tinitSharingDeleted($el) {\n\t\tif (this._deletedFileList) {\n\t\t\treturn this._deletedFileList\n\t\t}\n\t\tthis._deletedFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.deleted',\n\t\t\t\tdefaultFileActionsDisabled: true,\n\t\t\t\tshowDeleted: true,\n\t\t\t\tsharedWithUser: true,\n\t\t\t\tfileActions: this._restoreShareAction(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._deletedFileList)\n\t\tthis._deletedFileList.appName = t('files_sharing', 'Deleted shares')\n\t\tthis._deletedFileList.$el.find('#emptycontent').html('
'\n\t\t\t+ '

' + t('files_sharing', 'No deleted shares') + '

'\n\t\t\t+ '

' + t('files_sharing', 'Shares you deleted will show up here') + '

')\n\t\treturn this._deletedFileList\n\t},\n\n\tinitSharingPening($el) {\n\t\tif (this._pendingFileList) {\n\t\t\treturn this._pendingFileList\n\t\t}\n\t\tthis._pendingFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.pending',\n\t\t\t\tshowPending: true,\n\t\t\t\tsharedWithUser: true,\n\t\t\t\tfileActions: this._acceptShareAction(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._pendingFileList)\n\t\tthis._pendingFileList.appName = t('files_sharing', 'Pending shares')\n\t\tthis._pendingFileList.$el.find('#emptycontent').html('
'\n\t\t\t+ '

' + t('files_sharing', 'No pending shares') + '

'\n\t\t\t+ '

' + t('files_sharing', 'Shares you have received but not confirmed will show up here') + '

')\n\t\treturn this._pendingFileList\n\t},\n\n\tinitShareingOverview($el) {\n\t\tif (this._overviewFileList) {\n\t\t\treturn this._overviewFileList\n\t\t}\n\t\tthis._overviewFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.overview',\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\tisOverview: true,\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._overviewFileList)\n\t\tthis._overviewFileList.appName = t('files_sharing', 'Shares')\n\t\tthis._overviewFileList.$el.find('#emptycontent').html('
'\n\t\t\t+ '

' + t('files_sharing', 'No shares') + '

'\n\t\t\t+ '

' + t('files_sharing', 'Shares will show up here') + '

')\n\t\treturn this._overviewFileList\n\t},\n\n\tremoveSharingIn() {\n\t\tif (this._inFileList) {\n\t\t\tthis._inFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingOut() {\n\t\tif (this._outFileList) {\n\t\t\tthis._outFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingLinks() {\n\t\tif (this._linkFileList) {\n\t\t\tthis._linkFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingDeleted() {\n\t\tif (this._deletedFileList) {\n\t\t\tthis._deletedFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingPending() {\n\t\tif (this._pendingFileList) {\n\t\t\tthis._pendingFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingOverview() {\n\t\tif (this._overviewFileList) {\n\t\t\tthis._overviewFileList.$fileList.empty()\n\t\t}\n\t},\n\n\t/**\n\t * Destroy the app\n\t */\n\tdestroy() {\n\t\tOCA.Files.fileActions.off('setDefault.app-sharing', this._onActionsUpdated)\n\t\tOCA.Files.fileActions.off('registerAction.app-sharing', this._onActionsUpdated)\n\t\tthis.removeSharingIn()\n\t\tthis.removeSharingOut()\n\t\tthis.removeSharingLinks()\n\t\tthis._inFileList = null\n\t\tthis._outFileList = null\n\t\tthis._linkFileList = null\n\t\tthis._overviewFileList = null\n\t\tdelete this._globalActionsInitialized\n\t},\n\n\t_createFileActions() {\n\t\t// inherit file actions from the files app\n\t\tconst fileActions = new OCA.Files.FileActions()\n\t\t// note: not merging the legacy actions because legacy apps are not\n\t\t// compatible with the sharing overview and need to be adapted first\n\t\tfileActions.registerDefaultActions()\n\t\tfileActions.merge(OCA.Files.fileActions)\n\n\t\tif (!this._globalActionsInitialized) {\n\t\t\t// in case actions are registered later\n\t\t\tthis._onActionsUpdated = _.bind(this._onActionsUpdated, this)\n\t\t\tOCA.Files.fileActions.on('setDefault.app-sharing', this._onActionsUpdated)\n\t\t\tOCA.Files.fileActions.on('registerAction.app-sharing', this._onActionsUpdated)\n\t\t\tthis._globalActionsInitialized = true\n\t\t}\n\n\t\t// when the user clicks on a folder, redirect to the corresponding\n\t\t// folder in the files app instead of opening it directly\n\t\tfileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function(filename, context) {\n\t\t\tOCA.Files.App.setActiveView('files', { silent: true })\n\t\t\tOCA.Files.App.fileList.changeDirectory(OC.joinPaths(context.$file.attr('data-path'), filename), true, true)\n\t\t})\n\t\tfileActions.setDefault('dir', 'Open')\n\t\treturn fileActions\n\t},\n\n\t_restoreShareAction() {\n\t\tconst fileActions = new OCA.Files.FileActions()\n\t\tfileActions.registerAction({\n\t\t\tname: 'Restore',\n\t\t\tdisplayName: t('files_sharing', 'Restore'),\n\t\t\taltText: t('files_sharing', 'Restore share'),\n\t\t\tmime: 'all',\n\t\t\tpermissions: OC.PERMISSION_ALL,\n\t\t\ticonClass: 'icon-history',\n\t\t\ttype: OCA.Files.FileActions.TYPE_INLINE,\n\t\t\tactionHandler(fileName, context) {\n\t\t\t\tconst shareId = context.$file.data('shareId')\n\t\t\t\t$.post(OC.linkToOCS('apps/files_sharing/api/v1/deletedshares', 2) + shareId)\n\t\t\t\t\t.success(function(result) {\n\t\t\t\t\t\tcontext.fileList.remove(context.fileInfoModel.attributes.name)\n\t\t\t\t\t}).fail(function() {\n\t\t\t\t\t\tOC.Notification.showTemporary(t('files_sharing', 'Something happened. Unable to restore the share.'))\n\t\t\t\t\t})\n\t\t\t},\n\t\t})\n\t\treturn fileActions\n\t},\n\n\t_acceptShareAction() {\n\t\tconst fileActions = new OCA.Files.FileActions()\n\t\tfileActions.registerAction({\n\t\t\tname: 'Accept share',\n\t\t\tdisplayName: t('files_sharing', 'Accept share'),\n\t\t\tmime: 'all',\n\t\t\tpermissions: OC.PERMISSION_ALL,\n\t\t\ticonClass: 'icon-checkmark',\n\t\t\ttype: OCA.Files.FileActions.TYPE_INLINE,\n\t\t\tactionHandler(fileName, context) {\n\t\t\t\tconst shareId = context.$file.data('shareId')\n\t\t\t\t$.post(OC.linkToOCS('apps/files_sharing/api/v1/shares/pending', 2) + shareId)\n\t\t\t\t\t.success(function(result) {\n\t\t\t\t\t\tcontext.fileList.remove(context.fileInfoModel.attributes.name)\n\t\t\t\t\t}).fail(function() {\n\t\t\t\t\t\tOC.Notification.showTemporary(t('files_sharing', 'Something happened. Unable to accept the share.'))\n\t\t\t\t\t})\n\t\t\t},\n\t\t})\n\t\tfileActions.registerAction({\n\t\t\tname: 'Reject share',\n\t\t\tdisplayName: t('files_sharing', 'Reject share'),\n\t\t\tmime: 'all',\n\t\t\tpermissions: OC.PERMISSION_ALL,\n\t\t\ticonClass: 'icon-close',\n\t\t\ttype: OCA.Files.FileActions.TYPE_INLINE,\n\t\t\tactionHandler(fileName, context) {\n\t\t\t\tconst shareId = context.$file.data('shareId')\n\t\t\t\t$.ajax({\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1/shares', 2) + shareId,\n\t\t\t\t\ttype: 'DELETE',\n\t\t\t\t}).success(function(result) {\n\t\t\t\t\tcontext.fileList.remove(context.fileInfoModel.attributes.name)\n\t\t\t\t}).fail(function() {\n\t\t\t\t\tOC.Notification.showTemporary(t('files_sharing', 'Something happened. Unable to reject the share.'))\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\t\treturn fileActions\n\t},\n\n\t_onActionsUpdated(ev) {\n\t\t_.each([this._inFileList, this._outFileList, this._linkFileList], function(list) {\n\t\t\tif (!list) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (ev.action) {\n\t\t\t\tlist.fileActions.registerAction(ev.action)\n\t\t\t} else if (ev.defaultAction) {\n\t\t\t\tlist.fileActions.setDefault(\n\t\t\t\t\tev.defaultAction.mime,\n\t\t\t\t\tev.defaultAction.name\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\t},\n\n\t_extendFileList(fileList) {\n\t\t// remove size column from summary\n\t\tfileList.fileSummary.$el.find('.filesize').remove()\n\t},\n}\n\nwindow.addEventListener('DOMContentLoaded', function() {\n\t$('#app-content-sharingin').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingIn($(e.target))\n\t})\n\t$('#app-content-sharingin').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingIn()\n\t})\n\t$('#app-content-sharingout').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingOut($(e.target))\n\t})\n\t$('#app-content-sharingout').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingOut()\n\t})\n\t$('#app-content-sharinglinks').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingLinks($(e.target))\n\t})\n\t$('#app-content-sharinglinks').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingLinks()\n\t})\n\t$('#app-content-deletedshares').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingDeleted($(e.target))\n\t})\n\t$('#app-content-deletedshares').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingDeleted()\n\t})\n\t$('#app-content-pendingshares').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingPening($(e.target))\n\t})\n\t$('#app-content-pendingshares').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingPending()\n\t})\n\t$('#app-content-shareoverview').on('show', function(e) {\n\t\tOCA.Sharing.App.initShareingOverview($(e.target))\n\t})\n\t$('#app-content-shareoverview').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingOverview()\n\t})\n})\n","/* eslint-disable */\n/*\n * Copyright (c) 2014 Vincent Petry \n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n(function() {\n\n\t/**\n\t * @class OCA.Sharing.FileList\n\t * @augments OCA.Files.FileList\n\t *\n\t * @classdesc Sharing file list.\n\t * Contains both \"shared with others\" and \"shared with you\" modes.\n\t *\n\t * @param $el container element with existing markup for the #controls\n\t * and a table\n\t * @param [options] map of options, see other parameters\n\t * @param {boolean} [options.sharedWithUser] true to return files shared with\n\t * the current user, false to return files that the user shared with others.\n\t * Defaults to false.\n\t * @param {boolean} [options.linksOnly] true to return only link shares\n\t */\n\tvar FileList = function($el, options) {\n\t\tthis.initialize($el, options)\n\t}\n\tFileList.prototype = _.extend({}, OCA.Files.FileList.prototype,\n\t\t/** @lends OCA.Sharing.FileList.prototype */ {\n\t\t\tappName: 'Shares',\n\n\t\t\t/**\n\t\t * Whether the list shows the files shared with the user (true) or\n\t\t * the files that the user shared with others (false).\n\t\t */\n\t\t\t_sharedWithUser: false,\n\t\t\t_linksOnly: false,\n\t\t\t_showDeleted: false,\n\t\t\t_showPending: false,\n\t\t\t_clientSideSort: true,\n\t\t\t_allowSelection: false,\n\t\t\t_isOverview: false,\n\n\t\t\t/**\n\t\t * @private\n\t\t */\n\t\t\tinitialize: function($el, options) {\n\t\t\t\tOCA.Files.FileList.prototype.initialize.apply(this, arguments)\n\t\t\t\tif (this.initialized) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// TODO: consolidate both options\n\t\t\t\tif (options && options.sharedWithUser) {\n\t\t\t\t\tthis._sharedWithUser = true\n\t\t\t\t}\n\t\t\t\tif (options && options.linksOnly) {\n\t\t\t\t\tthis._linksOnly = true\n\t\t\t\t}\n\t\t\t\tif (options && options.showDeleted) {\n\t\t\t\t\tthis._showDeleted = true\n\t\t\t\t}\n\t\t\t\tif (options && options.showPending) {\n\t\t\t\t\tthis._showPending = true\n\t\t\t\t}\n\t\t\t\tif (options && options.isOverview) {\n\t\t\t\t\tthis._isOverview = true\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t_renderRow: function() {\n\t\t\t// HACK: needed to call the overridden _renderRow\n\t\t\t// this is because at the time this class is created\n\t\t\t// the overriding hasn't been done yet...\n\t\t\t\treturn OCA.Files.FileList.prototype._renderRow.apply(this, arguments)\n\t\t\t},\n\n\t\t\t_createRow: function(fileData) {\n\t\t\t// TODO: hook earlier and render the whole row here\n\t\t\t\tvar $tr = OCA.Files.FileList.prototype._createRow.apply(this, arguments)\n\t\t\t\t$tr.find('.filesize').remove()\n\t\t\t\t$tr.find('td.date').before($tr.children('td:first'))\n\t\t\t\t$tr.find('td.filename input:checkbox').remove()\n\t\t\t\t$tr.attr('data-share-id', _.pluck(fileData.shares, 'id').join(','))\n\t\t\t\tif (this._sharedWithUser) {\n\t\t\t\t\t$tr.attr('data-share-owner', fileData.shareOwner)\n\t\t\t\t\t$tr.attr('data-mounttype', 'shared-root')\n\t\t\t\t\tvar permission = parseInt($tr.attr('data-permissions')) | OC.PERMISSION_DELETE\n\t\t\t\t\t$tr.attr('data-permissions', permission)\n\t\t\t\t}\n\t\t\t\tif (this._showDeleted || this._showPending) {\n\t\t\t\t\tvar permission = fileData.permissions\n\t\t\t\t\t$tr.attr('data-share-permissions', permission)\n\t\t\t\t}\n\n\t\t\t\t// add row with expiration date for link only shares - influenced by _createRow of filelist\n\t\t\t\tif (this._linksOnly) {\n\t\t\t\t\tvar expirationTimestamp = 0\n\t\t\t\t\tif (fileData.shares && fileData.shares[0].expiration !== null) {\n\t\t\t\t\t\texpirationTimestamp = moment(fileData.shares[0].expiration).valueOf()\n\t\t\t\t\t}\n\t\t\t\t\t$tr.attr('data-expiration', expirationTimestamp)\n\n\t\t\t\t\t// date column (1000 milliseconds to seconds, 60 seconds, 60 minutes, 24 hours)\n\t\t\t\t\t// difference in days multiplied by 5 - brightest shade for expiry dates in more than 32 days (160/5)\n\t\t\t\t\tvar modifiedColor = Math.round((expirationTimestamp - (new Date()).getTime()) / 1000 / 60 / 60 / 24 * 5)\n\t\t\t\t\t// ensure that the brightest color is still readable\n\t\t\t\t\tif (modifiedColor >= 160) {\n\t\t\t\t\t\tmodifiedColor = 160\n\t\t\t\t\t}\n\n\t\t\t\t\tvar formatted\n\t\t\t\t\tvar text\n\t\t\t\t\tif (expirationTimestamp > 0) {\n\t\t\t\t\t\tformatted = OC.Util.formatDate(expirationTimestamp)\n\t\t\t\t\t\ttext = OC.Util.relativeModifiedDate(expirationTimestamp)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tformatted = t('files_sharing', 'No expiration date set')\n\t\t\t\t\t\ttext = ''\n\t\t\t\t\t\tmodifiedColor = 160\n\t\t\t\t\t}\n\t\t\t\t\ttd = $('').attr({ 'class': 'date' })\n\t\t\t\t\ttd.append($('').attr({\n\t\t\t\t\t\t'class': 'modified',\n\t\t\t\t\t\t'title': formatted,\n\t\t\t\t\t\t'style': 'color:rgb(' + modifiedColor + ',' + modifiedColor + ',' + modifiedColor + ')'\n\t\t\t\t\t}).text(text)\n\t\t\t\t\t\t.tooltip({ placement: 'top' })\n\t\t\t\t\t)\n\n\t\t\t\t\t$tr.append(td)\n\t\t\t\t}\n\t\t\t\treturn $tr\n\t\t\t},\n\n\t\t\t/**\n\t\t * Set whether the list should contain outgoing shares\n\t\t * or incoming shares.\n\t\t *\n\t\t * @param state true for incoming shares, false otherwise\n\t\t */\n\t\t\tsetSharedWithUser: function(state) {\n\t\t\t\tthis._sharedWithUser = !!state\n\t\t\t},\n\n\t\t\tupdateEmptyContent: function() {\n\t\t\t\tvar dir = this.getCurrentDirectory()\n\t\t\t\tif (dir === '/') {\n\t\t\t\t// root has special permissions\n\t\t\t\t\tthis.$el.find('#emptycontent').toggleClass('hidden', !this.isEmpty)\n\t\t\t\t\tthis.$el.find('#filestable thead th').toggleClass('hidden', this.isEmpty)\n\n\t\t\t\t\t// hide expiration date header for non link only shares\n\t\t\t\t\tif (!this._linksOnly) {\n\t\t\t\t\t\tthis.$el.find('th.column-expiration').addClass('hidden')\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tOCA.Files.FileList.prototype.updateEmptyContent.apply(this, arguments)\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tgetDirectoryPermissions: function() {\n\t\t\t\treturn OC.PERMISSION_READ | OC.PERMISSION_DELETE\n\t\t\t},\n\n\t\t\tupdateStorageStatistics: function() {\n\t\t\t// no op because it doesn't have\n\t\t\t// storage info like free space / used space\n\t\t\t},\n\n\t\t\tupdateRow: function($tr, fileInfo, options) {\n\t\t\t// no-op, suppress re-rendering\n\t\t\t\treturn $tr\n\t\t\t},\n\n\t\t\treload: function() {\n\t\t\t\tthis.showMask()\n\t\t\t\tif (this._reloadCall) {\n\t\t\t\t\tthis._reloadCall.abort()\n\t\t\t\t}\n\n\t\t\t\t// there is only root\n\t\t\t\tthis._setCurrentDir('/', false)\n\n\t\t\t\tvar promises = []\n\n\t\t\t\tvar deletedShares = {\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1', 2) + 'deletedshares',\n\t\t\t\t\t/* jshint camelcase: false */\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tformat: 'json',\n\t\t\t\t\t\tinclude_tags: true\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\tbeforeSend: function(xhr) {\n\t\t\t\t\t\txhr.setRequestHeader('OCS-APIREQUEST', 'true')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar pendingShares = {\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1/shares', 2) + 'pending',\n\t\t\t\t\t/* jshint camelcase: false */\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tformat: 'json'\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\tbeforeSend: function(xhr) {\n\t\t\t\t\t\txhr.setRequestHeader('OCS-APIREQUEST', 'true')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar shares = {\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1') + 'shares',\n\t\t\t\t\t/* jshint camelcase: false */\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tformat: 'json',\n\t\t\t\t\t\tshared_with_me: this._sharedWithUser !== false,\n\t\t\t\t\t\tinclude_tags: true\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\tbeforeSend: function(xhr) {\n\t\t\t\t\t\txhr.setRequestHeader('OCS-APIREQUEST', 'true')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar remoteShares = {\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1') + 'remote_shares',\n\t\t\t\t\t/* jshint camelcase: false */\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tformat: 'json',\n\t\t\t\t\t\tinclude_tags: true\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\tbeforeSend: function(xhr) {\n\t\t\t\t\t\txhr.setRequestHeader('OCS-APIREQUEST', 'true')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Add the proper ajax requests to the list and run them\n\t\t\t\t// and make sure we have 2 promises\n\t\t\t\tif (this._showDeleted) {\n\t\t\t\t\tpromises.push($.ajax(deletedShares))\n\t\t\t\t} else if (this._showPending) {\n\t\t\t\t\tpromises.push($.ajax(pendingShares))\n\t\t\t\t} else {\n\t\t\t\t\tpromises.push($.ajax(shares))\n\n\t\t\t\t\tif (this._sharedWithUser !== false || this._isOverview) {\n\t\t\t\t\t\tpromises.push($.ajax(remoteShares))\n\t\t\t\t\t}\n\t\t\t\t\tif (this._isOverview) {\n\t\t\t\t\t\tshares.data.shared_with_me = !shares.data.shared_with_me\n\t\t\t\t\t\tpromises.push($.ajax(shares))\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis._reloadCall = $.when.apply($, promises)\n\t\t\t\tvar callBack = this.reloadCallback.bind(this)\n\t\t\t\treturn this._reloadCall.then(callBack, callBack)\n\t\t\t},\n\n\t\t\treloadCallback: function(shares, remoteShares, additionalShares) {\n\t\t\t\tdelete this._reloadCall\n\t\t\t\tthis.hideMask()\n\n\t\t\t\tthis.$el.find('#headerSharedWith').text(\n\t\t\t\t\tt('files_sharing', this._sharedWithUser ? 'Shared by' : 'Shared with')\n\t\t\t\t)\n\n\t\t\t\tvar files = []\n\n\t\t\t\t// make sure to use the same format\n\t\t\t\tif (shares[0] && shares[0].ocs) {\n\t\t\t\t\tshares = shares[0]\n\t\t\t\t}\n\t\t\t\tif (remoteShares && remoteShares[0] && remoteShares[0].ocs) {\n\t\t\t\t\tremoteShares = remoteShares[0]\n\t\t\t\t}\n\t\t\t\tif (additionalShares && additionalShares[0] && additionalShares[0].ocs) {\n\t\t\t\t\tadditionalShares = additionalShares[0]\n\t\t\t\t}\n\n\t\t\t\tif (shares.ocs && shares.ocs.data) {\n\t\t\t\t\tfiles = files.concat(this._makeFilesFromShares(shares.ocs.data, this._sharedWithUser))\n\t\t\t\t}\n\n\t\t\t\tif (remoteShares && remoteShares.ocs && remoteShares.ocs.data) {\n\t\t\t\t\tfiles = files.concat(this._makeFilesFromRemoteShares(remoteShares.ocs.data))\n\t\t\t\t}\n\n\t\t\t\tif (additionalShares && additionalShares.ocs && additionalShares.ocs.data) {\n\t\t\t\t\tfiles = files.concat(this._makeFilesFromShares(additionalShares.ocs.data, !this._sharedWithUser))\n\t\t\t\t}\n\n\t\t\t\tthis.setFiles(files)\n\t\t\t\treturn true\n\t\t\t},\n\n\t\t\t_makeFilesFromRemoteShares: function(data) {\n\t\t\t\tvar files = data\n\n\t\t\t\tfiles = _.chain(files)\n\t\t\t\t// convert share data to file data\n\t\t\t\t\t.map(function(share) {\n\t\t\t\t\t\tvar file = {\n\t\t\t\t\t\t\tshareOwner: share.owner + '@' + share.remote.replace(/.*?:\\/\\//g, ''),\n\t\t\t\t\t\t\tname: OC.basename(share.mountpoint),\n\t\t\t\t\t\t\tmtime: share.mtime * 1000,\n\t\t\t\t\t\t\tmimetype: share.mimetype,\n\t\t\t\t\t\t\ttype: share.type,\n\t\t\t\t\t\t\tid: share.file_id,\n\t\t\t\t\t\t\tpath: OC.dirname(share.mountpoint),\n\t\t\t\t\t\t\tpermissions: share.permissions,\n\t\t\t\t\t\t\ttags: share.tags || []\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfile.shares = [{\n\t\t\t\t\t\t\tid: share.id,\n\t\t\t\t\t\t\ttype: OC.Share.SHARE_TYPE_REMOTE\n\t\t\t\t\t\t}]\n\t\t\t\t\t\treturn file\n\t\t\t\t\t})\n\t\t\t\t\t.value()\n\t\t\t\treturn files\n\t\t\t},\n\n\t\t\t/**\n\t\t * Converts the OCS API share response data to a file info\n\t\t * list\n\t\t * @param {Array} data OCS API share array\n\t\t * @param {bool} sharedWithUser\n\t\t * @returns {Array.} array of shared file info\n\t\t */\n\t\t\t_makeFilesFromShares: function(data, sharedWithUser) {\n\t\t\t/* jshint camelcase: false */\n\t\t\t\tvar files = data\n\n\t\t\t\tif (this._linksOnly) {\n\t\t\t\t\tfiles = _.filter(data, function(share) {\n\t\t\t\t\t\treturn share.share_type === OC.Share.SHARE_TYPE_LINK\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\t// OCS API uses non-camelcased names\n\t\t\t\tfiles = _.chain(files)\n\t\t\t\t// convert share data to file data\n\t\t\t\t\t.map(function(share) {\n\t\t\t\t\t// TODO: use OC.Files.FileInfo\n\t\t\t\t\t\tvar file = {\n\t\t\t\t\t\t\tid: share.file_source,\n\t\t\t\t\t\t\ticon: OC.MimeType.getIconUrl(share.mimetype),\n\t\t\t\t\t\t\tmimetype: share.mimetype,\n\t\t\t\t\t\t\thasPreview: share.has_preview,\n\t\t\t\t\t\t\ttags: share.tags || []\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (share.item_type === 'folder') {\n\t\t\t\t\t\t\tfile.type = 'dir'\n\t\t\t\t\t\t\tfile.mimetype = 'httpd/unix-directory'\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfile.type = 'file'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfile.share = {\n\t\t\t\t\t\t\tid: share.id,\n\t\t\t\t\t\t\ttype: share.share_type,\n\t\t\t\t\t\t\ttarget: share.share_with,\n\t\t\t\t\t\t\tstime: share.stime * 1000,\n\t\t\t\t\t\t\texpiration: share.expiration\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (sharedWithUser) {\n\t\t\t\t\t\t\tfile.shareOwner = share.displayname_owner\n\t\t\t\t\t\t\tfile.shareOwnerId = share.uid_owner\n\t\t\t\t\t\t\tfile.name = OC.basename(share.file_target)\n\t\t\t\t\t\t\tfile.path = OC.dirname(share.file_target)\n\t\t\t\t\t\t\tfile.permissions = share.permissions\n\t\t\t\t\t\t\tif (file.path) {\n\t\t\t\t\t\t\t\tfile.extraData = share.file_target\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (share.share_type !== OC.Share.SHARE_TYPE_LINK) {\n\t\t\t\t\t\t\t\tfile.share.targetDisplayName = share.share_with_displayname\n\t\t\t\t\t\t\t\tfile.share.targetShareWithId = share.share_with\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfile.name = OC.basename(share.path)\n\t\t\t\t\t\t\tfile.path = OC.dirname(share.path)\n\t\t\t\t\t\t\tfile.permissions = OC.PERMISSION_ALL\n\t\t\t\t\t\t\tif (file.path) {\n\t\t\t\t\t\t\t\tfile.extraData = share.path\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn file\n\t\t\t\t\t})\n\t\t\t\t// Group all files and have a \"shares\" array with\n\t\t\t\t// the share info for each file.\n\t\t\t\t//\n\t\t\t\t// This uses a hash memo to cumulate share information\n\t\t\t\t// inside the same file object (by file id).\n\t\t\t\t\t.reduce(function(memo, file) {\n\t\t\t\t\t\tvar data = memo[file.id]\n\t\t\t\t\t\tvar recipient = file.share.targetDisplayName\n\t\t\t\t\t\tvar recipientId = file.share.targetShareWithId\n\t\t\t\t\t\tif (!data) {\n\t\t\t\t\t\t\tdata = memo[file.id] = file\n\t\t\t\t\t\t\tdata.shares = [file.share]\n\t\t\t\t\t\t\t// using a hash to make them unique,\n\t\t\t\t\t\t\t// this is only a list to be displayed\n\t\t\t\t\t\t\tdata.recipients = {}\n\t\t\t\t\t\t\tdata.recipientData = {}\n\t\t\t\t\t\t\t// share types\n\t\t\t\t\t\t\tdata.shareTypes = {}\n\t\t\t\t\t\t\t// counter is cheaper than calling _.keys().length\n\t\t\t\t\t\t\tdata.recipientsCount = 0\n\t\t\t\t\t\t\tdata.mtime = file.share.stime\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t// always take the most recent stime\n\t\t\t\t\t\t\tif (file.share.stime > data.mtime) {\n\t\t\t\t\t\t\t\tdata.mtime = file.share.stime\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdata.shares.push(file.share)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (recipient) {\n\t\t\t\t\t\t// limit counterparts for output\n\t\t\t\t\t\t\tif (data.recipientsCount < 4) {\n\t\t\t\t\t\t\t// only store the first ones, they will be the only ones\n\t\t\t\t\t\t\t// displayed\n\t\t\t\t\t\t\t\tdata.recipients[recipient] = true\n\t\t\t\t\t\t\t\tdata.recipientData[data.recipientsCount] = {\n\t\t\t\t\t\t\t\t\t'shareWith': recipientId,\n\t\t\t\t\t\t\t\t\t'shareWithDisplayName': recipient\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdata.recipientsCount++\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata.shareTypes[file.share.type] = true\n\n\t\t\t\t\t\tdelete file.share\n\t\t\t\t\t\treturn memo\n\t\t\t\t\t}, {})\n\t\t\t\t// Retrieve only the values of the returned hash\n\t\t\t\t\t.values()\n\t\t\t\t// Clean up\n\t\t\t\t\t.each(function(data) {\n\t\t\t\t\t// convert the recipients map to a flat\n\t\t\t\t\t// array of sorted names\n\t\t\t\t\t\tdata.mountType = 'shared'\n\t\t\t\t\t\tdelete data.recipientsCount\n\t\t\t\t\t\tif (sharedWithUser) {\n\t\t\t\t\t\t// only for outgoing shares\n\t\t\t\t\t\t\tdelete data.shareTypes\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdata.shareTypes = _.keys(data.shareTypes)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t// Finish the chain by getting the result\n\t\t\t\t\t.value()\n\n\t\t\t\t// Sort by expected sort comparator\n\t\t\t\treturn files.sort(this._sortComparator)\n\t\t\t}\n\t\t})\n\n\t/**\n\t * Share info attributes.\n\t *\n\t * @typedef {Object} OCA.Sharing.ShareInfo\n\t *\n\t * @property {int} id share ID\n\t * @property {int} type share type\n\t * @property {String} target share target, either user name or group name\n\t * @property {int} stime share timestamp in milliseconds\n\t * @property {String} [targetDisplayName] display name of the recipient\n\t * (only when shared with others)\n\t * @property {String} [targetShareWithId] id of the recipient\n\t *\n\t */\n\n\t/**\n\t * Recipient attributes\n\t *\n\t * @typedef {Object} OCA.Sharing.RecipientInfo\n\t * @property {String} shareWith the id of the recipient\n\t * @property {String} shareWithDisplayName the display name of the recipient\n\t */\n\n\t/**\n\t * Shared file info attributes.\n\t *\n\t * @typedef {OCA.Files.FileInfo} OCA.Sharing.SharedFileInfo\n\t *\n\t * @property {Array.} shares array of shares for\n\t * this file\n\t * @property {int} mtime most recent share time (if multiple shares)\n\t * @property {String} shareOwner name of the share owner\n\t * @property {Array.} recipients name of the first 4 recipients\n\t * (this is mostly for display purposes)\n\t * @property {Object.} recipientData (as object for easier\n\t * passing to HTML data attributes with jQuery)\n\t */\n\n\tOCA.Sharing.FileList = FileList\n})()\n"],"sourceRoot":""} \ No newline at end of file diff --git a/apps/files_sharing/js/sharedfilelist.js b/apps/files_sharing/js/sharedfilelist.js index f40a1f1a85..962f8a1691 100644 --- a/apps/files_sharing/js/sharedfilelist.js +++ b/apps/files_sharing/js/sharedfilelist.js @@ -353,6 +353,7 @@ id: share.file_source, icon: OC.MimeType.getIconUrl(share.mimetype), mimetype: share.mimetype, + hasPreview: share.has_preview, tags: share.tags || [] } if (share.item_type === 'folder') { diff --git a/apps/files_sharing/lib/Controller/ShareAPIController.php b/apps/files_sharing/lib/Controller/ShareAPIController.php index 3abe4f6dbe..2c2ec393d3 100644 --- a/apps/files_sharing/lib/Controller/ShareAPIController.php +++ b/apps/files_sharing/lib/Controller/ShareAPIController.php @@ -62,6 +62,7 @@ use OCP\Files\NotFoundException; use OCP\IConfig; use OCP\IGroupManager; use OCP\IL10N; +use OCP\IPreview; use OCP\IRequest; use OCP\IServerContainer; use OCP\IURLGenerator; @@ -106,6 +107,8 @@ class ShareAPIController extends OCSController { private $serverContainer; /** @var IUserStatusManager */ private $userStatusManager; + /** @var IPreview */ + private $previewManager; /** * Share20OCS constructor. @@ -137,7 +140,8 @@ class ShareAPIController extends OCSController { IConfig $config, IAppManager $appManager, IServerContainer $serverContainer, - IUserStatusManager $userStatusManager + IUserStatusManager $userStatusManager, + IPreview $previewManager ) { parent::__construct($appName, $request); @@ -153,6 +157,7 @@ class ShareAPIController extends OCSController { $this->appManager = $appManager; $this->serverContainer = $serverContainer; $this->userStatusManager = $userStatusManager; + $this->previewManager = $previewManager; } /** @@ -213,6 +218,7 @@ class ShareAPIController extends OCSController { } $result['mimetype'] = $node->getMimetype(); + $result['has_preview'] = $this->previewManager->isAvailable($node); $result['storage_id'] = $node->getStorage()->getId(); $result['storage'] = $node->getStorage()->getCache()->getNumericStorageId(); $result['item_source'] = $node->getId(); diff --git a/apps/files_sharing/tests/ApiTest.php b/apps/files_sharing/tests/ApiTest.php index 24351b9e86..e01e61b73b 100644 --- a/apps/files_sharing/tests/ApiTest.php +++ b/apps/files_sharing/tests/ApiTest.php @@ -44,6 +44,7 @@ use OCP\AppFramework\OCS\OCSForbiddenException; use OCP\AppFramework\OCS\OCSNotFoundException; use OCP\IConfig; use OCP\IL10N; +use OCP\IPreview; use OCP\IRequest; use OCP\IServerContainer; use OCP\Share\IShare; @@ -117,6 +118,7 @@ class ApiTest extends TestCase { $appManager = $this->createMock(IAppManager::class); $serverContainer = $this->createMock(IServerContainer::class); $userStatusManager = $this->createMock(IUserStatusManager::class); + $previewManager = $this->createMock(IPreview::class); return new ShareAPIController( self::APP_NAME, @@ -131,7 +133,8 @@ class ApiTest extends TestCase { $config, $appManager, $serverContainer, - $userStatusManager + $userStatusManager, + $previewManager ); } diff --git a/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php b/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php index 94939fcff2..5fd1c6b31e 100644 --- a/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php +++ b/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php @@ -47,6 +47,7 @@ use OCP\Files\Storage; use OCP\IConfig; use OCP\IGroupManager; use OCP\IL10N; +use OCP\IPreview; use OCP\IRequest; use OCP\IServerContainer; use OCP\IURLGenerator; @@ -109,6 +110,9 @@ class ShareAPIControllerTest extends TestCase { /** @var IUserStatusManager|\PHPUnit\Framework\MockObject\MockObject */ private $userStatusManager; + /** @var IPreview|\PHPUnit\Framework\MockObject\MockObject */ + private $previewManager; + protected function setUp(): void { $this->shareManager = $this->createMock(IManager::class); $this->shareManager @@ -134,6 +138,11 @@ class ShareAPIControllerTest extends TestCase { $this->appManager = $this->createMock(IAppManager::class); $this->serverContainer = $this->createMock(IServerContainer::class); $this->userStatusManager = $this->createMock(IUserStatusManager::class); + $this->previewManager = $this->createMock(IPreview::class); + $this->previewManager->method('isAvailable') + ->willReturnCallback(function ($fileInfo) { + return $fileInfo->getMimeType() === 'mimeWithPreview'; + }); $this->ocs = new ShareAPIController( $this->appName, @@ -148,7 +157,8 @@ class ShareAPIControllerTest extends TestCase { $this->config, $this->appManager, $this->serverContainer, - $this->userStatusManager + $this->userStatusManager, + $this->previewManager ); } @@ -171,6 +181,7 @@ class ShareAPIControllerTest extends TestCase { $this->appManager, $this->serverContainer, $this->userStatusManager, + $this->previewManager, ])->setMethods(['formatShare']) ->getMock(); } @@ -593,6 +604,7 @@ class ShareAPIControllerTest extends TestCase { 'label' => '', 'displayname_file_owner' => 'ownerDisplay', 'mimetype' => 'myMimeType', + 'has_preview' => false, 'hide_download' => 0, 'can_edit' => false, 'can_delete' => false, @@ -642,6 +654,7 @@ class ShareAPIControllerTest extends TestCase { 'label' => '', 'displayname_file_owner' => 'ownerDisplay', 'mimetype' => 'myFolderMimeType', + 'has_preview' => false, 'hide_download' => 0, 'can_edit' => false, 'can_delete' => false, @@ -697,6 +710,7 @@ class ShareAPIControllerTest extends TestCase { 'label' => 'first link share', 'displayname_file_owner' => 'ownerDisplay', 'mimetype' => 'myFolderMimeType', + 'has_preview' => false, 'hide_download' => 0, 'can_edit' => false, 'can_delete' => false, @@ -726,6 +740,7 @@ class ShareAPIControllerTest extends TestCase { $this->appManager, $this->serverContainer, $this->userStatusManager, + $this->previewManager, ])->setMethods(['canAccessShare']) ->getMock(); @@ -1346,6 +1361,7 @@ class ShareAPIControllerTest extends TestCase { $this->appManager, $this->serverContainer, $this->userStatusManager, + $this->previewManager, ])->setMethods(['formatShare']) ->getMock(); @@ -1690,6 +1706,7 @@ class ShareAPIControllerTest extends TestCase { $this->appManager, $this->serverContainer, $this->userStatusManager, + $this->previewManager, ])->setMethods(['formatShare']) ->getMock(); @@ -1791,6 +1808,7 @@ class ShareAPIControllerTest extends TestCase { $this->appManager, $this->serverContainer, $this->userStatusManager, + $this->previewManager, ])->setMethods(['formatShare']) ->getMock(); @@ -2355,6 +2373,7 @@ class ShareAPIControllerTest extends TestCase { $this->appManager, $this->serverContainer, $this->userStatusManager, + $this->previewManager, ])->setMethods(['formatShare']) ->getMock(); @@ -3386,19 +3405,24 @@ class ShareAPIControllerTest extends TestCase { $file = $this->getMockBuilder(File::class)->getMock(); $folder = $this->getMockBuilder(Folder::class)->getMock(); $parent = $this->getMockBuilder(Folder::class)->getMock(); + $fileWithPreview = $this->getMockBuilder(File::class)->getMock(); $file->method('getMimeType')->willReturn('myMimeType'); $folder->method('getMimeType')->willReturn('myFolderMimeType'); + $fileWithPreview->method('getMimeType')->willReturn('mimeWithPreview'); $file->method('getPath')->willReturn('file'); $folder->method('getPath')->willReturn('folder'); + $fileWithPreview->method('getPath')->willReturn('fileWithPreview'); $parent->method('getId')->willReturn(1); $folder->method('getId')->willReturn(2); $file->method('getId')->willReturn(3); + $fileWithPreview->method('getId')->willReturn(4); $file->method('getParent')->willReturn($parent); $folder->method('getParent')->willReturn($parent); + $fileWithPreview->method('getParent')->willReturn($parent); $cache = $this->getMockBuilder('OCP\Files\Cache\ICache')->getMock(); $cache->method('getNumericStorageId')->willReturn(100); @@ -3408,6 +3432,7 @@ class ShareAPIControllerTest extends TestCase { $file->method('getStorage')->willReturn($storage); $folder->method('getStorage')->willReturn($storage); + $fileWithPreview->method('getStorage')->willReturn($storage); $owner = $this->getMockBuilder(IUser::class)->getMock(); $owner->method('getDisplayName')->willReturn('ownerDN'); @@ -3458,6 +3483,7 @@ class ShareAPIControllerTest extends TestCase { 'label' => null, 'mail_send' => 0, 'mimetype' => 'myMimeType', + 'has_preview' => false, 'hide_download' => 0, 'can_edit' => false, 'can_delete' => false, @@ -3492,6 +3518,7 @@ class ShareAPIControllerTest extends TestCase { 'share_with_displayname' => 'recipientDN', 'mail_send' => 0, 'mimetype' => 'myMimeType', + 'has_preview' => false, 'hide_download' => 0, 'can_edit' => false, 'can_delete' => false, @@ -3542,6 +3569,7 @@ class ShareAPIControllerTest extends TestCase { 'share_with_displayname' => 'recipient', 'mail_send' => 0, 'mimetype' => 'myMimeType', + 'has_preview' => false, 'hide_download' => 0, 'can_edit' => false, 'can_delete' => false, @@ -3588,6 +3616,7 @@ class ShareAPIControllerTest extends TestCase { 'share_with_displayname' => 'recipient', 'mail_send' => 0, 'mimetype' => 'myMimeType', + 'has_preview' => false, 'hide_download' => 0, 'can_edit' => true, 'can_delete' => true, @@ -3636,6 +3665,7 @@ class ShareAPIControllerTest extends TestCase { 'share_with_displayname' => 'recipientGroupDisplayName', 'mail_send' => 0, 'mimetype' => 'myMimeType', + 'has_preview' => false, 'hide_download' => 0, 'can_edit' => false, 'can_delete' => false, @@ -3681,6 +3711,7 @@ class ShareAPIControllerTest extends TestCase { 'share_with_displayname' => 'recipientGroup2', 'mail_send' => 0, 'mimetype' => 'myMimeType', + 'has_preview' => false, 'hide_download' => 0, 'can_edit' => false, 'can_delete' => false, @@ -3732,6 +3763,7 @@ class ShareAPIControllerTest extends TestCase { 'mail_send' => 0, 'url' => 'myLink', 'mimetype' => 'myMimeType', + 'has_preview' => false, 'hide_download' => 0, 'can_edit' => false, 'can_delete' => false, @@ -3784,6 +3816,7 @@ class ShareAPIControllerTest extends TestCase { 'mail_send' => 0, 'url' => 'myLink', 'mimetype' => 'myMimeType', + 'has_preview' => false, 'hide_download' => 0, 'can_edit' => false, 'can_delete' => false, @@ -3829,6 +3862,7 @@ class ShareAPIControllerTest extends TestCase { 'share_with_displayname' => 'foobar', 'mail_send' => 0, 'mimetype' => 'myFolderMimeType', + 'has_preview' => false, 'hide_download' => 0, 'can_edit' => false, 'can_delete' => false, @@ -3877,6 +3911,7 @@ class ShareAPIControllerTest extends TestCase { 'share_with_avatar' => 'path/to/the/avatar', 'mail_send' => 0, 'mimetype' => 'myFolderMimeType', + 'has_preview' => false, 'hide_download' => 0, 'can_edit' => false, 'can_delete' => false, @@ -3923,6 +3958,7 @@ class ShareAPIControllerTest extends TestCase { 'share_with_avatar' => '', 'mail_send' => 0, 'mimetype' => 'myFolderMimeType', + 'has_preview' => false, 'hide_download' => 0, 'can_edit' => false, 'can_delete' => false, @@ -3969,6 +4005,7 @@ class ShareAPIControllerTest extends TestCase { 'share_with_avatar' => '', 'mail_send' => 0, 'mimetype' => 'myFolderMimeType', + 'has_preview' => false, 'hide_download' => 0, 'can_edit' => false, 'can_delete' => false, @@ -4029,6 +4066,7 @@ class ShareAPIControllerTest extends TestCase { 'share_with_displayname' => 'mail display name', 'mail_send' => 0, 'mimetype' => 'myFolderMimeType', + 'has_preview' => false, 'password' => 'password', 'send_password_by_talk' => false, 'hide_download' => 0, @@ -4077,6 +4115,7 @@ class ShareAPIControllerTest extends TestCase { 'share_with_displayname' => 'mail display name', 'mail_send' => 0, 'mimetype' => 'myFolderMimeType', + 'has_preview' => false, 'password' => 'password', 'send_password_by_talk' => true, 'hide_download' => 0, @@ -4085,6 +4124,54 @@ class ShareAPIControllerTest extends TestCase { ], $share, [], false ]; + // Preview is available + $share = \OC::$server->getShareManager()->newShare(); + $share->setShareType(IShare::TYPE_USER) + ->setSharedWith('recipient') + ->setSharedBy('initiator') + ->setShareOwner('currentUser') + ->setPermissions(\OCP\Constants::PERMISSION_READ) + ->setNode($fileWithPreview) + ->setShareTime(new \DateTime('2000-01-01T00:01:02')) + ->setTarget('myTarget') + ->setNote('personal note') + ->setId(42); + + $result[] = [ + [ + 'id' => 42, + 'share_type' => IShare::TYPE_USER, + 'uid_owner' => 'initiator', + 'displayname_owner' => 'initiator', + 'permissions' => 1, + 'stime' => 946684862, + 'parent' => null, + 'expiration' => null, + 'token' => null, + 'uid_file_owner' => 'currentUser', + 'displayname_file_owner' => 'currentUser', + 'note' => 'personal note', + 'label' => null, + 'path' => 'fileWithPreview', + 'item_type' => 'file', + 'storage_id' => 'storageId', + 'storage' => 100, + 'item_source' => 4, + 'file_source' => 4, + 'file_parent' => 1, + 'file_target' => 'myTarget', + 'share_with' => 'recipient', + 'share_with_displayname' => 'recipient', + 'mail_send' => 0, + 'mimetype' => 'mimeWithPreview', + 'has_preview' => true, + 'hide_download' => 0, + 'can_edit' => true, + 'can_delete' => true, + 'status' => [], + ], $share, [], false + ]; + return $result; } @@ -4221,6 +4308,7 @@ class ShareAPIControllerTest extends TestCase { 'share_with_displayname' => '', 'mail_send' => 0, 'mimetype' => 'myMimeType', + 'has_preview' => false, 'hide_download' => 0, 'label' => '', 'can_edit' => false, @@ -4266,6 +4354,7 @@ class ShareAPIControllerTest extends TestCase { 'share_with_displayname' => 'recipientRoomName', 'mail_send' => 0, 'mimetype' => 'myMimeType', + 'has_preview' => false, 'hide_download' => 0, 'label' => '', 'can_edit' => false,