Cleanup sharing leftovers

Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
This commit is contained in:
John Molakvoæ (skjnldsv) 2019-10-30 15:39:31 +01:00
parent 5c0ad24a68
commit eebcf89091
No known key found for this signature in database
GPG Key ID: 60C25B8C072916CF
37 changed files with 116 additions and 6000 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,2 +1,2 @@
!function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},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,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="/js/",t(t.s=67)}({67:function(e,n,r){r.p=OC.linkTo("files_sharing","js/dist/"),r.nc=btoa(OC.requestToken),window.OCP.Collaboration.registerType("file",{action:function(){return new Promise((function(e,n){OC.dialogs.filepicker(t("files_sharing","Link to a file"),(function(t){OC.Files.getClient().getFileInfo(t).then((function(n,t){e(t.id)})).fail((function(){n(new Error("Cannot get fileinfo"))}))}),!1,null,!1,OC.dialogs.FILEPICKER_TYPE_CHOOSE,"",{allowDirectoryChooser:!0})}))},typeString:t("files_sharing","Link to a file"),typeIconClass:"icon-files-dark"})}}); !function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},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,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="/js/",t(t.s=65)}({65:function(e,n,r){r.p=OC.linkTo("files_sharing","js/dist/"),r.nc=btoa(OC.requestToken),window.OCP.Collaboration.registerType("file",{action:function(){return new Promise((function(e,n){OC.dialogs.filepicker(t("files_sharing","Link to a file"),(function(t){OC.Files.getClient().getFileInfo(t).then((function(n,t){e(t.id)})).fail((function(){n(new Error("Cannot get fileinfo"))}))}),!1,null,!1,OC.dialogs.FILEPICKER_TYPE_CHOOSE,"",{allowDirectoryChooser:!0})}))},typeString:t("files_sharing","Link to a file"),typeIconClass:"icon-files-dark"})}});
//# sourceMappingURL=collaboration.js.map //# sourceMappingURL=collaboration.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,8 +1,6 @@
import './share' import './share'
import './sharetabview'
import './sharebreadcrumbview' import './sharebreadcrumbview'
import './style/sharetabview.scss'
import './style/sharebreadcrumb.scss' import './style/sharebreadcrumb.scss'
import './collaborationresourceshandler.js' import './collaborationresourceshandler.js'

View File

@ -247,15 +247,94 @@
* @returns {boolean} true if the icon was set, false otherwise * @returns {boolean} true if the icon was set, false otherwise
*/ */
_updateFileActionIcon: function($tr, hasUserShares, hasLinkShares) { _updateFileActionIcon: function($tr, hasUserShares, hasLinkShares) {
console.info('object');
// if the statuses are loaded already, use them for the icon // if the statuses are loaded already, use them for the icon
// (needed when scrolling to the next page) // (needed when scrolling to the next page)
if (hasUserShares || hasLinkShares || $tr.attr('data-share-recipient-data') || $tr.attr('data-share-owner')) { if (hasUserShares || hasLinkShares || $tr.attr('data-share-recipient-data') || $tr.attr('data-share-owner')) {
OC.Share.markFileAsShared($tr, true, hasLinkShares) OCA.Sharing.Util._markFileAsShared($tr, true, hasLinkShares)
return true return true
} }
return false return false
}, },
/**
* Marks/unmarks a given file as shared by changing its action icon
* and folder icon.
*
* @param $tr file element to mark as shared
* @param hasShares whether shares are available
* @param hasLink whether link share is available
*/
_markFileAsShared: function($tr, hasShares, hasLink) {
var action = $tr.find('.fileactions .action[data-action="Share"]')
var type = $tr.data('type')
var icon = action.find('.icon')
var message, recipients, avatars
var ownerId = $tr.attr('data-share-owner-id')
var owner = $tr.attr('data-share-owner')
var mountType = $tr.attr('data-mounttype')
var shareFolderIcon
var iconClass = 'icon-shared'
action.removeClass('shared-style')
// update folder icon
if (type === 'dir' && (hasShares || hasLink || ownerId)) {
if (typeof mountType !== 'undefined' && mountType !== 'shared-root' && mountType !== 'shared') {
shareFolderIcon = OC.MimeType.getIconUrl('dir-' + mountType)
} else if (hasLink) {
shareFolderIcon = OC.MimeType.getIconUrl('dir-public')
} else {
shareFolderIcon = OC.MimeType.getIconUrl('dir-shared')
}
$tr.find('.filename .thumbnail').css('background-image', 'url(' + shareFolderIcon + ')')
$tr.attr('data-icon', shareFolderIcon)
} else if (type === 'dir') {
var isEncrypted = $tr.attr('data-e2eencrypted')
// FIXME: duplicate of FileList._createRow logic for external folder,
// need to refactor the icon logic into a single code path eventually
if (isEncrypted === 'true') {
shareFolderIcon = OC.MimeType.getIconUrl('dir-encrypted')
$tr.attr('data-icon', shareFolderIcon)
} else if (mountType && mountType.indexOf('external') === 0) {
shareFolderIcon = OC.MimeType.getIconUrl('dir-external')
$tr.attr('data-icon', shareFolderIcon)
} else {
shareFolderIcon = OC.MimeType.getIconUrl('dir')
// back to default
$tr.removeAttr('data-icon')
}
$tr.find('.filename .thumbnail').css('background-image', 'url(' + shareFolderIcon + ')')
}
// update share action text / icon
if (hasShares || ownerId) {
recipients = $tr.data('share-recipient-data')
action.addClass('shared-style')
avatars = '<span>' + t('core', 'Shared') + '</span>'
// even if reshared, only show "Shared by"
if (ownerId) {
message = t('core', 'Shared by')
avatars = this._formatRemoteShare(ownerId, owner, message)
} else if (recipients) {
avatars = this._formatShareList(recipients)
}
action.html(avatars).prepend(icon)
if (ownerId || recipients) {
var avatarElement = action.find('.avatar')
avatarElement.each(function() {
$(this).avatar($(this).data('username'), 32)
})
action.find('span[title]').tooltip({ placement: 'top' })
}
} else {
action.html('<span class="hidden-visually">' + t('core', 'Shared') + '</span>').prepend(icon)
}
if (hasLink) {
iconClass = 'icon-public'
}
icon.removeClass('icon-shared icon-public').addClass(iconClass)
},
/** /**
* @param {Array} fileData * @param {Array} fileData
* @returns {String} * @returns {String}

View File

@ -1,107 +0,0 @@
/*
* Copyright (c) 2015
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
/* @global Handlebars */
(function() {
var TEMPLATE
= '<div>'
+ '<div class="dialogContainer"></div>'
+ '<div id="collaborationResources"></div>'
+ '</div>'
/**
* @memberof OCA.Sharing
*/
var ShareTabView = OCA.Files.DetailTabView.extend(
/** @lends OCA.Sharing.ShareTabView.prototype */ {
id: 'shareTabView',
className: 'tab shareTabView',
initialize: function(name, options) {
OCA.Files.DetailTabView.prototype.initialize.call(this, name, options)
OC.Plugins.attach('OCA.Sharing.ShareTabView', this)
},
template: function(params) {
return TEMPLATE
},
getLabel: function() {
return t('files_sharing', 'Sharing')
},
getIcon: function() {
return 'icon-shared'
},
/**
* Renders this details view
*/
render: function() {
var self = this
if (this._dialog) {
// remove/destroy older instance
this._dialog.model.off()
this._dialog.remove()
this._dialog = null
}
if (this.model) {
this.$el.html(this.template())
if (_.isUndefined(this.model.get('sharePermissions'))) {
this.model.set('sharePermissions', OCA.Sharing.Util.getSharePermissions(this.model.attributes))
}
// TODO: the model should read these directly off the passed fileInfoModel
var attributes = {
itemType: this.model.isDirectory() ? 'folder' : 'file',
itemSource: this.model.get('id'),
possiblePermissions: this.model.get('sharePermissions')
}
var configModel = new OC.Share.ShareConfigModel()
var shareModel = new OC.Share.ShareItemModel(attributes, {
configModel: configModel,
fileInfoModel: this.model
})
this._dialog = new OC.Share.ShareDialogView({
configModel: configModel,
model: shareModel
})
this.$el.find('.dialogContainer').append(this._dialog.$el)
this._dialog.render()
this._dialog.model.fetch()
this._dialog.model.on('change', function() {
self.trigger('sharesChanged', shareModel)
})
import('./collaborationresources').then((Resources) => {
var vm = new Resources.Vue({
el: '#collaborationResources',
render: h => h(Resources.View),
data: {
model: this.model.toJSON()
}
})
this.model.on('change', () => { vm.data = this.model.toJSON() })
})
} else {
this.$el.empty()
// TODO: render placeholder text?
}
this.trigger('rendered')
}
})
OCA.Sharing.ShareTabView = ShareTabView
})()

View File

@ -1,293 +0,0 @@
.app-files .shareTabView {
min-height: 100px;
}
.share-autocomplete-item {
display: flex;
&.merged {
margin-left: 32px;
}
.autocomplete-item-text {
margin-left: 10px;
margin-right: 10px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
line-height: 32px;
vertical-align: middle;
flex-grow: 1;
.ui-state-highlight {
border: none;
margin: 0;
}
}
&.with-description {
.autocomplete-item-text {
line-height: 100%;
}
}
.autocomplete-item-details {
display: block;
line-height: 130%;
font-size: 90%;
opacity: 0.7;
}
.icon {
opacity: .7;
margin-right: 7px;
}
.icon.search-globally {
width: 32px;
height: 32px;
margin-right: 0;
}
}
.shareTabView {
.oneline {
white-space: nowrap;
position: relative;
}
.shareWithLoading {
padding-left: 10px;
right: 35px;
top: 3px;
}
.shareWithConfirm {
position: absolute;
right: 2px;
top: 6px;
padding: 14px;
opacity: 0.5;
}
.shareWithField:focus ~ .shareWithConfirm {
opacity: 1;
}
.linkMore {
position: absolute;
right: -7px;
top: -4px;
padding: 14px;
}
.popovermenu {
.linkPassMenu {
input.error {
border-color: var(--color-error) !important;
&[type="submit"] {
border-left: none;
}
}
.share-pass-submit {
width: auto !important;
}
.icon-loading-small {
background-color: var(--color-main-background);
position: absolute;
right: 8px;
margin: 3px;
padding: 10px;
width: 32px;
height: 32px;
z-index: 10;
}
}
.datepicker {
margin-left: 35px;
}
.share-add {
input.share-note-delete {
border: none;
background-color: transparent;
width: 44px !important;
padding: 0;
flex: 0 0 44px;
margin-left: auto;
&.hidden {
display: none;
}
}
}
// note
.share-note-form {
span.icon-note {
position: relative;
}
textarea.share-note {
margin: 0;
width: 200px;
min-height: 70px;
resize: none;
+ input.share-note-submit {
position: absolute;
width: 44px !important;
height: 44px;
bottom: 0px;
right: 10px;
margin: 0;
background-color: transparent;
border: none;
opacity: .7;
&:hover,
&:focus,
&:active {
opacity: 1;
}
}
}
// fix for popover link share
&.share-note-link {
margin-bottom: 10px;
}
}
/* Border above last entry '+ Add another share' to separate it from current link settings */
.new-share {
border-top: 1px solid var(--color-border);
}
}
.linkPass .icon-loading-small {
margin-right: 0px;
}
.icon {
background-size: 16px 16px;
}
.shareWithList .icon-loading-small:not(.hidden) + span,
.linkShareView .icon-loading-small:not(.hidden) + input + label:before {
/* Hide if loader is visible */
display: none !important;
}
input {
&[type='checkbox'] {
margin: 0 3px 0 8px;
vertical-align: middle;
}
&[type='text'] {
&.shareWithField,
&.emailField {
width: 100%;
box-sizing: border-box;
padding-right: 32px;
text-overflow: ellipsis;
}
}
&[type='text'].linkText
&[type='password'].linkPassText,
&[type='password'].passwordField {
width: 180px !important;
}
}
form {
font-size: 100%;
margin-left: 0;
margin-right: 0;
}
// share note on the sidebar
.share-note {
border-radius: var(--border-radius);
margin-bottom: 10px;
margin-left: 37px;
}
}
// Sharing tab users list
.shareWithList {
list-style-type: none;
display: flex;
flex-direction: column;
> li {
height: 44px;
white-space: normal;
display: inline-flex;
align-items: center;
position: relative;
.avatar {
width: 32px;
height: 32px;
background-color: var(--color-primary);
}
}
.unshare img {
vertical-align: text-bottom;
/* properly align icons */
}
.sharingOptionsGroup {
margin-left: auto;
display: flex;
align-items: center;
white-space: nowrap;
// icons
> .icon:not(.hidden),
.share-menu > .icon:not(.hidden) {
padding: 14px;
height: 44px;
width: 44px;
opacity: .5;
display: block;
cursor: pointer;
&:hover,
&:focus,
&:active {
opacity: .7;;
}
}
// more menu
> .share-menu {
position: relative;
display: block;
}
}
.username {
padding: 0 8px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
.ui-autocomplete {
/* limit dropdown height to 6 1/2 entries */
max-height: calc(36px * 6.5);
overflow-y: auto;
overflow-x: hidden;
z-index: 1550 !important;
}
.notCreatable {
padding-left: 12px;
padding-top: 12px;
color: var(--color-text-lighter);
}
.contactsmenu-popover {
left: -6px;
right: auto;
padding: 3px 6px;
top: 100%;
margin-top: 0;
li.hidden {
display: none !important;
}
&:after {
left: 8px;
right: auto;
}
}
.reshare,
#link label,
#expiration label {
display: inline-flex;
align-items: center;
.avatar {
margin-right: 5px;
}
}
.resharerInfoView.subView {
position: relative;
}

View File

@ -27,7 +27,7 @@
* @returns {string} the title * @returns {string} the title
*/ */
const shareWithTitle = function(share) { const shareWithTitle = function(share) {
if (share.type === OC.Share.type_GROUP) { if (share.type === OC.Share.SHARE_TYPE_GROUP) {
return t( return t(
'files_sharing', 'files_sharing',
'Shared with you and the group {group} by {owner}', 'Shared with you and the group {group} by {owner}',
@ -38,7 +38,7 @@ const shareWithTitle = function(share) {
undefined, undefined,
{ escape: false } { escape: false }
) )
} else if (share.type === OC.Share.type_CIRCLE) { } else if (share.type === OC.Share.SHARE_TYPE_CIRCLE) {
return t( return t(
'files_sharing', 'files_sharing',
'Shared with you and {circle} by {owner}', 'Shared with you and {circle} by {owner}',
@ -49,7 +49,7 @@ const shareWithTitle = function(share) {
undefined, undefined,
{ escape: false } { escape: false }
) )
} else if (share.type === OC.Share.type_ROOM) { } else if (share.type === OC.Share.SHARE_TYPE_ROOM) {
if (this.model.get('reshare').share_with_displayname) { if (this.model.get('reshare').share_with_displayname) {
return t( return t(
'files_sharing', 'files_sharing',

View File

@ -10,9 +10,6 @@ node node_modules/handlebars/bin/handlebars -n OC.Settings.Templates apps/setti
# Systemtags # Systemtags
node node_modules/handlebars/bin/handlebars -n OC.SystemTags.Templates core/js/systemtags/templates -f core/js/systemtags/templates.js node node_modules/handlebars/bin/handlebars -n OC.SystemTags.Templates core/js/systemtags/templates -f core/js/systemtags/templates.js
# Share
node node_modules/handlebars/bin/handlebars -n OC.Share.Templates core/js/share -f core/js/sharetemplates.js
# Files app # Files app
node node_modules/handlebars/bin/handlebars -n OCA.Files.Templates apps/files/js/templates -f apps/files/js/templates.js node node_modules/handlebars/bin/handlebars -n OCA.Files.Templates apps/files/js/templates -f apps/files/js/templates.js

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,9 +0,0 @@
import './shareconfigmodel.js'
import './sharetemplates.js'
import './shareitemmodel.js'
import './sharesocialmanager.js'
import './sharedialogresharerinfoview.js'
import './sharedialoglinkshareview.js'
import './sharedialogshareelistview.js'
import './sharedialogview.js'
import './share.js'

View File

@ -1,399 +0,0 @@
/* eslint-disable */
/**
* @namespace
*/
OC.Share = _.extend(OC.Share || {}, {
SHARE_TYPE_USER: 0,
SHARE_TYPE_GROUP: 1,
SHARE_TYPE_LINK: 3,
SHARE_TYPE_EMAIL: 4,
SHARE_TYPE_REMOTE: 6,
SHARE_TYPE_CIRCLE: 7,
SHARE_TYPE_GUEST: 8,
SHARE_TYPE_REMOTE_GROUP: 9,
SHARE_TYPE_ROOM: 10,
/**
* Regular expression for splitting parts of remote share owners:
* "user@example.com/path/to/owncloud"
* "user@anotherexample.com@example.com/path/to/owncloud
*/
_REMOTE_OWNER_REGEXP: new RegExp('^([^@]*)@(([^@]*)@)?([^/]*)([/](.*)?)?$'),
/**
* @deprecated use OC.Share.currentShares instead
*/
itemShares: [],
/**
* Full list of all share statuses
*/
statuses: {},
/**
* Shares for the currently selected file.
* (for which the dropdown is open)
*
* Key is item type and value is an array or
* shares of the given item type.
*/
currentShares: {},
/**
* Whether the share dropdown is opened.
*/
droppedDown: false,
/**
* Loads ALL share statuses from server, stores them in
* OC.Share.statuses then calls OC.Share.updateIcons() to update the
* files "Share" icon to "Shared" according to their share status and
* share type.
*
* If a callback is specified, the update step is skipped.
*
* @param itemType item type
* @param fileList file list instance, defaults to OCA.Files.App.fileList
* @param callback function to call after the shares were loaded
*/
loadIcons: function(itemType, fileList, callback) {
var path = fileList.dirInfo.path
if (path === '/') {
path = ''
}
path += '/' + fileList.dirInfo.name
// Load all share icons
$.get(
OC.linkToOCS('apps/files_sharing/api/v1', 2) + 'shares',
{
subfiles: 'true',
path: path,
format: 'json'
}, function(result) {
if (result && result.ocs.meta.statuscode === 200) {
OC.Share.statuses = {}
$.each(result.ocs.data, function(it, share) {
if (!(share.item_source in OC.Share.statuses)) {
OC.Share.statuses[share.item_source] = { link: false }
}
if (share.share_type === OC.Share.SHARE_TYPE_LINK) {
OC.Share.statuses[share.item_source] = { link: true }
}
})
if (_.isFunction(callback)) {
callback(OC.Share.statuses)
} else {
OC.Share.updateIcons(itemType, fileList)
}
}
}
)
},
/**
* Updates the files' "Share" icons according to the known
* sharing states stored in OC.Share.statuses.
* (not reloaded from server)
*
* @param itemType item type
* @param fileList file list instance
* defaults to OCA.Files.App.fileList
*/
updateIcons: function(itemType, fileList) {
var item
var $fileList
var currentDir
if (!fileList && OCA.Files) {
fileList = OCA.Files.App.fileList
}
// fileList is usually only defined in the files app
if (fileList) {
$fileList = fileList.$fileList
currentDir = fileList.getCurrentDirectory()
}
// TODO: iterating over the files might be more efficient
for (item in OC.Share.statuses) {
var iconClass = 'icon-shared'
var data = OC.Share.statuses[item]
var hasLink = data.link
// Links override shared in terms of icon display
if (hasLink) {
iconClass = 'icon-public'
}
if (itemType !== 'file' && itemType !== 'folder') {
$('a.share[data-item="' + item + '"] .icon').removeClass('icon-shared icon-public').addClass(iconClass)
} else {
// TODO: ultimately this part should be moved to files_sharing app
var file = $fileList.find('tr[data-id="' + item + '"]')
var shareFolder = OC.imagePath('core', 'filetypes/folder-shared')
var img
if (file.length > 0) {
this.markFileAsShared(file, true, hasLink)
} else {
var dir = currentDir
if (dir.length > 1) {
var last = ''
var path = dir
// Search for possible parent folders that are shared
while (path != last) {
if (path === data.path && !data.link) {
var actions = $fileList.find('.fileactions .action[data-action="Share"]')
var files = $fileList.find('.filename')
var i
for (i = 0; i < actions.length; i++) {
// TODO: use this.markFileAsShared()
img = $(actions[i]).find('img')
if (img.attr('src') !== OC.imagePath('core', 'actions/public')) {
img.attr('src', image)
$(actions[i]).addClass('permanent')
$(actions[i]).html('<span> ' + t('core', 'Shared') + '</span>').prepend(img)
}
}
for (i = 0; i < files.length; i++) {
if ($(files[i]).closest('tr').data('type') === 'dir') {
$(files[i]).find('.thumbnail').css('background-image', 'url(' + shareFolder + ')')
}
}
}
last = path
path = OC.Share.dirname(path)
}
}
}
}
}
},
updateIcon: function(itemType, itemSource) {
var shares = false
var link = false
var iconClass = ''
$.each(OC.Share.itemShares, function(index) {
if (OC.Share.itemShares[index]) {
if (index == OC.Share.SHARE_TYPE_LINK) {
if (OC.Share.itemShares[index] == true) {
shares = true
iconClass = 'icon-public'
link = true
}
} else if (OC.Share.itemShares[index].length > 0) {
shares = true
iconClass = 'icon-shared'
}
}
})
if (itemType != 'file' && itemType != 'folder') {
$('a.share[data-item="' + itemSource + '"] .icon').removeClass('icon-shared icon-public').addClass(iconClass)
} else {
var $tr = $('tr').filterAttr('data-id', String(itemSource))
if ($tr.length > 0) {
// it might happen that multiple lists exist in the DOM
// with the same id
$tr.each(function() {
OC.Share.markFileAsShared($(this), shares, link)
})
}
}
if (shares) {
OC.Share.statuses[itemSource] = OC.Share.statuses[itemSource] || {}
OC.Share.statuses[itemSource].link = link
} else {
delete OC.Share.statuses[itemSource]
}
},
/**
* Format a remote address
*
* @param {String} shareWith userid, full remote share, or whatever
* @param {String} shareWithDisplayName
* @param {String} message
* @returns {String} HTML code to display
*/
_formatRemoteShare: function(shareWith, shareWithDisplayName, message) {
var parts = this._REMOTE_OWNER_REGEXP.exec(shareWith)
if (!parts) {
// display avatar of the user
var avatar = '<span class="avatar" data-username="' + escapeHTML(shareWith) + '" title="' + message + ' ' + escapeHTML(shareWithDisplayName) + '"></span>'
var hidden = '<span class="hidden-visually">' + message + ' ' + escapeHTML(shareWithDisplayName) + '</span> '
return avatar + hidden
}
var userName = parts[1]
var userDomain = parts[3]
var server = parts[4]
var tooltip = message + ' ' + userName
if (userDomain) {
tooltip += '@' + userDomain
}
if (server) {
if (!userDomain) {
userDomain = '…'
}
tooltip += '@' + server
}
var html = '<span class="remoteAddress" title="' + escapeHTML(tooltip) + '">'
html += '<span class="username">' + escapeHTML(userName) + '</span>'
if (userDomain) {
html += '<span class="userDomain">@' + escapeHTML(userDomain) + '</span>'
}
html += '</span> '
return html
},
/**
* Loop over all recipients in the list and format them using
* all kind of fancy magic.
*
* @param {Object} recipients array of all the recipients
* @returns {String[]} modified list of recipients
*/
_formatShareList: function(recipients) {
var _parent = this
recipients = _.toArray(recipients)
recipients.sort(function(a, b) {
return a.shareWithDisplayName.localeCompare(b.shareWithDisplayName)
})
return $.map(recipients, function(recipient) {
return _parent._formatRemoteShare(recipient.shareWith, recipient.shareWithDisplayName, t('core', 'Shared with'))
})
},
/**
* Marks/unmarks a given file as shared by changing its action icon
* and folder icon.
*
* @param $tr file element to mark as shared
* @param hasShares whether shares are available
* @param hasLink whether link share is available
*/
markFileAsShared: function($tr, hasShares, hasLink) {
var action = $tr.find('.fileactions .action[data-action="Share"]')
var type = $tr.data('type')
var icon = action.find('.icon')
var message, recipients, avatars
var ownerId = $tr.attr('data-share-owner-id')
var owner = $tr.attr('data-share-owner')
var mountType = $tr.attr('data-mounttype')
var shareFolderIcon
var iconClass = 'icon-shared'
action.removeClass('shared-style')
// update folder icon
if (type === 'dir' && (hasShares || hasLink || ownerId)) {
if (typeof mountType !== 'undefined' && mountType !== 'shared-root' && mountType !== 'shared') {
shareFolderIcon = OC.MimeType.getIconUrl('dir-' + mountType)
} else if (hasLink) {
shareFolderIcon = OC.MimeType.getIconUrl('dir-public')
} else {
shareFolderIcon = OC.MimeType.getIconUrl('dir-shared')
}
$tr.find('.filename .thumbnail').css('background-image', 'url(' + shareFolderIcon + ')')
$tr.attr('data-icon', shareFolderIcon)
} else if (type === 'dir') {
var isEncrypted = $tr.attr('data-e2eencrypted')
// FIXME: duplicate of FileList._createRow logic for external folder,
// need to refactor the icon logic into a single code path eventually
if (isEncrypted === 'true') {
shareFolderIcon = OC.MimeType.getIconUrl('dir-encrypted')
$tr.attr('data-icon', shareFolderIcon)
} else if (mountType && mountType.indexOf('external') === 0) {
shareFolderIcon = OC.MimeType.getIconUrl('dir-external')
$tr.attr('data-icon', shareFolderIcon)
} else {
shareFolderIcon = OC.MimeType.getIconUrl('dir')
// back to default
$tr.removeAttr('data-icon')
}
$tr.find('.filename .thumbnail').css('background-image', 'url(' + shareFolderIcon + ')')
}
// update share action text / icon
if (hasShares || ownerId) {
recipients = $tr.data('share-recipient-data')
action.addClass('shared-style')
avatars = '<span>' + t('core', 'Shared') + '</span>'
// even if reshared, only show "Shared by"
if (ownerId) {
message = t('core', 'Shared by')
avatars = this._formatRemoteShare(ownerId, owner, message)
} else if (recipients) {
avatars = this._formatShareList(recipients)
}
action.html(avatars).prepend(icon)
if (ownerId || recipients) {
var avatarElement = action.find('.avatar')
avatarElement.each(function() {
$(this).avatar($(this).data('username'), 32)
})
action.find('span[title]').tooltip({ placement: 'top' })
}
} else {
action.html('<span class="hidden-visually">' + t('core', 'Shared') + '</span>').prepend(icon)
}
if (hasLink) {
iconClass = 'icon-public'
}
icon.removeClass('icon-shared icon-public').addClass(iconClass)
},
showDropDown: function(itemType, itemSource, appendTo, link, possiblePermissions, filename) {
var configModel = new OC.Share.ShareConfigModel()
var attributes = { itemType: itemType, itemSource: itemSource, possiblePermissions: possiblePermissions }
var itemModel = new OC.Share.ShareItemModel(attributes, { configModel: configModel })
var dialogView = new OC.Share.ShareDialogView({
id: 'dropdown',
model: itemModel,
configModel: configModel,
className: 'drop shareDropDown',
attributes: {
'data-item-source-name': filename,
'data-item-type': itemType,
'data-item-source': itemSource
}
})
dialogView.setShowLink(link)
var $dialog = dialogView.render().$el
$dialog.appendTo(appendTo)
$dialog.slideDown(OC.menuSpeed, function() {
OC.Share.droppedDown = true
})
itemModel.fetch()
},
hideDropDown: function(callback) {
OC.Share.currentShares = null
$('#dropdown').slideUp(OC.menuSpeed, function() {
OC.Share.droppedDown = false
$('#dropdown').remove()
if (typeof FileActions !== 'undefined') {
$('tr').removeClass('mouseOver')
}
if (callback) {
callback.call()
}
})
},
dirname: function(path) {
return path.replace(/\\/g, '/').replace(/\/[^\/]*$/, '')
}
})
$(document).ready(function() {
if (typeof monthNames !== 'undefined') {
// min date should always be the next day
var minDate = new Date()
minDate.setDate(minDate.getDate() + 1)
$.datepicker.setDefaults({
monthNames: monthNames,
monthNamesShort: monthNamesShort,
dayNames: dayNames,
dayNamesMin: dayNamesMin,
dayNamesShort: dayNamesShort,
firstDay: firstDay,
minDate: minDate
})
}
$(this).click(function(event) {
var target = $(event.target)
var isMatched = !target.is('.drop, .ui-datepicker-next, .ui-datepicker-prev, .ui-icon')
&& !target.closest('#ui-datepicker-div').length && !target.closest('.ui-autocomplete').length
if (OC.Share && OC.Share.droppedDown && isMatched && $('#dropdown').has(event.target).length === 0) {
OC.Share.hideDropDown()
}
})
})

View File

@ -1,40 +0,0 @@
{{#if shareAllowed}}
<ul class="shareWithList">
{{#if nolinkShares}}
<li data-share-id="{{newShareId}}">
<div class="avatar icon-public-white"></div>
<span class="username">{{newShareLabel}}</span>
<span class="sharingOptionsGroup">
<div class="share-menu">
<a href="#" class="icon icon-add new-share has-tooltip {{#if showPending}}hidden{{/if}}" title="{{newShareTitle}}"></a>
<span class="icon icon-loading-small {{#unless showPending}}hidden{{/unless}}"></span>
{{#if showPending}}
{{{pendingPopoverMenu}}}
{{/if}}
</div>
</span>
</li>
{{/if}}
{{#each linkShares}}
<li data-share-id="{{cid}}">
<div class="avatar icon-public-white"></div>
<span class="username" title="{{linkShareCreationDate}}">{{linkShareLabel}}</span>
<span class="sharingOptionsGroup">
<a href="#" class="clipboard-button icon icon-clippy has-tooltip" data-clipboard-text="{{shareLinkURL}}" title="{{copyLabel}}"></a>
<div class="share-menu">
<a href="#" class="icon icon-more {{#if showPending}}hidden{{/if}}"></a>
<span class="icon icon-loading-small {{#unless showPending}}hidden{{/unless}}"></span>
{{#if showPending}}
{{{pendingPopoverMenu}}}
{{else}}
{{{popoverMenu}}}
{{/if}}
</div>
</span>
</li>
{{/each}}
</ul>
{{else}}
{{#if noSharingPlaceholder}}<input id="shareWith-{{cid}}" class="shareWithField" type="text" placeholder="{{noSharingPlaceholder}}" disabled="disabled" />{{/if}}
{{/if}}

View File

@ -1,121 +0,0 @@
<div class="popovermenu menu">
<ul>
<li class="hidden linkTextMenu">
<span class="menuitem icon-link-text">
<input id="linkText-{{cid}}" class="linkText" type="text" readonly="readonly" value="{{shareLinkURL}}" />
</span>
</li>
{{#if publicUpload}}
<li>
<span class="menuitem">
<span class="icon-loading-small hidden"></span>
<input type="radio" name="publicUpload" value="{{publicUploadRValue}}" id="sharingDialogAllowPublicUpload-r-{{cid}}" class="radio publicUploadRadio" {{{publicUploadRChecked}}} />
<label for="sharingDialogAllowPublicUpload-r-{{cid}}">{{publicUploadRLabel}}</label>
</span>
</li>
<li>
<span class="menuitem">
<span class="icon-loading-small hidden"></span>
<input type="radio" name="publicUpload" value="{{publicUploadRWValue}}" id="sharingDialogAllowPublicUpload-rw-{{cid}}" class="radio publicUploadRadio" {{{publicUploadRWChecked}}} />
<label for="sharingDialogAllowPublicUpload-rw-{{cid}}">{{publicUploadRWLabel}}</label>
</span>
</li>
<li>
<span class="menuitem">
<span class="icon-loading-small hidden"></span>
<input type="radio" name="publicUpload" value="{{publicUploadWValue}}" id="sharingDialogAllowPublicUpload-w-{{cid}}" class="radio publicUploadRadio" {{{publicUploadWChecked}}} />
<label for="sharingDialogAllowPublicUpload-w-{{cid}}">{{publicUploadWLabel}}</label>
</span>
</li>
{{/if}}
{{#if publicEditing}}
<li id="allowPublicEditingWrapper">
<span class="menuitem">
<span class="icon-loading-small hidden"></span>
<input type="checkbox" name="allowPublicEditing" id="sharingDialogAllowPublicEditing-{{cid}}" class="checkbox publicEditingCheckbox" {{{publicEditingChecked}}} />
<label for="sharingDialogAllowPublicEditing-{{cid}}">{{publicEditingLabel}}</label>
</span>
</li>
{{/if}}
<li>
<span class="menuitem">
<span class="icon-loading-small hidden"></span>
<input type="checkbox" name="hideDownload" id="sharingDialogHideDownload-{{cid}}" class="checkbox hideDownloadCheckbox"
{{#if hideDownload}}checked="checked"{{/if}} />
<label for="sharingDialogHideDownload-{{cid}}">{{hideDownloadLabel}}</label>
</span>
</li>
<li>
<span class="menuitem">
<input type="checkbox" name="showPassword" id="showPassword-{{cid}}" class="checkbox showPasswordCheckbox"
{{#if isPasswordSet}}checked="checked"{{/if}} {{#if isPasswordEnforced}}disabled="disabled"{{/if}} value="1" />
<label for="showPassword-{{cid}}">{{enablePasswordLabel}}</label>
</span>
</li>
<li class="{{#unless isPasswordSet}}hidden{{/unless}} linkPassMenu">
<span class="menuitem icon-share-pass">
<input id="linkPassText-{{cid}}" class="linkPassText" type="password" placeholder="{{passwordPlaceholder}}" autocomplete="new-password" />
<input type="submit" class="icon-confirm share-pass-submit" value="" />
<span class="icon icon-loading-small hidden"></span>
</span>
</li>
{{#if showPasswordByTalkCheckBox}}
<li>
<span class="shareOption menuitem">
<span class="icon-loading-small hidden"></span>
<input type="checkbox" name="passwordByTalk" id="passwordByTalk-{{cid}}" class="checkbox passwordByTalkCheckbox"
{{#if isPasswordByTalkSet}}checked="checked"{{/if}} />
<label for="passwordByTalk-{{cid}}">{{passwordByTalkLabel}}</label>
</span>
</li>
{{/if}}
<li>
<span class="menuitem">
<input id="expireDate-{{cid}}" type="checkbox" name="expirationDate" class="expireDate checkbox"
{{#if hasExpireDate}}checked="checked"{{/if}} {{#if isExpirationEnforced}}disabled="disabled"{{/if}} />
<label for="expireDate-{{cid}}">{{expireDateLabel}}</label>
</span>
</li>
<li class="{{#unless hasExpireDate}}hidden{{/unless}}">
<span class="menuitem icon-expiredate expirationDateContainer-{{cid}}">
<label for="expirationDatePicker-{{cid}}" class="hidden-visually" value="{{expirationDate}}">{{expirationLabel}}</label>
<!-- do not use the datepicker if enforced -->
<input id="expirationDatePicker-{{cid}}" class="{{#unless isExpirationEnforced}}datepicker{{/unless}}" type="text"
placeholder="{{expirationDatePlaceholder}}" value="{{#if hasExpireDate}}{{expireDate}}{{else}}{{defaultExpireDate}}{{/if}}"
data-max-date="{{maxDate}}" {{#if isExpirationEnforced}}readonly{{/if}} />
</span>
</li>
<li>
<a href="#" class="share-add">
<span class="icon-loading-small hidden"></span>
<span class="icon icon-edit"></span>
<span>{{addNoteLabel}}</span>
<input type="button" class="share-note-delete icon-delete {{#unless hasNote}}hidden{{/unless}}">
</a>
</li>
<li class="share-note-form share-note-link {{#unless hasNote}}hidden{{/unless}}">
<span class="menuitem icon-note">
<textarea class="share-note">{{shareNote}}</textarea>
<input type="submit" class="icon-confirm share-note-submit" value="" id="add-note-{{shareId}}" />
</span>
</li>
{{#each social}}
<li>
<a href="#" class="menuitem pop-up" data-url="{{url}}" data-window="{{newWindow}}">
<span class="icon {{iconClass}}"></span>
<span>{{label}}</span>
</a>
</li>
{{/each}}
<li>
<a href="#" class="unshare"><span class="icon-loading-small hidden"></span><span class="icon icon-delete"></span><span>{{unshareLinkLabel}}</span></a>
</li>
<li>
<a href="#" class="new-share">
<span class="icon-loading-small hidden"></span>
<span class="icon icon-add"></span>
<span>{{newShareLabel}}</span>
</a>
</li>
</ul>
</div>

View File

@ -1,20 +0,0 @@
<div class="popovermenu open menu pending">
<ul>
{{#if isPasswordEnforced}}
<li>
<span class="menuitem icon-info">
<p>{{enforcedPasswordLabel}}</p>
</span>
</li>
<li class="linkPassMenu">
<span class="menuitem">
<form autocomplete="off" class="enforcedPassForm">
<input id="enforcedPassText" required class="enforcedPassText" type="password"
placeholder="{{passwordPlaceholder}}" autocomplete="enforcedPassText" minlength="{{minPasswordLength}}" />
<input type="submit" value=" " class="primary icon-checkmark-white">
</form>
</span>
</li>
{{/if}}
</ul>
</div>

View File

@ -1,5 +0,0 @@
<span class="reshare">
<div class="avatar" data-userName="{{reshareOwner}}"></div>
{{sharedByText}}
</span>
{{#if hasShareNote}}<div class="share-note">{{shareNote}}</div>{{/if}}

View File

@ -1,32 +0,0 @@
<ul id="shareWithList" class="shareWithList">
{{#each sharees}}
{{#unless isShareWithCurrentUser}}
<li data-share-id="{{shareId}}" data-share-type="{{shareType}}" data-share-with="{{shareWith}}">
<div class="avatar {{#if modSeed}}imageplaceholderseed{{/if}}" data-username="{{shareWith}}" data-avatar="{{shareWithAvatar}}" data-displayname="{{shareWithDisplayName}}" {{#if modSeed}}data-seed="{{shareWith}} {{shareType}}"{{/if}}></div>
<span class="username" title="{{shareWithTitle}}">{{shareWithDisplayName}}</span>
{{#if canUpdateShareSettings }}
<span class="sharingOptionsGroup">
{{#if editPermissionPossible}}
<span>
<input id="canEdit-{{cid}}-{{shareId}}" type="checkbox" name="edit" class="permissions checkbox" />
<label for="canEdit-{{cid}}-{{shareId}}">{{canEditLabel}}</label>
</span>
{{/if}}
<div tabindex="0" class="share-menu"><span class="icon icon-more"></span>
{{{popoverMenu}}}
</div>
</span>
{{/if}}
</li>
{{/unless}}
{{/each}}
{{#each linkReshares}}
<li data-share-id="{{shareId}}" data-share-type="{{shareType}}">
<div class="avatar" data-username="{{shareInitiator}}"></div>
<span class="has-tooltip username" title="{{shareInitiator}}">{{shareInitiatorText}}</span>
<span class="sharingOptionsGroup">
<a href="#" class="unshare"><span class="icon-loading-small hidden"></span><span class="icon icon-delete"></span><span class="hidden-visually">{{unshareLabel}}</span></a>
</span>
</li>
{{/each}}
</ul>

View File

@ -1,107 +0,0 @@
<div class="popovermenu bubble hidden menu">
<ul>
{{#if isResharingAllowed}} {{#if sharePermissionPossible}} {{#unless isMailShare}}
<li>
<span class="menuitem">
<input id="canShare-{{cid}}-{{shareId}}" type="checkbox" name="share" class="permissions checkbox" {{#if hasSharePermission}}checked="checked"{{/if}} data-permissions="{{sharePermission}}" />
<label for="canShare-{{cid}}-{{shareId}}">{{canShareLabel}}</label>
</span>
</li>
{{/unless}} {{/if}} {{/if}}
{{#if isFolder}}
{{#if createPermissionPossible}}{{#unless isMailShare}}
<li>
<span class="menuitem">
<input id="canCreate-{{cid}}-{{shareId}}" type="checkbox" name="create" class="permissions checkbox" {{#if hasCreatePermission}}checked="checked"{{/if}} data-permissions="{{createPermission}}"/>
<label for="canCreate-{{cid}}-{{shareId}}">{{createPermissionLabel}}</label>
</span>
</li>
{{/unless}}{{/if}}
{{#if updatePermissionPossible}}{{#unless isMailShare}}
<li>
<span class="menuitem">
<input id="canUpdate-{{cid}}-{{shareId}}" type="checkbox" name="update" class="permissions checkbox" {{#if hasUpdatePermission}}checked="checked"{{/if}} data-permissions="{{updatePermission}}"/>
<label for="canUpdate-{{cid}}-{{shareId}}">{{updatePermissionLabel}}</label>
</span>
</li>
{{/unless}}{{/if}}
{{#if deletePermissionPossible}}{{#unless isMailShare}}
<li>
<span class="menuitem">
<input id="canDelete-{{cid}}-{{shareId}}" type="checkbox" name="delete" class="permissions checkbox" {{#if hasDeletePermission}}checked="checked"{{/if}} data-permissions="{{deletePermission}}"/>
<label for="canDelete-{{cid}}-{{shareId}}">{{deletePermissionLabel}}</label>
</span>
</li>
{{/unless}}{{/if}}
{{/if}}
{{#if isMailShare}}
{{#if hasCreatePermission}}
<li>
<span class="menuitem">
<input id="secureDrop-{{cid}}-{{shareId}}" type="checkbox" name="secureDrop" class="checkbox secureDrop" {{#if secureDropMode}}checked="checked"{{/if}} data-permissions="{{readPermission}}"/>
<label for="secureDrop-{{cid}}-{{shareId}}">{{secureDropLabel}}</label>
</span>
</li>
{{/if}}
<li>
<span class="menuitem">
<input id="password-{{cid}}-{{shareId}}" type="checkbox" name="password" class="password checkbox" {{#if isPasswordSet}}checked="checked"{{/if}}{{#if isPasswordSet}}{{#if isPasswordForMailSharesRequired}}disabled=""{{/if}}{{/if}}" />
<label for="password-{{cid}}-{{shareId}}">{{passwordLabel}}</label>
</span>
</li>
<li class="passwordMenu-{{cid}}-{{shareId}} {{#unless isPasswordSet}}hidden{{/unless}}">
<span class="passwordContainer-{{cid}}-{{shareId}} icon-passwordmail menuitem">
<label for="passwordField-{{cid}}-{{shareId}}" class="hidden-visually" value="{{password}}">{{passwordLabel}}</label>
<input id="passwordField-{{cid}}-{{shareId}}" class="passwordField" type="password" placeholder="{{passwordPlaceholder}}" value="{{passwordValue}}" autocomplete="new-password" />
<span class="icon-loading-small hidden"></span>
</span>
</li>
{{#if isTalkEnabled}}
<li>
<span class="menuitem">
<input id="passwordByTalk-{{cid}}-{{shareId}}" type="checkbox" name="passwordByTalk" class="passwordByTalk checkbox" {{#if isPasswordByTalkSet}}checked="checked"{{/if}} />
<label for="passwordByTalk-{{cid}}-{{shareId}}">{{passwordByTalkLabel}}</label>
</span>
</li>
<li class="passwordByTalkMenu-{{cid}}-{{shareId}} {{#unless isPasswordByTalkSet}}hidden{{/unless}}">
<span class="passwordByTalkContainer-{{cid}}-{{shareId}} icon-passwordtalk menuitem">
<label for="passwordByTalkField-{{cid}}-{{shareId}}" class="hidden-visually" value="{{password}}">{{passwordByTalkLabel}}</label>
<input id="passwordByTalkField-{{cid}}-{{shareId}}" class="passwordField" type="password" placeholder="{{passwordByTalkPlaceholder}}" value="{{passwordValue}}" autocomplete="new-password" />
<span class="icon-loading-small hidden"></span>
</span>
</li>
{{/if}}
{{/if}}
<li>
<span class="menuitem">
<input id="expireDate-{{cid}}-{{shareId}}" type="checkbox" name="expirationDate" class="expireDate checkbox" {{#if hasExpireDate}}checked="checked"{{/if}}" />
<label for="expireDate-{{cid}}-{{shareId}}">{{expireDateLabel}}</label>
</span>
</li>
<li class="expirationDateMenu-{{cid}}-{{shareId}} {{#unless hasExpireDate}}hidden{{/unless}}">
<span class="expirationDateContainer-{{cid}}-{{shareId}} icon-expiredate menuitem">
<label for="expirationDatePicker-{{cid}}-{{shareId}}" class="hidden-visually" value="{{expirationDate}}">{{expirationLabel}}</label>
<input id="expirationDatePicker-{{cid}}-{{shareId}}" class="datepicker" type="text" placeholder="{{expirationDatePlaceholder}}" value="{{#if hasExpireDate}}{{expireDate}}{{else}}{{defaultExpireDate}}{{/if}}" />
</span>
</li>
{{#if isNoteAvailable}}
<li>
<a href="#" class="share-add">
<span class="icon-loading-small hidden"></span>
<span class="icon icon-edit"></span>
<span>{{addNoteLabel}}</span>
<input type="button" class="share-note-delete icon-delete {{#unless hasNote}}hidden{{/unless}}">
</a>
</li>
<li class="share-note-form {{#unless hasNote}}hidden{{/unless}}">
<span class="menuitem icon-note">
<textarea class="share-note">{{shareNote}}</textarea>
<input type="submit" class="icon-confirm share-note-submit" value="" id="add-note-{{shareId}}" />
</span>
</li>
{{/if}}
<li>
<a href="#" class="unshare"><span class="icon-loading-small hidden"></span><span class="icon icon-delete"></span><span>{{unshareLabel}}</span></a>
</li>
</ul>
</div>

View File

@ -1,12 +0,0 @@
<div class="resharerInfoView subView"></div>
{{#if isSharingAllowed}}
<label for="shareWith-{{cid}}" class="hidden-visually">{{shareLabel}}</label>
<div class="oneline">
<input id="shareWith-{{cid}}" class="shareWithField" type="text" placeholder="{{sharePlaceholder}}" />
<span class="shareWithLoading icon-loading-small hidden"></span>
<span class="shareWithConfirm icon icon-confirm"></span>
</div>
{{/if}}
<div class="linkShareView subView"></div>
<div class="shareeListView subView"></div>
<div class="loading hidden" style="height: 50px"></div>

View File

@ -1,72 +0,0 @@
/* eslint-disable */
/*
* Copyright (c) 2015
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
/* global moment, OC */
(function() {
if (!OC.Share) {
OC.Share = {}
OC.Share.Types = {}
}
// FIXME: the config model should populate its own model attributes based on
// the old DOM-based config
var ShareConfigModel = OC.Backbone.Model.extend({
defaults: {
publicUploadEnabled: false,
enforcePasswordForPublicLink: OC.appConfig.core.enforcePasswordForPublicLink,
enableLinkPasswordByDefault: OC.appConfig.core.enableLinkPasswordByDefault,
isDefaultExpireDateEnforced: OC.appConfig.core.defaultExpireDateEnforced === true,
isDefaultExpireDateEnabled: OC.appConfig.core.defaultExpireDateEnabled === true,
isRemoteShareAllowed: OC.appConfig.core.remoteShareAllowed,
isMailShareAllowed: OC.appConfig.shareByMailEnabled !== undefined,
defaultExpireDate: OC.appConfig.core.defaultExpireDate,
isResharingAllowed: OC.appConfig.core.resharingAllowed,
isPasswordForMailSharesRequired: (OC.appConfig.shareByMail === undefined) ? false : OC.appConfig.shareByMail.enforcePasswordProtection,
allowGroupSharing: OC.appConfig.core.allowGroupSharing
},
/**
* @returns {boolean}
*/
isPublicUploadEnabled: function() {
var publicUploadEnabled = $('#filestable').data('allow-public-upload')
return publicUploadEnabled === 'yes'
},
/**
* @returns {boolean}
*/
isShareWithLinkAllowed: function() {
return $('#allowShareWithLink').val() === 'yes'
},
/**
* @returns {string}
*/
getFederatedShareDocLink: function() {
return OC.appConfig.core.federatedCloudShareDoc
},
getDefaultExpirationDateString: function() {
var expireDateString = ''
if (this.get('isDefaultExpireDateEnabled')) {
var date = moment.utc()
var expireAfterDays = this.get('defaultExpireDate')
date.add(expireAfterDays, 'days')
expireDateString = date.format('YYYY-MM-DD 00:00:00')
}
return expireDateString
}
})
OC.Share.ShareConfigModel = ShareConfigModel
})()

View File

@ -1,954 +0,0 @@
/* eslint-disable */
/*
* Copyright (c) 2015
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
/* globals Clipboard, Handlebars */
(function() {
if (!OC.Share) {
OC.Share = {}
}
var PASSWORD_PLACEHOLDER = '**********'
var PASSWORD_PLACEHOLDER_MESSAGE = t('core', 'Choose a password for the public link')
var PASSWORD_PLACEHOLDER_MESSAGE_OPTIONAL = t('core', 'Choose a password for the public link or press the "Enter" key')
/**
* @class OCA.Share.ShareDialogLinkShareView
* @member {OC.Share.ShareItemModel} model
* @member {jQuery} $el
* @memberof OCA.Sharing
* @classdesc
*
* Represents the GUI of the share dialogue
*
*/
var ShareDialogLinkShareView = OC.Backbone.View.extend({
/** @type {string} **/
id: 'shareDialogLinkShare',
/** @type {OC.Share.ShareConfigModel} **/
configModel: undefined,
/** @type {boolean} **/
showLink: true,
/** @type {boolean} **/
showPending: false,
/** @type {string} **/
password: '',
/** @type {string} **/
newShareId: 'new-share',
events: {
// open menu
'click .share-menu .icon-more': 'onToggleMenu',
// hide download
'change .hideDownloadCheckbox': 'onHideDownloadChange',
// password
'click input.share-pass-submit': 'onPasswordEntered',
'keyup input.linkPassText': 'onPasswordKeyUp', // check for the enter key
'change .showPasswordCheckbox': 'onShowPasswordClick',
'change .passwordByTalkCheckbox': 'onPasswordByTalkChange',
'change .publicEditingCheckbox': 'onAllowPublicEditingChange',
// copy link url
'click .linkText': 'onLinkTextClick',
// social
'click .pop-up': 'onPopUpClick',
// permission change
'change .publicUploadRadio': 'onPublicUploadChange',
// expire date
'click .expireDate': 'onExpireDateChange',
'change .datepicker': 'onChangeExpirationDate',
'click .datepicker': 'showDatePicker',
// note
'click .share-add': 'showNoteForm',
'click .share-note-delete': 'deleteNote',
'click .share-note-submit': 'updateNote',
// remove
'click .unshare': 'onUnshare',
// new share
'click .new-share': 'newShare',
// enforced pass set
'submit .enforcedPassForm': 'enforcedPasswordSet'
},
initialize: function(options) {
var view = this
this.model.on('change:permissions', function() {
view.render()
})
this.model.on('change:itemType', function() {
view.render()
})
this.model.on('change:allowPublicUploadStatus', function() {
view.render()
})
this.model.on('change:hideFileListStatus', function() {
view.render()
})
this.model.on('change:linkShares', function(model, linkShares) {
// The "Password protect by Talk" item is shown only when there
// is a password. Unfortunately there is no fine grained
// rendering of items in the link shares, so the whole view
// needs to be rendered again when the password of a share
// changes.
// Note that this event handler is concerned only about password
// changes; other changes in the link shares does not trigger
// a rendering, so the view must be rendered again as needed in
// those cases (for example, when a link share is removed).
var previousLinkShares = model.previous('linkShares')
if (previousLinkShares.length !== linkShares.length) {
return
}
var i
for (i = 0; i < linkShares.length; i++) {
if (linkShares[i].id !== previousLinkShares[i].id) {
// A resorting should never happen, but just in case.
return
}
if (linkShares[i].password !== previousLinkShares[i].password) {
view.render()
return
}
}
})
if (!_.isUndefined(options.configModel)) {
this.configModel = options.configModel
} else {
throw 'missing OC.Share.ShareConfigModel'
}
var clipboard = new Clipboard('.clipboard-button')
clipboard.on('success', function(e) {
var $trigger = $(e.trigger)
$trigger.tooltip('hide')
.attr('data-original-title', t('core', 'Copied!'))
.tooltip('fixTitle')
.tooltip({ placement: 'bottom', trigger: 'manual' })
.tooltip('show')
_.delay(function() {
$trigger.tooltip('hide')
.attr('data-original-title', t('core', 'Copy link'))
.tooltip('fixTitle')
}, 3000)
})
clipboard.on('error', function(e) {
var $trigger = $(e.trigger)
var $menu = $trigger.next('.share-menu').find('.popovermenu')
var $linkTextMenu = $menu.find('li.linkTextMenu')
var $input = $linkTextMenu.find('.linkText')
var $li = $trigger.closest('li[data-share-id]')
var shareId = $li.data('share-id')
// show menu
OC.showMenu(null, $menu)
var actionMsg = ''
if (/iPhone|iPad/i.test(navigator.userAgent)) {
actionMsg = t('core', 'Not supported!')
} else if (/Mac/i.test(navigator.userAgent)) {
actionMsg = t('core', 'Press ⌘-C to copy.')
} else {
actionMsg = t('core', 'Press Ctrl-C to copy.')
}
$linkTextMenu.removeClass('hidden')
$input.select()
$input.tooltip('hide')
.attr('data-original-title', actionMsg)
.tooltip('fixTitle')
.tooltip({ placement: 'bottom', trigger: 'manual' })
.tooltip('show')
_.delay(function() {
$input.tooltip('hide')
$input.attr('data-original-title', t('core', 'Copy'))
.tooltip('fixTitle')
}, 3000)
})
},
newShare: function(event) {
var self = this
var $target = $(event.target)
var $li = $target.closest('li[data-share-id]')
var shareId = $li.data('share-id')
var $loading = $li.find('.share-menu > .icon-loading-small')
if (!$loading.hasClass('hidden') && this.password === '') {
// in process
return false
}
// hide all icons and show loading
$li.find('.icon').addClass('hidden')
$loading.removeClass('hidden')
// hide menu
OC.hideMenus()
var shareData = {}
var isPasswordEnforced = this.configModel.get('enforcePasswordForPublicLink')
var isExpirationEnforced = this.configModel.get('isDefaultExpireDateEnforced')
// set default expire date
if (isExpirationEnforced) {
var defaultExpireDays = this.configModel.get('defaultExpireDate')
var expireDate = moment().add(defaultExpireDays, 'day').format('DD-MM-YYYY')
shareData.expireDate = expireDate
}
// if password is set, add to data
if (isPasswordEnforced && this.password !== '') {
shareData.password = this.password
}
var newShareId = false
// We need a password before the share creation
if (isPasswordEnforced && !this.showPending && this.password === '') {
this.showPending = shareId
var self = this.render()
self.$el.find('.pending #enforcedPassText').focus()
} else {
// else, we have a password or it is not enforced
$.when(this.model.saveLinkShare(shareData, {
success: function() {
$loading.addClass('hidden')
$li.find('.icon').removeClass('hidden')
self.render()
// open the menu by default
// we can only do that after the render
if (newShareId) {
var shares = self.$el.find('li[data-share-id]')
var $newShare = self.$el.find('li[data-share-id="' + newShareId + '"]')
}
},
error: function() {
// empty function to override the default Dialog warning
}
})).fail(function(response) {
// password failure? Show error
self.password = ''
if (isPasswordEnforced && response && response.responseJSON && response.responseJSON.ocs.meta && response.responseJSON.ocs.meta.message) {
var $input = self.$el.find('.pending #enforcedPassText')
$input.tooltip('destroy')
$input.attr('title', response.responseJSON.ocs.meta.message)
$input.tooltip({ placement: 'bottom', trigger: 'manual' })
$input.tooltip('show')
} else {
OC.Notification.showTemporary(t('core', 'Unable to create a link share'))
$loading.addClass('hidden')
$li.find('.icon').removeClass('hidden')
}
}).then(function(response) {
// resolve before success
newShareId = response.ocs.data.id
})
}
},
enforcedPasswordSet: function(event) {
event.preventDefault()
var $form = $(event.target)
var $input = $form.find('input.enforcedPassText')
this.password = $input.val()
this.showPending = false
this.newShare(event)
},
onLinkTextClick: function(event) {
var $element = $(event.target)
var $li = $element.closest('li[data-share-id]')
var $el = $li.find('.linkText')
$el.focus()
$el.select()
},
onHideDownloadChange: function(event) {
var $element = $(event.target)
var $li = $element.closest('li[data-share-id]')
var shareId = $li.data('share-id')
var $checkbox = $li.find('.hideDownloadCheckbox')
$checkbox.siblings('.icon-loading-small').removeClass('hidden').addClass('inlineblock')
var hideDownload = false
if ($checkbox.is(':checked')) {
hideDownload = true
}
this.model.saveLinkShare({
hideDownload: hideDownload,
cid: shareId
}, {
success: function() {
$checkbox.siblings('.icon-loading-small').addClass('hidden').removeClass('inlineblock')
},
error: function(obj, msg) {
OC.Notification.showTemporary(t('core', 'Unable to toggle this option'))
$checkbox.siblings('.icon-loading-small').addClass('hidden').removeClass('inlineblock')
}
})
},
onShowPasswordClick: function(event) {
var $element = $(event.target)
var $li = $element.closest('li[data-share-id]')
var shareId = $li.data('share-id')
$li.find('.linkPass').slideToggle(OC.menuSpeed)
$li.find('.linkPassMenu').toggleClass('hidden')
if (!$li.find('.showPasswordCheckbox').is(':checked')) {
this.model.saveLinkShare({
password: '',
cid: shareId
})
} else {
if (!OC.Util.isIE()) {
$li.find('.linkPassText').focus()
}
}
},
onPasswordKeyUp: function(event) {
if (event.keyCode === 13) {
this.onPasswordEntered(event)
}
},
onPasswordEntered: function(event) {
var $element = $(event.target)
var $li = $element.closest('li[data-share-id]')
var shareId = $li.data('share-id')
var $loading = $li.find('.linkPassMenu .icon-loading-small')
if (!$loading.hasClass('hidden')) {
// still in process
return
}
var $input = $li.find('.linkPassText')
$input.removeClass('error')
$input.parent().find('input').removeClass('error')
var password = $input.val()
if ($li.find('.linkPassText').attr('placeholder') === PASSWORD_PLACEHOLDER_MESSAGE_OPTIONAL) {
// in IE9 the password might be the placeholder due to bugs in the placeholders polyfill
if (password === PASSWORD_PLACEHOLDER_MESSAGE_OPTIONAL) {
password = ''
}
} else {
// in IE9 the password might be the placeholder due to bugs in the placeholders polyfill
if (password === '' || password === PASSWORD_PLACEHOLDER || password === PASSWORD_PLACEHOLDER_MESSAGE) {
return
}
}
$loading
.removeClass('hidden')
.addClass('inlineblock')
this.model.saveLinkShare({
password: password,
cid: shareId
}, {
complete: function(model) {
$loading.removeClass('inlineblock').addClass('hidden')
},
error: function(model, msg) {
// Add visual feedback to both the input and the submit button
$input.parent().find('input').addClass('error')
// destroy old tooltips
var $container = $input.parent()
$container.tooltip('destroy')
$input.addClass('error')
$container.attr('title', msg)
$container.tooltip({ placement: 'bottom', trigger: 'manual' })
$container.tooltip('show')
}
})
},
onPasswordByTalkChange: function(event) {
var $element = $(event.target)
var $li = $element.closest('li[data-share-id]')
var shareId = $li.data('share-id')
var $checkbox = $li.find('.passwordByTalkCheckbox')
$checkbox.siblings('.icon-loading-small').removeClass('hidden').addClass('inlineblock')
var sendPasswordByTalk = false
if ($checkbox.is(':checked')) {
sendPasswordByTalk = true
}
this.model.saveLinkShare({
sendPasswordByTalk: sendPasswordByTalk,
cid: shareId
}, {
success: function() {
$checkbox.siblings('.icon-loading-small').addClass('hidden').removeClass('inlineblock')
},
error: function(obj, msg) {
OC.Notification.showTemporary(t('core', 'Unable to toggle this option'))
$checkbox.siblings('.icon-loading-small').addClass('hidden').removeClass('inlineblock')
}
})
},
onAllowPublicEditingChange: function(event) {
var $element = $(event.target)
var $li = $element.closest('li[data-share-id]')
var shareId = $li.data('share-id')
var $checkbox = $li.find('.publicEditingCheckbox')
$checkbox.siblings('.icon-loading-small').removeClass('hidden').addClass('inlineblock')
var permissions = OC.PERMISSION_READ
if ($checkbox.is(':checked')) {
permissions = OC.PERMISSION_UPDATE | OC.PERMISSION_READ
}
this.model.saveLinkShare({
permissions: permissions,
cid: shareId
}, {
success: function() {
$checkbox.siblings('.icon-loading-small').addClass('hidden').removeClass('inlineblock')
},
error: function(obj, msg) {
OC.Notification.showTemporary(t('core', 'Unable to toggle this option'))
$checkbox.siblings('.icon-loading-small').addClass('hidden').removeClass('inlineblock')
}
})
},
onPublicUploadChange: function(event) {
var $element = $(event.target)
var $li = $element.closest('li[data-share-id]')
var shareId = $li.data('share-id')
var permissions = event.currentTarget.value
this.model.saveLinkShare({
permissions: permissions,
cid: shareId
})
},
showNoteForm: function(event) {
event.preventDefault()
event.stopPropagation()
var self = this
var $element = $(event.target)
var $li = $element.closest('li[data-share-id]')
var $menu = $element.closest('li')
var $form = $menu.next('li.share-note-form')
// show elements
$menu.find('.share-note-delete').toggleClass('hidden')
$form.toggleClass('hidden')
$form.find('textarea').focus()
},
deleteNote: function(event) {
event.preventDefault()
event.stopPropagation()
var self = this
var $element = $(event.target)
var $li = $element.closest('li[data-share-id]')
var shareId = $li.data('share-id')
var $menu = $element.closest('li')
var $form = $menu.next('li.share-note-form')
$form.find('.share-note').val('')
$form.addClass('hidden')
$menu.find('.share-note-delete').addClass('hidden')
self.sendNote('', shareId, $menu)
},
updateNote: function(event) {
event.preventDefault()
event.stopPropagation()
var self = this
var $element = $(event.target)
var $li = $element.closest('li[data-share-id]')
var shareId = $li.data('share-id')
var $form = $element.closest('li.share-note-form')
var $menu = $form.prev('li')
var message = $form.find('.share-note').val().trim()
if (message.length < 1) {
return
}
self.sendNote(message, shareId, $menu)
},
sendNote: function(note, shareId, $menu) {
var $form = $menu.next('li.share-note-form')
var $submit = $form.find('input.share-note-submit')
var $error = $form.find('input.share-note-error')
$submit.prop('disabled', true)
$menu.find('.icon-loading-small').removeClass('hidden')
$menu.find('.icon-edit').hide()
var complete = function() {
$submit.prop('disabled', false)
$menu.find('.icon-loading-small').addClass('hidden')
$menu.find('.icon-edit').show()
}
var error = function() {
$error.show()
setTimeout(function() {
$error.hide()
}, 3000)
}
// send data
$.ajax({
method: 'PUT',
url: OC.linkToOCS('apps/files_sharing/api/v1/shares', 2) + shareId + '?' + OC.buildQueryString({ format: 'json' }),
data: { note: note },
complete: complete,
error: error
})
},
render: function() {
this.$el.find('.has-tooltip').tooltip()
// reset previously set passwords
this.password = ''
var linkShareTemplate = this.template()
var resharingAllowed = this.model.sharePermissionPossible()
if (!resharingAllowed
|| !this.showLink
|| !this.configModel.isShareWithLinkAllowed()) {
var templateData = { shareAllowed: false }
if (!resharingAllowed) {
// add message
templateData.noSharingPlaceholder = t('core', 'Resharing is not allowed')
}
this.$el.html(linkShareTemplate(templateData))
return this
}
var publicUpload
= this.model.isFolder()
&& this.model.createPermissionPossible()
&& this.configModel.isPublicUploadEnabled()
var publicEditingChecked = ''
if (this.model.isPublicEditingAllowed()) {
publicEditingChecked = 'checked="checked"'
}
var isPasswordEnforced = this.configModel.get('enforcePasswordForPublicLink')
var isPasswordEnabledByDefault = this.configModel.get('enableLinkPasswordByDefault') === true
var passwordPlaceholderInitial = this.configModel.get('enforcePasswordForPublicLink')
? PASSWORD_PLACEHOLDER_MESSAGE : PASSWORD_PLACEHOLDER_MESSAGE_OPTIONAL
var publicEditable
= !this.model.isFolder()
&& this.model.updatePermissionPossible()
var isExpirationEnforced = this.configModel.get('isDefaultExpireDateEnforced')
// what if there is another date picker on that page?
var minDate = new Date()
// min date should always be the next day
minDate.setDate(minDate.getDate() + 1)
$.datepicker.setDefaults({
minDate: minDate
})
this.$el.find('.datepicker').datepicker({ dateFormat: 'dd-mm-yy' })
var minPasswordLength = 4
// password policy?
if (OC.getCapabilities().password_policy && OC.getCapabilities().password_policy.minLength) {
minPasswordLength = OC.getCapabilities().password_policy.minLength
}
var popoverBase = {
urlLabel: t('core', 'Link'),
hideDownloadLabel: t('core', 'Hide download'),
enablePasswordLabel: isPasswordEnforced ? t('core', 'Password protection enforced') : t('core', 'Password protect'),
passwordLabel: t('core', 'Password'),
passwordPlaceholderInitial: passwordPlaceholderInitial,
publicUpload: publicUpload,
publicEditing: publicEditable,
publicEditingChecked: publicEditingChecked,
publicEditingLabel: t('core', 'Allow editing'),
mailPrivatePlaceholder: t('core', 'Email link to person'),
mailButtonText: t('core', 'Send'),
publicUploadRWLabel: t('core', 'Allow upload and editing'),
publicUploadRLabel: t('core', 'Read only'),
publicUploadWLabel: t('core', 'File drop (upload only)'),
publicUploadRWValue: OC.PERMISSION_UPDATE | OC.PERMISSION_CREATE | OC.PERMISSION_READ | OC.PERMISSION_DELETE,
publicUploadRValue: OC.PERMISSION_READ,
publicUploadWValue: OC.PERMISSION_CREATE,
expireDateLabel: isExpirationEnforced ? t('core', 'Expiration date enforced') : t('core', 'Set expiration date'),
expirationLabel: t('core', 'Expiration'),
expirationDatePlaceholder: t('core', 'Expiration date'),
isExpirationEnforced: isExpirationEnforced,
isPasswordEnforced: isPasswordEnforced,
defaultExpireDate: moment().add(1, 'day').format('DD-MM-YYYY'), // Can't expire today
addNoteLabel: t('core', 'Note to recipient'),
unshareLabel: t('core', 'Unshare'),
unshareLinkLabel: t('core', 'Delete share link'),
newShareLabel: t('core', 'Add another link')
}
var pendingPopover = {
isPasswordEnforced: isPasswordEnforced,
enforcedPasswordLabel: t('core', 'Password protection for links is mandatory'),
passwordPlaceholder: passwordPlaceholderInitial,
minPasswordLength: minPasswordLength
}
var pendingPopoverMenu = this.pendingPopoverMenuTemplate(_.extend({}, pendingPopover))
var linkShares = this.getShareeList()
if (_.isArray(linkShares)) {
for (var i = 0; i < linkShares.length; i++) {
var social = []
OC.Share.Social.Collection.each(function(model) {
var url = model.get('url')
url = url.replace('{{reference}}', linkShares[i].shareLinkURL)
social.push({
url: url,
label: t('core', 'Share to {name}', { name: model.get('name') }),
name: model.get('name'),
iconClass: model.get('iconClass'),
newWindow: model.get('newWindow')
})
})
var popover = this.getPopoverObject(linkShares[i])
linkShares[i].popoverMenu = this.popoverMenuTemplate(_.extend({}, popoverBase, popover, { social: social }))
linkShares[i].pendingPopoverMenu = pendingPopoverMenu
}
}
this.$el.html(linkShareTemplate({
linkShares: linkShares,
shareAllowed: true,
nolinkShares: linkShares.length === 0,
newShareLabel: t('core', 'Share link'),
newShareTitle: t('core', 'New share link'),
pendingPopoverMenu: pendingPopoverMenu,
showPending: this.showPending === this.newShareId,
newShareId: this.newShareId
}))
this.delegateEvents()
// new note autosize
autosize(this.$el.find('.share-note-form .share-note'))
return this
},
onToggleMenu: function(event) {
event.preventDefault()
event.stopPropagation()
var $element = $(event.target)
var $li = $element.closest('li[data-share-id]')
var $menu = $li.find('.sharingOptionsGroup .popovermenu')
var shareId = $li.data('share-id')
OC.showMenu(null, $menu)
// focus the password if not set and enforced
var isPasswordEnabledByDefault = this.configModel.get('enableLinkPasswordByDefault') === true
var haspassword = $menu.find('.linkPassText').val() !== ''
if (!haspassword && isPasswordEnabledByDefault) {
$menu.find('.linkPassText').focus()
}
},
/**
* @returns {Function} from Handlebars
* @private
*/
template: function() {
return OC.Share.Templates['sharedialoglinkshareview']
},
/**
* renders the popover template and returns the resulting HTML
*
* @param {Object} data
* @returns {string}
*/
popoverMenuTemplate: function(data) {
return OC.Share.Templates['sharedialoglinkshareview_popover_menu'](data)
},
/**
* renders the pending popover template and returns the resulting HTML
*
* @param {Object} data
* @returns {string}
*/
pendingPopoverMenuTemplate: function(data) {
return OC.Share.Templates['sharedialoglinkshareview_popover_menu_pending'](data)
},
onPopUpClick: function(event) {
event.preventDefault()
event.stopPropagation()
var url = $(event.currentTarget).data('url')
var newWindow = $(event.currentTarget).data('window')
$(event.currentTarget).tooltip('hide')
if (url) {
if (newWindow === true) {
var width = 600
var height = 400
var left = (screen.width / 2) - (width / 2)
var top = (screen.height / 2) - (height / 2)
window.open(url, 'name', 'width=' + width + ', height=' + height + ', top=' + top + ', left=' + left)
} else {
window.location.href = url
}
}
},
onExpireDateChange: function(event) {
var $element = $(event.target)
var li = $element.closest('li[data-share-id]')
var shareId = li.data('share-id')
var expirationDatePicker = '#expirationDateContainer-' + shareId
var datePicker = $(expirationDatePicker)
var state = $element.prop('checked')
datePicker.toggleClass('hidden', !state)
if (!state) {
// disabled, let's hide the input and
// set the expireDate to nothing
$element.closest('li').next('li').addClass('hidden')
this.setExpirationDate('', shareId)
} else {
// enabled, show the input and the datepicker
$element.closest('li').next('li').removeClass('hidden')
this.showDatePicker(event)
}
},
showDatePicker: function(event) {
var $element = $(event.target)
var li = $element.closest('li[data-share-id]')
var shareId = li.data('share-id')
var maxDate = $element.data('max-date')
var expirationDatePicker = '#expirationDatePicker-' + shareId
var self = this
$(expirationDatePicker).datepicker({
dateFormat: 'dd-mm-yy',
onSelect: function(expireDate) {
self.setExpirationDate(expireDate, shareId)
},
maxDate: maxDate
})
$(expirationDatePicker).datepicker('show')
$(expirationDatePicker).focus()
},
setExpirationDate: function(expireDate, shareId) {
this.model.saveLinkShare({ expireDate: expireDate, cid: shareId })
},
onChangeExpirationDate: function(event) {
var $element = $(event.target)
var expireDate = $element.val()
var li = $element.closest('li[data-share-id]')
var shareId = li.data('share-id')
var expirationDatePicker = '#expirationDatePicker-' + shareId
this.setExpirationDate(expireDate, shareId)
$(expirationDatePicker).datepicker('hide')
},
/**
* get an array of sharees' share properties
*
* @returns {Array}
*/
getShareeList: function() {
var shares = this.model.get('linkShares')
if (!this.model.hasLinkShares()) {
return []
}
var list = []
for (var index = 0; index < shares.length; index++) {
var share = this.getShareeObject(index)
// first empty {} is necessary, otherwise we get in trouble
// with references
list.push(_.extend({}, share))
}
return list
},
/**
*
* @param {OC.Share.Types.ShareInfo} shareInfo
* @returns {object}
*/
getShareeObject: function(shareIndex) {
var share = this.model.get('linkShares')[shareIndex]
return _.extend({}, share, {
cid: share.id,
shareAllowed: true,
linkShareLabel: share.label ? share.label : t('core', 'Share link'),
popoverMenu: {},
shareLinkURL: share.url,
newShareTitle: t('core', 'New share link'),
copyLabel: t('core', 'Copy link'),
showPending: this.showPending === share.id,
linkShareCreationDate: t('core', 'Created on {time}', { time: moment(share.stime * 1000).format('LLLL') })
})
},
getPopoverObject: function(share) {
var publicUploadRWChecked = ''
var publicUploadRChecked = ''
var publicUploadWChecked = ''
switch (this.model.linkSharePermissions(share.id)) {
case OC.PERMISSION_READ:
publicUploadRChecked = 'checked'
break
case OC.PERMISSION_CREATE:
publicUploadWChecked = 'checked'
break
case OC.PERMISSION_UPDATE | OC.PERMISSION_CREATE | OC.PERMISSION_READ | OC.PERMISSION_DELETE:
publicUploadRWChecked = 'checked'
break
}
var isPasswordSet = !!share.password
var isPasswordEnabledByDefault = this.configModel.get('enableLinkPasswordByDefault') === true
var isPasswordEnforced = this.configModel.get('enforcePasswordForPublicLink')
var isExpirationEnforced = this.configModel.get('isDefaultExpireDateEnforced')
var defaultExpireDays = this.configModel.get('defaultExpireDate')
var hasExpireDate = !!share.expiration || isExpirationEnforced
var expireDate
if (hasExpireDate) {
expireDate = moment(share.expiration, 'YYYY-MM-DD').format('DD-MM-YYYY')
}
var isTalkEnabled = OC.appswebroots['spreed'] !== undefined
var sendPasswordByTalk = share.sendPasswordByTalk
var hideDownload = share.hideDownload
var maxDate = null
if (hasExpireDate) {
if (isExpirationEnforced) {
// TODO: hack: backend returns string instead of integer
var shareTime = share.stime
if (_.isNumber(shareTime)) {
shareTime = new Date(shareTime * 1000)
}
if (!shareTime) {
shareTime = new Date() // now
}
shareTime = OC.Util.stripTime(shareTime).getTime()
maxDate = new Date(shareTime + defaultExpireDays * 24 * 3600 * 1000)
}
}
return {
cid: share.id,
shareLinkURL: share.url,
passwordPlaceholder: isPasswordSet ? PASSWORD_PLACEHOLDER : PASSWORD_PLACEHOLDER_MESSAGE,
isPasswordSet: isPasswordSet || isPasswordEnabledByDefault || isPasswordEnforced,
showPasswordByTalkCheckBox: isTalkEnabled && isPasswordSet,
passwordByTalkLabel: t('core', 'Password protect by Talk'),
isPasswordByTalkSet: sendPasswordByTalk,
publicUploadRWChecked: publicUploadRWChecked,
publicUploadRChecked: publicUploadRChecked,
publicUploadWChecked: publicUploadWChecked,
hasExpireDate: hasExpireDate,
expireDate: expireDate,
shareNote: share.note,
hasNote: share.note !== '',
maxDate: maxDate,
hideDownload: hideDownload,
isExpirationEnforced: isExpirationEnforced
}
},
onUnshare: function(event) {
event.preventDefault()
event.stopPropagation()
var self = this
var $element = $(event.target)
if (!$element.is('a')) {
$element = $element.closest('a')
}
var $loading = $element.find('.icon-loading-small').eq(0)
if (!$loading.hasClass('hidden')) {
// in process
return false
}
$loading.removeClass('hidden')
var $li = $element.closest('li[data-share-id]')
var shareId = $li.data('share-id')
self.model.removeShare(shareId, {
success: function() {
$li.remove()
self.render()
},
error: function() {
$loading.addClass('hidden')
OC.Notification.showTemporary(t('core', 'Could not unshare'))
}
})
return false
}
})
OC.Share.ShareDialogLinkShareView = ShareDialogLinkShareView
})()

View File

@ -1,159 +0,0 @@
/* eslint-disable */
/*
* Copyright (c) 2015
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
/* globals Handlebars */
(function() {
if (!OC.Share) {
OC.Share = {}
}
/**
* @class OCA.Share.ShareDialogView
* @member {OC.Share.ShareItemModel} model
* @member {jQuery} $el
* @memberof OCA.Sharing
* @classdesc
*
* Represents the GUI of the share dialogue
*
*/
var ShareDialogResharerInfoView = OC.Backbone.View.extend({
/** @type {string} **/
id: 'shareDialogResharerInfo',
/** @type {string} **/
tagName: 'div',
/** @type {string} **/
className: 'reshare',
/** @type {OC.Share.ShareConfigModel} **/
configModel: undefined,
/** @type {Function} **/
_template: undefined,
initialize: function(options) {
var view = this
this.model.on('change:reshare', function() {
view.render()
})
if (!_.isUndefined(options.configModel)) {
this.configModel = options.configModel
} else {
throw 'missing OC.Share.ShareConfigModel'
}
},
render: function() {
if (!this.model.hasReshare()
|| this.model.getReshareOwner() === OC.currentUser) {
this.$el.empty()
return this
}
var reshareTemplate = this.template()
var ownerDisplayName = this.model.getReshareOwnerDisplayname()
var shareNote = this.model.getReshareNote()
var sharedByText = ''
if (this.model.getReshareType() === OC.Share.SHARE_TYPE_GROUP) {
sharedByText = t(
'core',
'Shared with you and the group {group} by {owner}',
{
group: this.model.getReshareWithDisplayName(),
owner: ownerDisplayName
},
undefined,
{ escape: false }
)
} else if (this.model.getReshareType() === OC.Share.SHARE_TYPE_CIRCLE) {
sharedByText = t(
'core',
'Shared with you and {circle} by {owner}',
{
circle: this.model.getReshareWithDisplayName(),
owner: ownerDisplayName
},
undefined,
{ escape: false }
)
} else if (this.model.getReshareType() === OC.Share.SHARE_TYPE_ROOM) {
if (this.model.get('reshare').share_with_displayname) {
sharedByText = t(
'core',
'Shared with you and the conversation {conversation} by {owner}',
{
conversation: this.model.getReshareWithDisplayName(),
owner: ownerDisplayName
},
undefined,
{ escape: false }
)
} else {
sharedByText = t(
'core',
'Shared with you in a conversation by {owner}',
{
owner: ownerDisplayName
},
undefined,
{ escape: false }
)
}
} else {
sharedByText = t(
'core',
'Shared with you by {owner}',
{ owner: ownerDisplayName },
undefined,
{ escape: false }
)
}
this.$el.html(reshareTemplate({
reshareOwner: this.model.getReshareOwner(),
sharedByText: sharedByText,
shareNote: shareNote,
hasShareNote: shareNote !== ''
}))
this.$el.find('.avatar').each(function() {
var $this = $(this)
$this.avatar($this.data('username'), 32)
})
this.$el.find('.reshare').contactsMenu(
this.model.getReshareOwner(),
OC.Share.SHARE_TYPE_USER,
this.$el)
return this
},
/**
* @returns {Function} from Handlebars
* @private
*/
template: function() {
return OC.Share.Templates['sharedialogresharerinfoview']
}
})
OC.Share.ShareDialogResharerInfoView = ShareDialogResharerInfoView
})()

View File

@ -1,777 +0,0 @@
/* eslint-disable */
/* global OC, Handlebars */
/*
* Copyright (c) 2015
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
/* globals Handlebars */
(function() {
var PASSWORD_PLACEHOLDER = '**********'
var PASSWORD_PLACEHOLDER_MESSAGE = t('core', 'Choose a password for the mail share')
if (!OC.Share) {
OC.Share = {}
}
/**
* @class OCA.Share.ShareDialogShareeListView
* @member {OC.Share.ShareItemModel} model
* @member {jQuery} $el
* @memberof OCA.Sharing
* @classdesc
*
* Represents the sharee list part in the GUI of the share dialogue
*
*/
var ShareDialogShareeListView = OC.Backbone.View.extend({
/** @type {string} **/
id: 'shareDialogLinkShare',
/** @type {OC.Share.ShareConfigModel} **/
configModel: undefined,
_menuOpen: false,
/** @type {boolean|number} **/
_renderPermissionChange: false,
events: {
'click .unshare': 'onUnshare',
'click .share-add': 'showNoteForm',
'click .share-note-delete': 'deleteNote',
'click .share-note-submit': 'updateNote',
'click .share-menu .icon-more': 'onToggleMenu',
'click .permissions': 'onPermissionChange',
'click .expireDate': 'onExpireDateChange',
'click .password': 'onMailSharePasswordProtectChange',
'click .passwordByTalk': 'onMailSharePasswordProtectByTalkChange',
'click .secureDrop': 'onSecureDropChange',
'keyup input.passwordField': 'onMailSharePasswordKeyUp',
'focusout input.passwordField': 'onMailSharePasswordEntered',
'change .datepicker': 'onChangeExpirationDate',
'click .datepicker': 'showDatePicker'
},
initialize: function(options) {
if (!_.isUndefined(options.configModel)) {
this.configModel = options.configModel
} else {
throw 'missing OC.Share.ShareConfigModel'
}
var view = this
this.model.on('change:shares', function() {
view.render()
})
},
/**
*
* @param {OC.Share.Types.ShareInfo} shareInfo
* @returns {object}
*/
getShareeObject: function(shareIndex) {
var shareWith = this.model.getShareWith(shareIndex)
var shareWithDisplayName = this.model.getShareWithDisplayName(shareIndex)
var shareWithAvatar = this.model.getShareWithAvatar(shareIndex)
var shareWithTitle = ''
var shareType = this.model.getShareType(shareIndex)
var sharedBy = this.model.getSharedBy(shareIndex)
var sharedByDisplayName = this.model.getSharedByDisplayName(shareIndex)
var fileOwnerUid = this.model.getFileOwnerUid(shareIndex)
var hasPermissionOverride = {}
if (shareType === OC.Share.SHARE_TYPE_GROUP) {
shareWithDisplayName = shareWithDisplayName + ' (' + t('core', 'group') + ')'
} else if (shareType === OC.Share.SHARE_TYPE_REMOTE) {
shareWithDisplayName = shareWithDisplayName + ' (' + t('core', 'remote') + ')'
} else if (shareType === OC.Share.SHARE_TYPE_REMOTE_GROUP) {
shareWithDisplayName = shareWithDisplayName + ' (' + t('core', 'remote group') + ')'
} else if (shareType === OC.Share.SHARE_TYPE_EMAIL) {
shareWithDisplayName = shareWithDisplayName + ' (' + t('core', 'email') + ')'
} else if (shareType === OC.Share.SHARE_TYPE_CIRCLE) {
} else if (shareType === OC.Share.SHARE_TYPE_ROOM) {
shareWithDisplayName = shareWithDisplayName + ' (' + t('core', 'conversation') + ')'
}
if (shareType === OC.Share.SHARE_TYPE_GROUP) {
shareWithTitle = shareWith + ' (' + t('core', 'group') + ')'
} else if (shareType === OC.Share.SHARE_TYPE_REMOTE) {
shareWithTitle = shareWith + ' (' + t('core', 'remote') + ')'
} else if (shareType === OC.Share.SHARE_TYPE_REMOTE_GROUP) {
shareWithTitle = shareWith + ' (' + t('core', 'remote group') + ')'
} else if (shareType === OC.Share.SHARE_TYPE_EMAIL) {
shareWithTitle = shareWith + ' (' + t('core', 'email') + ')'
} else if (shareType === OC.Share.SHARE_TYPE_CIRCLE) {
shareWithTitle = shareWith
// Force "shareWith" in the template to a safe value, as the
// original "shareWith" returned by the model may contain
// problematic characters like "'".
shareWith = 'circle-' + shareIndex
}
if (sharedBy !== OC.getCurrentUser().uid) {
var empty = shareWithTitle === ''
if (!empty) {
shareWithTitle += ' ('
}
shareWithTitle += t('core', 'shared by {sharer}', { sharer: sharedByDisplayName })
if (!empty) {
shareWithTitle += ')'
}
}
var share = this.model.get('shares')[shareIndex]
var password = share.password
var hasPassword = password !== null && password !== ''
var sendPasswordByTalk = share.send_password_by_talk
var shareNote = this.model.getNote(shareIndex)
return _.extend(hasPermissionOverride, {
cid: this.cid,
hasSharePermission: this.model.hasSharePermission(shareIndex),
editPermissionState: this.model.editPermissionState(shareIndex),
hasCreatePermission: this.model.hasCreatePermission(shareIndex),
hasUpdatePermission: this.model.hasUpdatePermission(shareIndex),
hasDeletePermission: this.model.hasDeletePermission(shareIndex),
sharedBy: sharedBy,
sharedByDisplayName: sharedByDisplayName,
shareWith: shareWith,
shareWithDisplayName: shareWithDisplayName,
shareWithAvatar: shareWithAvatar,
shareWithTitle: shareWithTitle,
shareType: shareType,
shareId: this.model.get('shares')[shareIndex].id,
modSeed: shareWithAvatar || (shareType !== OC.Share.SHARE_TYPE_USER && shareType !== OC.Share.SHARE_TYPE_CIRCLE && shareType !== OC.Share.SHARE_TYPE_ROOM),
owner: fileOwnerUid,
isShareWithCurrentUser: (shareType === OC.Share.SHARE_TYPE_USER && shareWith === OC.getCurrentUser().uid),
canUpdateShareSettings: (sharedBy === OC.getCurrentUser().uid || fileOwnerUid === OC.getCurrentUser().uid),
isRemoteShare: shareType === OC.Share.SHARE_TYPE_REMOTE,
isRemoteGroupShare: shareType === OC.Share.SHARE_TYPE_REMOTE_GROUP,
isNoteAvailable: shareType !== OC.Share.SHARE_TYPE_REMOTE && shareType !== OC.Share.SHARE_TYPE_REMOTE_GROUP,
isMailShare: shareType === OC.Share.SHARE_TYPE_EMAIL,
isCircleShare: shareType === OC.Share.SHARE_TYPE_CIRCLE,
isFileSharedByMail: shareType === OC.Share.SHARE_TYPE_EMAIL && !this.model.isFolder(),
isPasswordSet: hasPassword && !sendPasswordByTalk,
isPasswordByTalkSet: hasPassword && sendPasswordByTalk,
isTalkEnabled: OC.appswebroots['spreed'] !== undefined,
secureDropMode: !this.model.hasReadPermission(shareIndex),
hasExpireDate: this.model.getExpireDate(shareIndex) !== null,
shareNote: shareNote,
hasNote: shareNote !== '',
expireDate: moment(this.model.getExpireDate(shareIndex), 'YYYY-MM-DD').format('DD-MM-YYYY'),
// The password placeholder does not take into account if
// sending the password by Talk is enabled or not; when
// switching from sending the password by Talk to sending the
// password by email the password is reused and the share
// updated, so the placeholder already shows the password in the
// brief time between disabling sending the password by email
// and receiving the updated share.
passwordPlaceholder: hasPassword ? PASSWORD_PLACEHOLDER : PASSWORD_PLACEHOLDER_MESSAGE,
passwordByTalkPlaceholder: (hasPassword && sendPasswordByTalk) ? PASSWORD_PLACEHOLDER : PASSWORD_PLACEHOLDER_MESSAGE
})
},
getShareProperties: function() {
return {
unshareLabel: t('core', 'Unshare'),
addNoteLabel: t('core', 'Note to recipient'),
canShareLabel: t('core', 'Can reshare'),
canEditLabel: t('core', 'Can edit'),
createPermissionLabel: t('core', 'Can create'),
updatePermissionLabel: t('core', 'Can change'),
deletePermissionLabel: t('core', 'Can delete'),
secureDropLabel: t('core', 'File drop (upload only)'),
expireDateLabel: t('core', 'Set expiration date'),
passwordLabel: t('core', 'Password protect'),
passwordByTalkLabel: t('core', 'Password protect by Talk'),
crudsLabel: t('core', 'Access control'),
expirationDatePlaceholder: t('core', 'Expiration date'),
defaultExpireDate: moment().add(1, 'day').format('DD-MM-YYYY'), // Can't expire today
triangleSImage: OC.imagePath('core', 'actions/triangle-s'),
isResharingAllowed: this.configModel.get('isResharingAllowed'),
isPasswordForMailSharesRequired: this.configModel.get('isPasswordForMailSharesRequired'),
sharePermissionPossible: this.model.sharePermissionPossible(),
editPermissionPossible: this.model.editPermissionPossible(),
createPermissionPossible: this.model.createPermissionPossible(),
updatePermissionPossible: this.model.updatePermissionPossible(),
deletePermissionPossible: this.model.deletePermissionPossible(),
sharePermission: OC.PERMISSION_SHARE,
createPermission: OC.PERMISSION_CREATE,
updatePermission: OC.PERMISSION_UPDATE,
deletePermission: OC.PERMISSION_DELETE,
readPermission: OC.PERMISSION_READ,
isFolder: this.model.isFolder()
}
},
/**
* get an array of sharees' share properties
*
* @returns {Array}
*/
getShareeList: function() {
var universal = this.getShareProperties()
if (!this.model.hasUserShares()) {
return []
}
var shares = this.model.get('shares')
var list = []
for (var index = 0; index < shares.length; index++) {
var share = this.getShareeObject(index)
if (share.shareType === OC.Share.SHARE_TYPE_LINK) {
continue
}
// first empty {} is necessary, otherwise we get in trouble
// with references
list.push(_.extend({}, universal, share))
}
return list
},
getLinkReshares: function() {
var universal = {
unshareLabel: t('core', 'Unshare')
}
if (!this.model.hasUserShares()) {
return []
}
var shares = this.model.get('shares')
var list = []
for (var index = 0; index < shares.length; index++) {
var share = this.getShareeObject(index)
if (share.shareType !== OC.Share.SHARE_TYPE_LINK) {
continue
}
// first empty {} is necessary, otherwise we get in trouble
// with references
list.push(_.extend({}, universal, share, {
shareInitiator: shares[index].uid_owner,
shareInitiatorText: t('core', '{shareInitiatorDisplayName} shared via link', { shareInitiatorDisplayName: shares[index].displayname_owner })
}))
}
return list
},
render: function() {
if (!this._renderPermissionChange) {
this.$el.html(this.template({
cid: this.cid,
sharees: this.getShareeList(),
linkReshares: this.getLinkReshares()
}))
this.$('.avatar').each(function() {
var $this = $(this)
if ($this.hasClass('imageplaceholderseed')) {
$this.css({ width: 32, height: 32 })
if ($this.data('avatar')) {
$this.css('border-radius', '0%')
$this.css('background', 'url(' + $this.data('avatar') + ') no-repeat')
$this.css('background-size', '31px')
} else {
$this.imageplaceholder($this.data('seed'))
}
} else {
// user, size, ie8fix, hidedefault, callback, displayname
$this.avatar($this.data('username'), 32, undefined, undefined, undefined, $this.data('displayname'))
}
})
this.$('.has-tooltip').tooltip({
placement: 'bottom'
})
this.$('ul.shareWithList > li').each(function() {
var $this = $(this)
var shareWith = $this.data('share-with')
var shareType = $this.data('share-type')
$this.find('div.avatar, span.username').contactsMenu(shareWith, shareType, $this)
})
} else {
var permissionChangeShareId = parseInt(this._renderPermissionChange, 10)
var shareWithIndex = this.model.findShareWithIndex(permissionChangeShareId)
var sharee = this.getShareeObject(shareWithIndex)
$.extend(sharee, this.getShareProperties())
var $li = this.$('li[data-share-id=' + permissionChangeShareId + ']')
$li.find('.sharingOptionsGroup .popovermenu').replaceWith(this.popoverMenuTemplate(sharee))
}
var _this = this
this.getShareeList().forEach(function(sharee) {
var $edit = _this.$('#canEdit-' + _this.cid + '-' + sharee.shareId)
if ($edit.length === 1) {
$edit.prop('checked', sharee.editPermissionState === 'checked')
if (sharee.isFolder) {
$edit.prop('indeterminate', sharee.editPermissionState === 'indeterminate')
}
}
})
this.$('.popovermenu').on('afterHide', function() {
_this._menuOpen = false
})
this.$('.popovermenu').on('beforeHide', function() {
var shareId = parseInt(_this._menuOpen, 10)
if (!_.isNaN(shareId)) {
var datePickerClass = '.expirationDateContainer-' + _this.cid + '-' + shareId
var datePickerInput = '#expirationDatePicker-' + _this.cid + '-' + shareId
var expireDateCheckbox = '#expireDate-' + _this.cid + '-' + shareId
if ($(expireDateCheckbox).prop('checked')) {
$(datePickerInput).removeClass('hidden-visually')
$(datePickerClass).removeClass('hasDatepicker')
$(datePickerClass + ' .ui-datepicker').hide()
}
}
})
if (this._menuOpen !== false) {
// Open menu again if it was opened before
var shareId = parseInt(this._menuOpen, 10)
if (!_.isNaN(shareId)) {
var liSelector = 'li[data-share-id=' + shareId + ']'
OC.showMenu(null, this.$(liSelector + ' .sharingOptionsGroup .popovermenu'))
}
}
this._renderPermissionChange = false
// new note autosize
autosize(this.$el.find('.share-note-form .share-note'))
this.delegateEvents()
return this
},
/**
* @returns {Function} from Handlebars
* @private
*/
template: function(data) {
var sharees = data.sharees
if (_.isArray(sharees)) {
for (var i = 0; i < sharees.length; i++) {
data.sharees[i].popoverMenu = this.popoverMenuTemplate(sharees[i])
}
}
return OC.Share.Templates['sharedialogshareelistview'](data)
},
/**
* renders the popover template and returns the resulting HTML
*
* @param {Object} data
* @returns {string}
*/
popoverMenuTemplate: function(data) {
return OC.Share.Templates['sharedialogshareelistview_popover_menu'](data)
},
showNoteForm: function(event) {
event.preventDefault()
event.stopPropagation()
var $element = $(event.target)
var $menu = $element.closest('li')
var $form = $menu.next('li.share-note-form')
// show elements
$menu.find('.share-note-delete').toggleClass('hidden')
$form.toggleClass('hidden')
$form.find('textarea').focus()
},
deleteNote: function(event) {
event.preventDefault()
event.stopPropagation()
var self = this
var $element = $(event.target)
var $li = $element.closest('li[data-share-id]')
var shareId = $li.data('share-id')
var $menu = $element.closest('li')
var $form = $menu.next('li.share-note-form')
console.log($form.find('.share-note'))
$form.find('.share-note').val('')
$form.addClass('hidden')
$menu.find('.share-note-delete').addClass('hidden')
self.sendNote('', shareId, $menu)
},
updateNote: function(event) {
event.preventDefault()
event.stopPropagation()
var self = this
var $element = $(event.target)
var $li = $element.closest('li[data-share-id]')
var shareId = $li.data('share-id')
var $form = $element.closest('li.share-note-form')
var $menu = $form.prev('li')
var message = $form.find('.share-note').val().trim()
if (message.length < 1) {
return
}
self.sendNote(message, shareId, $menu)
},
sendNote: function(note, shareId, $menu) {
var $form = $menu.next('li.share-note-form')
var $submit = $form.find('input.share-note-submit')
var $error = $form.find('input.share-note-error')
$submit.prop('disabled', true)
$menu.find('.icon-loading-small').removeClass('hidden')
$menu.find('.icon-edit').hide()
var complete = function() {
$submit.prop('disabled', false)
$menu.find('.icon-loading-small').addClass('hidden')
$menu.find('.icon-edit').show()
}
var error = function() {
$error.show()
setTimeout(function() {
$error.hide()
}, 3000)
}
// send data
$.ajax({
method: 'PUT',
url: OC.linkToOCS('apps/files_sharing/api/v1/shares', 2) + shareId + '?' + OC.buildQueryString({ format: 'json' }),
data: { note: note },
complete: complete,
error: error
})
},
onUnshare: function(event) {
event.preventDefault()
event.stopPropagation()
var self = this
var $element = $(event.target)
if (!$element.is('a')) {
$element = $element.closest('a')
}
var $loading = $element.find('.icon-loading-small').eq(0)
if (!$loading.hasClass('hidden')) {
// in process
return false
}
$loading.removeClass('hidden')
var $li = $element.closest('li[data-share-id]')
var shareId = $li.data('share-id')
self.model.removeShare(shareId)
.done(function() {
$li.remove()
})
.fail(function() {
$loading.addClass('hidden')
OC.Notification.showTemporary(t('core', 'Could not unshare'))
})
return false
},
onToggleMenu: function(event) {
event.preventDefault()
event.stopPropagation()
var $element = $(event.target)
var $li = $element.closest('li[data-share-id]')
var $menu = $li.find('.sharingOptionsGroup .popovermenu')
OC.showMenu(null, $menu)
this._menuOpen = $li.data('share-id')
},
onExpireDateChange: function(event) {
var $element = $(event.target)
var li = $element.closest('li[data-share-id]')
var shareId = li.data('share-id')
var datePickerClass = '.expirationDateContainer-' + this.cid + '-' + shareId
var datePicker = $(datePickerClass)
var state = $element.prop('checked')
datePicker.toggleClass('hidden', !state)
if (!state) {
// disabled, let's hide the input and
// set the expireDate to nothing
$element.closest('li').next('li').addClass('hidden')
this.setExpirationDate(shareId, '')
} else {
// enabled, show the input and the datepicker
$element.closest('li').next('li').removeClass('hidden')
this.showDatePicker(event)
}
},
showDatePicker: function(event) {
var element = $(event.target)
var li = element.closest('li[data-share-id]')
var shareId = li.data('share-id')
var expirationDatePicker = '#expirationDatePicker-' + this.cid + '-' + shareId
var view = this
$(expirationDatePicker).datepicker({
dateFormat: 'dd-mm-yy',
onSelect: function(expireDate) {
view.setExpirationDate(shareId, expireDate)
}
})
$(expirationDatePicker).focus()
},
setExpirationDate: function(shareId, expireDate) {
this.model.updateShare(shareId, { expireDate: expireDate }, {})
},
onMailSharePasswordProtectChange: function(event) {
var element = $(event.target)
var li = element.closest('li[data-share-id]')
var shareId = li.data('share-id')
var passwordContainerClass = '.passwordMenu-' + this.cid + '-' + shareId
var passwordContainer = $(passwordContainerClass)
var loading = this.$el.find(passwordContainerClass + ' .icon-loading-small')
var inputClass = '#passwordField-' + this.cid + '-' + shareId
var passwordField = $(inputClass)
var state = element.prop('checked')
var passwordByTalkElement = $('#passwordByTalk-' + this.cid + '-' + shareId)
var passwordByTalkState = passwordByTalkElement.prop('checked')
if (!state && !passwordByTalkState) {
this.model.updateShare(shareId, { password: '', sendPasswordByTalk: false })
passwordField.attr('value', '')
passwordField.removeClass('error')
passwordField.tooltip('hide')
loading.addClass('hidden')
passwordField.attr('placeholder', PASSWORD_PLACEHOLDER_MESSAGE)
// We first need to reset the password field before we hide it
passwordContainer.toggleClass('hidden', !state)
} else if (state) {
if (passwordByTalkState) {
// Switching from sending the password by Talk to sending
// the password by mail can be done keeping the previous
// password sent by Talk.
this.model.updateShare(shareId, { sendPasswordByTalk: false })
var passwordByTalkContainerClass = '.passwordByTalkMenu-' + this.cid + '-' + shareId
var passwordByTalkContainer = $(passwordByTalkContainerClass)
passwordByTalkContainer.addClass('hidden')
passwordByTalkElement.prop('checked', false)
}
passwordContainer.toggleClass('hidden', !state)
passwordField = '#passwordField-' + this.cid + '-' + shareId
this.$(passwordField).focus()
}
},
onMailSharePasswordProtectByTalkChange: function(event) {
var element = $(event.target)
var li = element.closest('li[data-share-id]')
var shareId = li.data('share-id')
var passwordByTalkContainerClass = '.passwordByTalkMenu-' + this.cid + '-' + shareId
var passwordByTalkContainer = $(passwordByTalkContainerClass)
var loading = this.$el.find(passwordByTalkContainerClass + ' .icon-loading-small')
var inputClass = '#passwordByTalkField-' + this.cid + '-' + shareId
var passwordByTalkField = $(inputClass)
var state = element.prop('checked')
var passwordElement = $('#password-' + this.cid + '-' + shareId)
var passwordState = passwordElement.prop('checked')
if (!state) {
this.model.updateShare(shareId, { password: '', sendPasswordByTalk: false })
passwordByTalkField.attr('value', '')
passwordByTalkField.removeClass('error')
passwordByTalkField.tooltip('hide')
loading.addClass('hidden')
passwordByTalkField.attr('placeholder', PASSWORD_PLACEHOLDER_MESSAGE)
// We first need to reset the password field before we hide it
passwordByTalkContainer.toggleClass('hidden', !state)
} else if (state) {
if (passwordState) {
// Enabling sending the password by Talk requires a new
// password to be given (the one sent by mail is not reused,
// as it would defeat the purpose of checking the identity
// of the sharee by Talk if it was already sent by mail), so
// the share is not updated until the user explicitly gives
// the new password.
var passwordContainerClass = '.passwordMenu-' + this.cid + '-' + shareId
var passwordContainer = $(passwordContainerClass)
passwordContainer.addClass('hidden')
passwordElement.prop('checked', false)
}
passwordByTalkContainer.toggleClass('hidden', !state)
passwordByTalkField = '#passwordByTalkField-' + this.cid + '-' + shareId
this.$(passwordByTalkField).focus()
}
},
onMailSharePasswordKeyUp: function(event) {
if (event.keyCode === 13) {
this.onMailSharePasswordEntered(event)
}
},
onMailSharePasswordEntered: function(event) {
var passwordField = $(event.target)
var li = passwordField.closest('li[data-share-id]')
var shareId = li.data('share-id')
var passwordContainerClass = '.passwordMenu-' + this.cid + '-' + shareId
var passwordByTalkContainerClass = '.passwordByTalkMenu-' + this.cid + '-' + shareId
var sendPasswordByTalk = passwordField.attr('id').startsWith('passwordByTalk')
var loading
if (sendPasswordByTalk) {
loading = this.$el.find(passwordByTalkContainerClass + ' .icon-loading-small')
} else {
loading = this.$el.find(passwordContainerClass + ' .icon-loading-small')
}
if (!loading.hasClass('hidden')) {
// still in process
return
}
passwordField.removeClass('error')
var password = passwordField.val()
// in IE9 the password might be the placeholder due to bugs in the placeholders polyfill
if (password === '' || password === PASSWORD_PLACEHOLDER || password === PASSWORD_PLACEHOLDER_MESSAGE) {
return
}
loading
.removeClass('hidden')
.addClass('inlineblock')
this.model.updateShare(shareId, {
password: password,
sendPasswordByTalk: sendPasswordByTalk
}, {
error: function(model, msg) {
// destroy old tooltips
passwordField.tooltip('destroy')
loading.removeClass('inlineblock').addClass('hidden')
passwordField.addClass('error')
passwordField.attr('title', msg)
passwordField.tooltip({ placement: 'bottom', trigger: 'manual' })
passwordField.tooltip('show')
},
success: function(model, msg) {
passwordField.blur()
passwordField.attr('value', '')
passwordField.attr('placeholder', PASSWORD_PLACEHOLDER)
loading.removeClass('inlineblock').addClass('hidden')
}
})
},
onPermissionChange: function(event) {
event.preventDefault()
event.stopPropagation()
var $element = $(event.target)
var $li = $element.closest('li[data-share-id]')
var shareId = $li.data('share-id')
var permissions = OC.PERMISSION_READ
if (this.model.isFolder()) {
// adjust checkbox states
var $checkboxes = $('.permissions', $li).not('input[name="edit"]').not('input[name="share"]')
var checked
if ($element.attr('name') === 'edit') {
checked = $element.is(':checked')
// Check/uncheck Create, Update, and Delete checkboxes if Edit is checked/unck
$($checkboxes).prop('checked', checked)
if (checked) {
permissions |= OC.PERMISSION_CREATE | OC.PERMISSION_UPDATE | OC.PERMISSION_DELETE
}
} else {
var numberChecked = $checkboxes.filter(':checked').length
checked = numberChecked === $checkboxes.length
var $editCb = $('input[name="edit"]', $li)
$editCb.prop('checked', checked)
$editCb.prop('indeterminate', !checked && numberChecked > 0)
}
} else {
if ($element.attr('name') === 'edit' && $element.is(':checked')) {
permissions |= OC.PERMISSION_UPDATE
}
}
$('.permissions', $li).not('input[name="edit"]').filter(':checked').each(function(index, checkbox) {
permissions |= $(checkbox).data('permissions')
})
/** disable checkboxes during save operation to avoid race conditions **/
$li.find('input[type=checkbox]').prop('disabled', true)
var enableCb = function() {
$li.find('input[type=checkbox]').prop('disabled', false)
}
var errorCb = function(elem, msg) {
OC.dialogs.alert(msg, t('core', 'Error while sharing'))
enableCb()
}
this.model.updateShare(shareId, { permissions: permissions }, { error: errorCb, success: enableCb })
this._renderPermissionChange = shareId
},
onSecureDropChange: function(event) {
event.preventDefault()
event.stopPropagation()
var $element = $(event.target)
var $li = $element.closest('li[data-share-id]')
var shareId = $li.data('share-id')
var permissions = OC.PERMISSION_CREATE | OC.PERMISSION_UPDATE | OC.PERMISSION_DELETE | OC.PERMISSION_READ
if ($element.is(':checked')) {
permissions = OC.PERMISSION_CREATE | OC.PERMISSION_UPDATE | OC.PERMISSION_DELETE
}
/** disable checkboxes during save operation to avoid race conditions **/
$li.find('input[type=checkbox]').prop('disabled', true)
var enableCb = function() {
$li.find('input[type=checkbox]').prop('disabled', false)
}
var errorCb = function(elem, msg) {
OC.dialogs.alert(msg, t('core', 'Error while sharing'))
enableCb()
}
this.model.updateShare(shareId, { permissions: permissions }, { error: errorCb, success: enableCb })
this._renderPermissionChange = shareId
}
})
OC.Share.ShareDialogShareeListView = ShareDialogShareeListView
})()

File diff suppressed because it is too large Load Diff

View File

@ -1,945 +0,0 @@
/* eslint-disable */
/*
* Copyright (c) 2015
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
(function() {
if (!OC.Share) {
OC.Share = {}
OC.Share.Types = {}
}
/**
* @typedef {object} OC.Share.Types.LinkShareInfo
* @property {string} token
* @property {bool} hideDownload
* @property {string|null} password
* @property {bool} sendPasswordByTalk
* @property {number} permissions
* @property {Date} expiration
* @property {number} stime share time
*/
/**
* @typedef {object} OC.Share.Types.Reshare
* @property {string} uid_owner
* @property {number} share_type
* @property {string} share_with
* @property {string} displayname_owner
* @property {number} permissions
*/
/**
* @typedef {object} OC.Share.Types.ShareInfo
* @property {number} share_type
* @property {number} permissions
* @property {number} file_source optional
* @property {number} item_source
* @property {string} token
* @property {string} share_with
* @property {string} share_with_displayname
* @property {string} share_with_avatar
* @property {string} mail_send
* @property {Date} expiration optional?
* @property {number} stime optional?
* @property {string} uid_owner
* @property {string} displayname_owner
*/
/**
* @typedef {object} OC.Share.Types.ShareItemInfo
* @property {OC.Share.Types.Reshare} reshare
* @property {OC.Share.Types.ShareInfo[]} shares
* @property {OC.Share.Types.LinkShareInfo|undefined} linkShare
*/
/**
* These properties are sometimes returned by the server as strings instead
* of integers, so we need to convert them accordingly...
*/
var SHARE_RESPONSE_INT_PROPS = [
'id', 'file_parent', 'mail_send', 'file_source', 'item_source', 'permissions',
'storage', 'share_type', 'parent', 'stime'
]
/**
* @class OCA.Share.ShareItemModel
* @classdesc
*
* Represents the GUI of the share dialogue
*
* // FIXME: use OC Share API once #17143 is done
*
* // TODO: this really should be a collection of share item models instead,
* where the link share is one of them
*/
var ShareItemModel = OC.Backbone.Model.extend({
/**
* share id of the link share, if applicable
*/
_linkShareId: null,
initialize: function(attributes, options) {
if (!_.isUndefined(options.configModel)) {
this.configModel = options.configModel
}
if (!_.isUndefined(options.fileInfoModel)) {
/** @type {OC.Files.FileInfo} **/
this.fileInfoModel = options.fileInfoModel
}
_.bindAll(this, 'addShare')
},
defaults: {
allowPublicUploadStatus: false,
permissions: 0,
linkShares: []
},
/**
* Saves the current link share information.
*
* This will trigger an ajax call and, if successful, refetch the model
* afterwards. Callbacks "success", "error" and "complete" can be given
* in the options object; "success" is called after a successful save
* once the model is refetch, "error" is called after a failed save, and
* "complete" is called both after a successful save and after a failed
* save. Note that "complete" is called before "success" and "error" are
* called (unlike in jQuery, in which it is called after them); this
* ensures that "complete" is called even if refetching the model fails.
*
* TODO: this should be a separate model
*/
saveLinkShare: function(attributes, options) {
options = options || {}
attributes = _.extend({}, attributes)
var shareId = null
var call
// oh yeah...
if (attributes.expiration) {
attributes.expireDate = attributes.expiration
delete attributes.expiration
}
var linkShares = this.get('linkShares')
var shareIndex = _.findIndex(linkShares, function(share) { return share.id === attributes.cid })
if (linkShares.length > 0 && shareIndex !== -1) {
shareId = linkShares[shareIndex].id
// note: update can only update a single value at a time
call = this.updateShare(shareId, attributes, options)
} else {
attributes = _.defaults(attributes, {
hideDownload: false,
password: '',
passwordChanged: false,
sendPasswordByTalk: false,
permissions: OC.PERMISSION_READ,
expireDate: this.configModel.getDefaultExpirationDateString(),
shareType: OC.Share.SHARE_TYPE_LINK
})
call = this.addShare(attributes, options)
}
return call
},
addShare: function(attributes, options) {
var shareType = attributes.shareType
attributes = _.extend({}, attributes)
// get default permissions
var defaultPermissions = OC.getCapabilities()['files_sharing']['default_permissions'] || OC.PERMISSION_ALL
var possiblePermissions = OC.PERMISSION_READ
if (this.updatePermissionPossible()) {
possiblePermissions = possiblePermissions | OC.PERMISSION_UPDATE
}
if (this.createPermissionPossible()) {
possiblePermissions = possiblePermissions | OC.PERMISSION_CREATE
}
if (this.deletePermissionPossible()) {
possiblePermissions = possiblePermissions | OC.PERMISSION_DELETE
}
if (this.configModel.get('isResharingAllowed') && (this.sharePermissionPossible())) {
possiblePermissions = possiblePermissions | OC.PERMISSION_SHARE
}
attributes.permissions = defaultPermissions & possiblePermissions
if (_.isUndefined(attributes.path)) {
attributes.path = this.fileInfoModel.getFullPath()
}
return this._addOrUpdateShare({
type: 'POST',
url: this._getUrl('shares'),
data: attributes,
dataType: 'json'
}, options)
},
updateShare: function(shareId, attrs, options) {
return this._addOrUpdateShare({
type: 'PUT',
url: this._getUrl('shares/' + encodeURIComponent(shareId)),
data: attrs,
dataType: 'json'
}, options)
},
_addOrUpdateShare: function(ajaxSettings, options) {
var self = this
options = options || {}
return $.ajax(
ajaxSettings
).always(function() {
if (_.isFunction(options.complete)) {
options.complete(self)
}
}).done(function() {
self.fetch().done(function() {
if (_.isFunction(options.success)) {
options.success(self)
}
})
}).fail(function(xhr) {
var msg = t('core', 'Error')
var result = xhr.responseJSON
if (result && result.ocs && result.ocs.meta) {
msg = result.ocs.meta.message
}
if (_.isFunction(options.error)) {
options.error(self, msg)
} else {
OC.dialogs.alert(msg, t('core', 'Error while sharing'))
}
})
},
/**
* Deletes the share with the given id
*
* @param {int} shareId share id
* @returns {jQuery}
*/
removeShare: function(shareId, options) {
var self = this
options = options || {}
return $.ajax({
type: 'DELETE',
url: this._getUrl('shares/' + encodeURIComponent(shareId))
}).done(function() {
self.fetch({
success: function() {
if (_.isFunction(options.success)) {
options.success(self)
}
}
})
}).fail(function(xhr) {
var msg = t('core', 'Error')
var result = xhr.responseJSON
if (result.ocs && result.ocs.meta) {
msg = result.ocs.meta.message
}
if (_.isFunction(options.error)) {
options.error(self, msg)
} else {
OC.dialogs.alert(msg, t('core', 'Error removing share'))
}
})
},
/**
* @returns {boolean}
*/
isPublicUploadAllowed: function() {
return this.get('allowPublicUploadStatus')
},
isPublicEditingAllowed: function() {
return this.get('allowPublicEditingStatus')
},
/**
* @returns {boolean}
*/
isHideFileListSet: function() {
return this.get('hideFileListStatus')
},
/**
* @returns {boolean}
*/
isFolder: function() {
return this.get('itemType') === 'folder'
},
/**
* @returns {boolean}
*/
isFile: function() {
return this.get('itemType') === 'file'
},
/**
* whether this item has reshare information
* @returns {boolean}
*/
hasReshare: function() {
var reshare = this.get('reshare')
return _.isObject(reshare) && !_.isUndefined(reshare.uid_owner)
},
/**
* whether this item has user share information
* @returns {boolean}
*/
hasUserShares: function() {
return this.getSharesWithCurrentItem().length > 0
},
/**
* Returns whether this item has link shares
*
* @returns {bool} true if a link share exists, false otherwise
*/
hasLinkShares: function() {
var linkShares = this.get('linkShares')
if (linkShares && linkShares.length > 0) {
return true
}
return false
},
/**
* @returns {string}
*/
getReshareOwner: function() {
return this.get('reshare').uid_owner
},
/**
* @returns {string}
*/
getReshareOwnerDisplayname: function() {
return this.get('reshare').displayname_owner
},
/**
* @returns {string}
*/
getReshareNote: function() {
return this.get('reshare').note
},
/**
* @returns {string}
*/
getReshareWith: function() {
return this.get('reshare').share_with
},
/**
* @returns {string}
*/
getReshareWithDisplayName: function() {
var reshare = this.get('reshare')
return reshare.share_with_displayname || reshare.share_with
},
/**
* @returns {number}
*/
getReshareType: function() {
return this.get('reshare').share_type
},
getExpireDate: function(shareIndex) {
return this._shareExpireDate(shareIndex)
},
getNote: function(shareIndex) {
return this._shareNote(shareIndex)
},
/**
* Returns all share entries that only apply to the current item
* (file/folder)
*
* @returns {Array.<OC.Share.Types.ShareInfo>}
*/
getSharesWithCurrentItem: function() {
var shares = this.get('shares') || []
var fileId = this.fileInfoModel.get('id')
return _.filter(shares, function(share) {
return share.item_source === fileId
})
},
/**
* @param shareIndex
* @returns {string}
*/
getShareWith: function(shareIndex) {
/** @type OC.Share.Types.ShareInfo **/
var share = this.get('shares')[shareIndex]
if (!_.isObject(share)) {
throw 'Unknown Share'
}
return share.share_with
},
/**
* @param shareIndex
* @returns {string}
*/
getShareWithDisplayName: function(shareIndex) {
/** @type OC.Share.Types.ShareInfo **/
var share = this.get('shares')[shareIndex]
if (!_.isObject(share)) {
throw 'Unknown Share'
}
return share.share_with_displayname
},
/**
* @param shareIndex
* @returns {string}
*/
getShareWithAvatar: function(shareIndex) {
/** @type OC.Share.Types.ShareInfo **/
var share = this.get('shares')[shareIndex]
if (!_.isObject(share)) {
throw 'Unknown Share'
}
return share.share_with_avatar
},
/**
* @param shareIndex
* @returns {string}
*/
getSharedBy: function(shareIndex) {
/** @type OC.Share.Types.ShareInfo **/
var share = this.get('shares')[shareIndex]
if (!_.isObject(share)) {
throw 'Unknown Share'
}
return share.uid_owner
},
/**
* @param shareIndex
* @returns {string}
*/
getSharedByDisplayName: function(shareIndex) {
/** @type OC.Share.Types.ShareInfo **/
var share = this.get('shares')[shareIndex]
if (!_.isObject(share)) {
throw 'Unknown Share'
}
return share.displayname_owner
},
/**
* @param shareIndex
* @returns {string}
*/
getFileOwnerUid: function(shareIndex) {
/** @type OC.Share.Types.ShareInfo **/
var share = this.get('shares')[shareIndex]
if (!_.isObject(share)) {
throw 'Unknown Share'
}
return share.uid_file_owner
},
/**
* returns the array index of a sharee for a provided shareId
*
* @param shareId
* @returns {number}
*/
findShareWithIndex: function(shareId) {
var shares = this.get('shares')
if (!_.isArray(shares)) {
throw 'Unknown Share'
}
for (var i = 0; i < shares.length; i++) {
var shareWith = shares[i]
if (shareWith.id === shareId) {
return i
}
}
throw 'Unknown Sharee'
},
getShareType: function(shareIndex) {
/** @type OC.Share.Types.ShareInfo **/
var share = this.get('shares')[shareIndex]
if (!_.isObject(share)) {
throw 'Unknown Share'
}
return share.share_type
},
/**
* whether a share from shares has the requested permission
*
* @param {number} shareIndex
* @param {number} permission
* @returns {boolean}
* @private
*/
_shareHasPermission: function(shareIndex, permission) {
/** @type OC.Share.Types.ShareInfo **/
var share = this.get('shares')[shareIndex]
if (!_.isObject(share)) {
throw 'Unknown Share'
}
return (share.permissions & permission) === permission
},
_shareExpireDate: function(shareIndex) {
var share = this.get('shares')[shareIndex]
if (!_.isObject(share)) {
throw 'Unknown Share'
}
var date2 = share.expiration
return date2
},
_shareNote: function(shareIndex) {
var share = this.get('shares')[shareIndex]
if (!_.isObject(share)) {
throw 'Unknown Share'
}
return share.note
},
/**
* @returns {int}
*/
getPermissions: function() {
return this.get('permissions')
},
/**
* @returns {boolean}
*/
sharePermissionPossible: function() {
return (this.get('permissions') & OC.PERMISSION_SHARE) === OC.PERMISSION_SHARE
},
/**
* @param {number} shareIndex
* @returns {boolean}
*/
hasSharePermission: function(shareIndex) {
return this._shareHasPermission(shareIndex, OC.PERMISSION_SHARE)
},
/**
* @returns {boolean}
*/
createPermissionPossible: function() {
return (this.get('permissions') & OC.PERMISSION_CREATE) === OC.PERMISSION_CREATE
},
/**
* @param {number} shareIndex
* @returns {boolean}
*/
hasCreatePermission: function(shareIndex) {
return this._shareHasPermission(shareIndex, OC.PERMISSION_CREATE)
},
/**
* @returns {boolean}
*/
updatePermissionPossible: function() {
return (this.get('permissions') & OC.PERMISSION_UPDATE) === OC.PERMISSION_UPDATE
},
/**
* @param {number} shareIndex
* @returns {boolean}
*/
hasUpdatePermission: function(shareIndex) {
return this._shareHasPermission(shareIndex, OC.PERMISSION_UPDATE)
},
/**
* @returns {boolean}
*/
deletePermissionPossible: function() {
return (this.get('permissions') & OC.PERMISSION_DELETE) === OC.PERMISSION_DELETE
},
/**
* @param {number} shareIndex
* @returns {boolean}
*/
hasDeletePermission: function(shareIndex) {
return this._shareHasPermission(shareIndex, OC.PERMISSION_DELETE)
},
hasReadPermission: function(shareIndex) {
return this._shareHasPermission(shareIndex, OC.PERMISSION_READ)
},
/**
* @returns {boolean}
*/
editPermissionPossible: function() {
return this.createPermissionPossible()
|| this.updatePermissionPossible()
|| this.deletePermissionPossible()
},
/**
* @returns {string}
* The state that the 'can edit' permission checkbox should have.
* Possible values:
* - empty string: no permission
* - 'checked': all applicable permissions
* - 'indeterminate': some but not all permissions
*/
editPermissionState: function(shareIndex) {
var hcp = this.hasCreatePermission(shareIndex)
var hup = this.hasUpdatePermission(shareIndex)
var hdp = this.hasDeletePermission(shareIndex)
if (this.isFile()) {
if (hcp || hup || hdp) {
return 'checked'
}
return ''
}
if (!hcp && !hup && !hdp) {
return ''
}
if ((this.createPermissionPossible() && !hcp)
|| (this.updatePermissionPossible() && !hup)
|| (this.deletePermissionPossible() && !hdp)) {
return 'indeterminate'
}
return 'checked'
},
/**
* @returns {int}
*/
linkSharePermissions: function(shareId) {
var linkShares = this.get('linkShares')
var shareIndex = _.findIndex(linkShares, function(share) { return share.id === shareId })
if (!this.hasLinkShares()) {
return -1
} else if (linkShares.length > 0 && shareIndex !== -1) {
return linkShares[shareIndex].permissions
}
return -1
},
_getUrl: function(base, params) {
params = _.extend({ format: 'json' }, params || {})
return OC.linkToOCS('apps/files_sharing/api/v1', 2) + base + '?' + OC.buildQueryString(params)
},
_fetchShares: function() {
var path = this.fileInfoModel.getFullPath()
return $.ajax({
type: 'GET',
url: this._getUrl('shares', { path: path, reshares: true })
})
},
_fetchReshare: function() {
// only fetch original share once
if (!this._reshareFetched) {
var path = this.fileInfoModel.getFullPath()
this._reshareFetched = true
return $.ajax({
type: 'GET',
url: this._getUrl('shares', { path: path, shared_with_me: true })
})
} else {
return $.Deferred().resolve([{
ocs: {
data: [this.get('reshare')]
}
}])
}
},
/**
* Group reshares into a single super share element.
* Does this by finding the most precise share and
* combines the permissions to be the most permissive.
*
* @param {Array} reshares
* @returns {Object} reshare
*/
_groupReshares: function(reshares) {
if (!reshares || !reshares.length) {
return false
}
var superShare = reshares.shift()
var combinedPermissions = superShare.permissions
_.each(reshares, function(reshare) {
// use share have higher priority than group share
if (reshare.share_type === OC.Share.SHARE_TYPE_USER && superShare.share_type === OC.Share.SHARE_TYPE_GROUP) {
superShare = reshare
}
combinedPermissions |= reshare.permissions
})
superShare.permissions = combinedPermissions
return superShare
},
fetch: function(options) {
var model = this
this.trigger('request', this)
var deferred = $.when(
this._fetchShares(),
this._fetchReshare()
)
deferred.done(function(data1, data2) {
model.trigger('sync', 'GET', this)
var sharesMap = {}
_.each(data1[0].ocs.data, function(shareItem) {
sharesMap[shareItem.id] = shareItem
})
var reshare = false
if (data2[0].ocs.data.length) {
reshare = model._groupReshares(data2[0].ocs.data)
}
model.set(model.parse({
shares: sharesMap,
reshare: reshare
}))
if (!_.isUndefined(options) && _.isFunction(options.success)) {
options.success()
}
})
return deferred
},
/**
* Updates OC.Share.itemShares and OC.Share.statuses.
*
* This is required in case the user navigates away and comes back,
* the share statuses from the old arrays are still used to fill in the icons
* in the file list.
*/
_legacyFillCurrentShares: function(shares) {
var fileId = this.fileInfoModel.get('id')
if (!shares || !shares.length) {
delete OC.Share.statuses[fileId]
OC.Share.currentShares = {}
OC.Share.itemShares = []
return
}
var currentShareStatus = OC.Share.statuses[fileId]
if (!currentShareStatus) {
currentShareStatus = { link: false }
OC.Share.statuses[fileId] = currentShareStatus
}
currentShareStatus.link = false
OC.Share.currentShares = {}
OC.Share.itemShares = []
_.each(shares,
/**
* @param {OC.Share.Types.ShareInfo} share
*/
function(share) {
if (share.share_type === OC.Share.SHARE_TYPE_LINK) {
OC.Share.itemShares[share.share_type] = true
currentShareStatus.link = true
} else {
if (!OC.Share.itemShares[share.share_type]) {
OC.Share.itemShares[share.share_type] = []
}
OC.Share.itemShares[share.share_type].push(share.share_with)
}
}
)
},
parse: function(data) {
if (data === false) {
console.warn('no data was returned')
this.trigger('fetchError')
return {}
}
var permissions = this.fileInfoModel.get('permissions')
if (!_.isUndefined(data.reshare) && !_.isUndefined(data.reshare.permissions) && data.reshare.uid_owner !== OC.currentUser) {
permissions = permissions & data.reshare.permissions
}
var allowPublicUploadStatus = false
if (!_.isUndefined(data.shares)) {
$.each(data.shares, function(key, value) {
if (value.share_type === OC.Share.SHARE_TYPE_LINK) {
allowPublicUploadStatus = !!((value.permissions & OC.PERMISSION_CREATE))
return true
}
})
}
var allowPublicEditingStatus = true
if (!_.isUndefined(data.shares)) {
$.each(data.shares, function(key, value) {
if (value.share_type === OC.Share.SHARE_TYPE_LINK) {
allowPublicEditingStatus = !!((value.permissions & OC.PERMISSION_UPDATE))
return true
}
})
}
var hideFileListStatus = false
if (!_.isUndefined(data.shares)) {
$.each(data.shares, function(key, value) {
if (value.share_type === OC.Share.SHARE_TYPE_LINK) {
hideFileListStatus = !((value.permissions & OC.PERMISSION_READ))
return true
}
})
}
/** @type {OC.Share.Types.ShareInfo[]} **/
var shares = _.map(data.shares, function(share) {
// properly parse some values because sometimes the server
// returns integers as string...
var i
for (i = 0; i < SHARE_RESPONSE_INT_PROPS.length; i++) {
var prop = SHARE_RESPONSE_INT_PROPS[i]
if (!_.isUndefined(share[prop])) {
share[prop] = parseInt(share[prop], 10)
}
}
return share
})
this._legacyFillCurrentShares(shares)
var linkShares = []
// filter out the share by link
shares = _.reject(shares,
/**
* @param {OC.Share.Types.ShareInfo} share
*/
function(share) {
var isShareLink
= share.share_type === OC.Share.SHARE_TYPE_LINK
&& (share.file_source === this.get('itemSource')
|| share.item_source === this.get('itemSource'))
if (isShareLink) {
/**
* Ignore reshared link shares for now
* FIXME: Find a way to display properly
*/
if (share.uid_owner !== OC.currentUser) {
return
}
var link = window.location.protocol + '//' + window.location.host
if (!share.token) {
// pre-token link
var fullPath = this.fileInfoModel.get('path') + '/'
+ this.fileInfoModel.get('name')
var location = '/' + OC.currentUser + '/files' + fullPath
var type = this.fileInfoModel.isDirectory() ? 'folder' : 'file'
link += OC.linkTo('', 'public.php') + '?service=files&'
+ type + '=' + encodeURIComponent(location)
} else {
link += OC.generateUrl('/s/') + share.token
}
linkShares.push(_.extend({}, share, {
// hide_download is returned as an int, so force it
// to a boolean
hideDownload: !!share.hide_download,
password: share.share_with,
sendPasswordByTalk: share.send_password_by_talk
}))
return share
}
},
this
)
return {
reshare: data.reshare,
shares: shares,
linkShares: linkShares,
permissions: permissions,
allowPublicUploadStatus: allowPublicUploadStatus,
allowPublicEditingStatus: allowPublicEditingStatus,
hideFileListStatus: hideFileListStatus
}
},
/**
* Parses a string to an valid integer (unix timestamp)
* @param time
* @returns {*}
* @internal Only used to work around a bug in the backend
*/
_parseTime: function(time) {
if (_.isString(time)) {
// skip empty strings and hex values
if (time === '' || (time.length > 1 && time[0] === '0' && time[1] === 'x')) {
return null
}
time = parseInt(time, 10)
if (isNaN(time)) {
time = null
}
}
return time
},
/**
* Returns a list of share types from the existing shares.
*
* @returns {Array.<int>} array of share types
*/
getShareTypes: function() {
var result
result = _.pluck(this.getSharesWithCurrentItem(), 'share_type')
if (this.hasLinkShares()) {
result.push(OC.Share.SHARE_TYPE_LINK)
}
return _.uniq(result)
}
})
OC.Share.ShareItemModel = ShareItemModel
})()

View File

@ -1,54 +0,0 @@
/**
* @copyright 2017, Roeland Jago Douma <roeland@famdouma.nl>
*
* @author Roeland Jago Douma <roeland@famdouma.nl>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
(function() {
if (!OC.Share) {
OC.Share = {}
}
OC.Share.Social = {}
var SocialModel = OC.Backbone.Model.extend({
defaults: {
/** used for sorting social buttons */
key: null,
/** url to open, {{reference}} will be replaced with the link */
url: null,
/** Name to show in the tooltip */
name: null,
/** Icon class to display */
iconClass: null,
/** Open in new windows */
newWindow: true
}
})
OC.Share.Social.Model = SocialModel
var SocialCollection = OC.Backbone.Collection.extend({
model: OC.Share.Social.Model,
comparator: 'key'
})
OC.Share.Social.Collection = new SocialCollection()
})()

View File

@ -1,686 +0,0 @@
(function() {
var template = Handlebars.template, templates = OC.Share.Templates = OC.Share.Templates || {};
templates['sharedialoglinkshareview'] = template({"1":function(container,depth0,helpers,partials,data) {
var stack1, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {});
return "<ul class=\"shareWithList\">\n"
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.nolinkShares : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ ((stack1 = helpers.each.call(alias2,(depth0 != null ? depth0.linkShares : depth0),{"name":"each","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "</ul>\n";
},"2":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return " <li data-share-id=\""
+ alias5(((helper = (helper = helpers.newShareId || (depth0 != null ? depth0.newShareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"newShareId","hash":{},"data":data}) : helper)))
+ "\">\n <div class=\"avatar icon-public-white\"></div>\n <span class=\"username\">"
+ alias5(((helper = (helper = helpers.newShareLabel || (depth0 != null ? depth0.newShareLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"newShareLabel","hash":{},"data":data}) : helper)))
+ "</span>\n <span class=\"sharingOptionsGroup\">\n <div class=\"share-menu\">\n <a href=\"#\" class=\"icon icon-add new-share has-tooltip "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.showPending : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\" title=\""
+ alias5(((helper = (helper = helpers.newShareTitle || (depth0 != null ? depth0.newShareTitle : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"newShareTitle","hash":{},"data":data}) : helper)))
+ "\"></a>\n <span class=\"icon icon-loading-small "
+ ((stack1 = helpers.unless.call(alias2,(depth0 != null ? depth0.showPending : depth0),{"name":"unless","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\"></span>\n"
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.showPending : depth0),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " </div>\n </span>\n </li>\n";
},"3":function(container,depth0,helpers,partials,data) {
return "hidden";
},"5":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable;
return " "
+ ((stack1 = ((helper = (helper = helpers.pendingPopoverMenu || (depth0 != null ? depth0.pendingPopoverMenu : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"pendingPopoverMenu","hash":{},"data":data}) : helper))) != null ? stack1 : "")
+ "\n";
},"7":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return " <li data-share-id=\""
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\">\n <div class=\"avatar icon-public-white\"></div>\n <span class=\"username\" title=\""
+ alias5(((helper = (helper = helpers.linkShareCreationDate || (depth0 != null ? depth0.linkShareCreationDate : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"linkShareCreationDate","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.linkShareLabel || (depth0 != null ? depth0.linkShareLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"linkShareLabel","hash":{},"data":data}) : helper)))
+ "</span>\n \n <span class=\"sharingOptionsGroup\">\n <a href=\"#\" class=\"clipboard-button icon icon-clippy has-tooltip\" data-clipboard-text=\""
+ alias5(((helper = (helper = helpers.shareLinkURL || (depth0 != null ? depth0.shareLinkURL : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareLinkURL","hash":{},"data":data}) : helper)))
+ "\" title=\""
+ alias5(((helper = (helper = helpers.copyLabel || (depth0 != null ? depth0.copyLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"copyLabel","hash":{},"data":data}) : helper)))
+ "\"></a>\n <div class=\"share-menu\">\n <a href=\"#\" class=\"icon icon-more "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.showPending : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\"></a>\n <span class=\"icon icon-loading-small "
+ ((stack1 = helpers.unless.call(alias2,(depth0 != null ? depth0.showPending : depth0),{"name":"unless","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\"></span>\n"
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.showPending : depth0),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.program(8, data, 0),"data":data})) != null ? stack1 : "")
+ " </div>\n </span>\n </li>\n";
},"8":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable;
return " "
+ ((stack1 = ((helper = (helper = helpers.popoverMenu || (depth0 != null ? depth0.popoverMenu : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"popoverMenu","hash":{},"data":data}) : helper))) != null ? stack1 : "")
+ "\n";
},"10":function(container,depth0,helpers,partials,data) {
var stack1, alias1=container.propertyIsEnumerable;
return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.noSharingPlaceholder : depth0),{"name":"if","hash":{},"fn":container.program(11, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\n";
},"11":function(container,depth0,helpers,partials,data) {
var helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return "<input id=\"shareWith-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\" class=\"shareWithField\" type=\"text\" placeholder=\""
+ alias5(((helper = (helper = helpers.noSharingPlaceholder || (depth0 != null ? depth0.noSharingPlaceholder : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"noSharingPlaceholder","hash":{},"data":data}) : helper)))
+ "\" disabled=\"disabled\" />";
},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
var stack1, alias1=container.propertyIsEnumerable;
return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.shareAllowed : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.program(10, data, 0),"data":data})) != null ? stack1 : "");
},"useData":true});
templates['sharedialoglinkshareview_popover_menu'] = template({"1":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return " <li>\n <span class=\"menuitem\">\n <span class=\"icon-loading-small hidden\"></span>\n <input type=\"radio\" name=\"publicUpload\" value=\""
+ alias5(((helper = (helper = helpers.publicUploadRValue || (depth0 != null ? depth0.publicUploadRValue : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"publicUploadRValue","hash":{},"data":data}) : helper)))
+ "\" id=\"sharingDialogAllowPublicUpload-r-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\" class=\"radio publicUploadRadio\" "
+ ((stack1 = ((helper = (helper = helpers.publicUploadRChecked || (depth0 != null ? depth0.publicUploadRChecked : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"publicUploadRChecked","hash":{},"data":data}) : helper))) != null ? stack1 : "")
+ " />\n <label for=\"sharingDialogAllowPublicUpload-r-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.publicUploadRLabel || (depth0 != null ? depth0.publicUploadRLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"publicUploadRLabel","hash":{},"data":data}) : helper)))
+ "</label>\n </span>\n </li>\n <li>\n <span class=\"menuitem\">\n <span class=\"icon-loading-small hidden\"></span>\n <input type=\"radio\" name=\"publicUpload\" value=\""
+ alias5(((helper = (helper = helpers.publicUploadRWValue || (depth0 != null ? depth0.publicUploadRWValue : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"publicUploadRWValue","hash":{},"data":data}) : helper)))
+ "\" id=\"sharingDialogAllowPublicUpload-rw-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\" class=\"radio publicUploadRadio\" "
+ ((stack1 = ((helper = (helper = helpers.publicUploadRWChecked || (depth0 != null ? depth0.publicUploadRWChecked : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"publicUploadRWChecked","hash":{},"data":data}) : helper))) != null ? stack1 : "")
+ " />\n <label for=\"sharingDialogAllowPublicUpload-rw-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.publicUploadRWLabel || (depth0 != null ? depth0.publicUploadRWLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"publicUploadRWLabel","hash":{},"data":data}) : helper)))
+ "</label>\n </span>\n </li>\n <li>\n <span class=\"menuitem\">\n <span class=\"icon-loading-small hidden\"></span>\n <input type=\"radio\" name=\"publicUpload\" value=\""
+ alias5(((helper = (helper = helpers.publicUploadWValue || (depth0 != null ? depth0.publicUploadWValue : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"publicUploadWValue","hash":{},"data":data}) : helper)))
+ "\" id=\"sharingDialogAllowPublicUpload-w-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\" class=\"radio publicUploadRadio\" "
+ ((stack1 = ((helper = (helper = helpers.publicUploadWChecked || (depth0 != null ? depth0.publicUploadWChecked : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"publicUploadWChecked","hash":{},"data":data}) : helper))) != null ? stack1 : "")
+ " />\n <label for=\"sharingDialogAllowPublicUpload-w-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.publicUploadWLabel || (depth0 != null ? depth0.publicUploadWLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"publicUploadWLabel","hash":{},"data":data}) : helper)))
+ "</label>\n </span>\n </li>\n";
},"3":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return " <li id=\"allowPublicEditingWrapper\">\n <span class=\"menuitem\">\n <span class=\"icon-loading-small hidden\"></span>\n <input type=\"checkbox\" name=\"allowPublicEditing\" id=\"sharingDialogAllowPublicEditing-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\" class=\"checkbox publicEditingCheckbox\" "
+ ((stack1 = ((helper = (helper = helpers.publicEditingChecked || (depth0 != null ? depth0.publicEditingChecked : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"publicEditingChecked","hash":{},"data":data}) : helper))) != null ? stack1 : "")
+ " />\n <label for=\"sharingDialogAllowPublicEditing-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.publicEditingLabel || (depth0 != null ? depth0.publicEditingLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"publicEditingLabel","hash":{},"data":data}) : helper)))
+ "</label>\n </span>\n </li>\n";
},"5":function(container,depth0,helpers,partials,data) {
return "checked=\"checked\"";
},"7":function(container,depth0,helpers,partials,data) {
return "disabled=\"disabled\"";
},"9":function(container,depth0,helpers,partials,data) {
return "hidden";
},"11":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return " <li>\n <span class=\"shareOption menuitem\">\n <span class=\"icon-loading-small hidden\"></span>\n <input type=\"checkbox\" name=\"passwordByTalk\" id=\"passwordByTalk-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\" class=\"checkbox passwordByTalkCheckbox\"\n "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.isPasswordByTalkSet : depth0),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " />\n <label for=\"passwordByTalk-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.passwordByTalkLabel || (depth0 != null ? depth0.passwordByTalkLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"passwordByTalkLabel","hash":{},"data":data}) : helper)))
+ "</label>\n </span>\n </li>\n";
},"13":function(container,depth0,helpers,partials,data) {
return "datepicker";
},"15":function(container,depth0,helpers,partials,data) {
var helper, alias1=container.propertyIsEnumerable;
return container.escapeExpression(((helper = (helper = helpers.expireDate || (depth0 != null ? depth0.expireDate : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"expireDate","hash":{},"data":data}) : helper)));
},"17":function(container,depth0,helpers,partials,data) {
var helper, alias1=container.propertyIsEnumerable;
return container.escapeExpression(((helper = (helper = helpers.defaultExpireDate || (depth0 != null ? depth0.defaultExpireDate : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"defaultExpireDate","hash":{},"data":data}) : helper)));
},"19":function(container,depth0,helpers,partials,data) {
return "readonly";
},"21":function(container,depth0,helpers,partials,data) {
var helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return " <li>\n <a href=\"#\" class=\"menuitem pop-up\" data-url=\""
+ alias5(((helper = (helper = helpers.url || (depth0 != null ? depth0.url : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"url","hash":{},"data":data}) : helper)))
+ "\" data-window=\""
+ alias5(((helper = (helper = helpers.newWindow || (depth0 != null ? depth0.newWindow : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"newWindow","hash":{},"data":data}) : helper)))
+ "\">\n <span class=\"icon "
+ alias5(((helper = (helper = helpers.iconClass || (depth0 != null ? depth0.iconClass : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"iconClass","hash":{},"data":data}) : helper)))
+ "\"></span>\n <span>"
+ alias5(((helper = (helper = helpers.label || (depth0 != null ? depth0.label : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"label","hash":{},"data":data}) : helper)))
+ "</span>\n </a>\n </li>\n";
},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return "<div class=\"popovermenu menu\">\n <ul>\n <li class=\"hidden linkTextMenu\">\n <span class=\"menuitem icon-link-text\">\n <input id=\"linkText-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\" class=\"linkText\" type=\"text\" readonly=\"readonly\" value=\""
+ alias5(((helper = (helper = helpers.shareLinkURL || (depth0 != null ? depth0.shareLinkURL : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareLinkURL","hash":{},"data":data}) : helper)))
+ "\" />\n </span>\n </li>\n"
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.publicUpload : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.publicEditing : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " <li>\n <span class=\"menuitem\">\n <span class=\"icon-loading-small hidden\"></span>\n <input type=\"checkbox\" name=\"hideDownload\" id=\"sharingDialogHideDownload-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\" class=\"checkbox hideDownloadCheckbox\"\n "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.hideDownload : depth0),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " />\n <label for=\"sharingDialogHideDownload-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.hideDownloadLabel || (depth0 != null ? depth0.hideDownloadLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"hideDownloadLabel","hash":{},"data":data}) : helper)))
+ "</label>\n </span>\n </li>\n <li>\n <span class=\"menuitem\">\n <input type=\"checkbox\" name=\"showPassword\" id=\"showPassword-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\" class=\"checkbox showPasswordCheckbox\"\n "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.isPasswordSet : depth0),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.isPasswordEnforced : depth0),{"name":"if","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " value=\"1\" />\n <label for=\"showPassword-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.enablePasswordLabel || (depth0 != null ? depth0.enablePasswordLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"enablePasswordLabel","hash":{},"data":data}) : helper)))
+ "</label>\n </span>\n </li>\n <li class=\""
+ ((stack1 = helpers.unless.call(alias2,(depth0 != null ? depth0.isPasswordSet : depth0),{"name":"unless","hash":{},"fn":container.program(9, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " linkPassMenu\">\n <span class=\"menuitem icon-share-pass\">\n <input id=\"linkPassText-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\" class=\"linkPassText\" type=\"password\" placeholder=\""
+ alias5(((helper = (helper = helpers.passwordPlaceholder || (depth0 != null ? depth0.passwordPlaceholder : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"passwordPlaceholder","hash":{},"data":data}) : helper)))
+ "\" autocomplete=\"new-password\" />\n <input type=\"submit\" class=\"icon-confirm share-pass-submit\" value=\"\" />\n <span class=\"icon icon-loading-small hidden\"></span>\n </span>\n </li>\n"
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.showPasswordByTalkCheckBox : depth0),{"name":"if","hash":{},"fn":container.program(11, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " <li>\n <span class=\"menuitem\">\n <input id=\"expireDate-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\" type=\"checkbox\" name=\"expirationDate\" class=\"expireDate checkbox\"\n "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.hasExpireDate : depth0),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.isExpirationEnforced : depth0),{"name":"if","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " />\n <label for=\"expireDate-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.expireDateLabel || (depth0 != null ? depth0.expireDateLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"expireDateLabel","hash":{},"data":data}) : helper)))
+ "</label>\n </span>\n </li>\n <li class=\""
+ ((stack1 = helpers.unless.call(alias2,(depth0 != null ? depth0.hasExpireDate : depth0),{"name":"unless","hash":{},"fn":container.program(9, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\">\n <span class=\"menuitem icon-expiredate expirationDateContainer-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\">\n <label for=\"expirationDatePicker-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\" class=\"hidden-visually\" value=\""
+ alias5(((helper = (helper = helpers.expirationDate || (depth0 != null ? depth0.expirationDate : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"expirationDate","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.expirationLabel || (depth0 != null ? depth0.expirationLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"expirationLabel","hash":{},"data":data}) : helper)))
+ "</label>\n <!-- do not use the datepicker if enforced -->\n <input id=\"expirationDatePicker-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\" class=\""
+ ((stack1 = helpers.unless.call(alias2,(depth0 != null ? depth0.isExpirationEnforced : depth0),{"name":"unless","hash":{},"fn":container.program(13, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\" type=\"text\"\n placeholder=\""
+ alias5(((helper = (helper = helpers.expirationDatePlaceholder || (depth0 != null ? depth0.expirationDatePlaceholder : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"expirationDatePlaceholder","hash":{},"data":data}) : helper)))
+ "\" value=\""
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.hasExpireDate : depth0),{"name":"if","hash":{},"fn":container.program(15, data, 0),"inverse":container.program(17, data, 0),"data":data})) != null ? stack1 : "")
+ "\"\n data-max-date=\""
+ alias5(((helper = (helper = helpers.maxDate || (depth0 != null ? depth0.maxDate : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"maxDate","hash":{},"data":data}) : helper)))
+ "\" "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.isExpirationEnforced : depth0),{"name":"if","hash":{},"fn":container.program(19, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " />\n </span>\n </li>\n <li>\n <a href=\"#\" class=\"share-add\">\n <span class=\"icon-loading-small hidden\"></span>\n <span class=\"icon icon-edit\"></span>\n <span>"
+ alias5(((helper = (helper = helpers.addNoteLabel || (depth0 != null ? depth0.addNoteLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"addNoteLabel","hash":{},"data":data}) : helper)))
+ "</span>\n <input type=\"button\" class=\"share-note-delete icon-delete "
+ ((stack1 = helpers.unless.call(alias2,(depth0 != null ? depth0.hasNote : depth0),{"name":"unless","hash":{},"fn":container.program(9, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\">\n </a>\n </li>\n <li class=\"share-note-form share-note-link "
+ ((stack1 = helpers.unless.call(alias2,(depth0 != null ? depth0.hasNote : depth0),{"name":"unless","hash":{},"fn":container.program(9, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\">\n <span class=\"menuitem icon-note\">\n <textarea class=\"share-note\">"
+ alias5(((helper = (helper = helpers.shareNote || (depth0 != null ? depth0.shareNote : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareNote","hash":{},"data":data}) : helper)))
+ "</textarea>\n <input type=\"submit\" class=\"icon-confirm share-note-submit\" value=\"\" id=\"add-note-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\" />\n </span>\n </li>\n"
+ ((stack1 = helpers.each.call(alias2,(depth0 != null ? depth0.social : depth0),{"name":"each","hash":{},"fn":container.program(21, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " <li>\n <a href=\"#\" class=\"unshare\"><span class=\"icon-loading-small hidden\"></span><span class=\"icon icon-delete\"></span><span>"
+ alias5(((helper = (helper = helpers.unshareLinkLabel || (depth0 != null ? depth0.unshareLinkLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"unshareLinkLabel","hash":{},"data":data}) : helper)))
+ "</span></a>\n </li>\n <li>\n <a href=\"#\" class=\"new-share\">\n <span class=\"icon-loading-small hidden\"></span>\n <span class=\"icon icon-add\"></span>\n <span>"
+ alias5(((helper = (helper = helpers.newShareLabel || (depth0 != null ? depth0.newShareLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"newShareLabel","hash":{},"data":data}) : helper)))
+ "</span>\n </a>\n </li>\n </ul>\n</div>\n";
},"useData":true});
templates['sharedialoglinkshareview_popover_menu_pending'] = template({"1":function(container,depth0,helpers,partials,data) {
var helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return " <li>\n <span class=\"menuitem icon-info\">\n <p>"
+ alias5(((helper = (helper = helpers.enforcedPasswordLabel || (depth0 != null ? depth0.enforcedPasswordLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"enforcedPasswordLabel","hash":{},"data":data}) : helper)))
+ "</p>\n </span>\n </li>\n <li class=\"linkPassMenu\">\n <span class=\"menuitem\">\n <form autocomplete=\"off\" class=\"enforcedPassForm\">\n <input id=\"enforcedPassText\" required class=\"enforcedPassText\" type=\"password\"\n placeholder=\""
+ alias5(((helper = (helper = helpers.passwordPlaceholder || (depth0 != null ? depth0.passwordPlaceholder : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"passwordPlaceholder","hash":{},"data":data}) : helper)))
+ "\" autocomplete=\"enforcedPassText\" minlength=\""
+ alias5(((helper = (helper = helpers.minPasswordLength || (depth0 != null ? depth0.minPasswordLength : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"minPasswordLength","hash":{},"data":data}) : helper)))
+ "\" />\n <input type=\"submit\" value=\" \" class=\"primary icon-checkmark-white\">\n </form>\n </span>\n </li>\n";
},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
var stack1, alias1=container.propertyIsEnumerable;
return "<div class=\"popovermenu open menu pending\">\n <ul>\n"
+ ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.isPasswordEnforced : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " </ul>\n</div>\n";
},"useData":true});
templates['sharedialogresharerinfoview'] = template({"1":function(container,depth0,helpers,partials,data) {
var helper, alias1=container.propertyIsEnumerable;
return "<div class=\"share-note\">"
+ container.escapeExpression(((helper = (helper = helpers.shareNote || (depth0 != null ? depth0.shareNote : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"shareNote","hash":{},"data":data}) : helper)))
+ "</div>";
},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return "<span class=\"reshare\">\n <div class=\"avatar\" data-userName=\""
+ alias5(((helper = (helper = helpers.reshareOwner || (depth0 != null ? depth0.reshareOwner : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"reshareOwner","hash":{},"data":data}) : helper)))
+ "\"></div>\n "
+ alias5(((helper = (helper = helpers.sharedByText || (depth0 != null ? depth0.sharedByText : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"sharedByText","hash":{},"data":data}) : helper)))
+ "\n</span>\n"
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.hasShareNote : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\n";
},"useData":true});
templates['sharedialogshareelistview'] = template({"1":function(container,depth0,helpers,partials,data) {
var stack1, alias1=container.propertyIsEnumerable;
return ((stack1 = helpers.unless.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.isShareWithCurrentUser : depth0),{"name":"unless","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "");
},"2":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return " <li data-share-id=\""
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\" data-share-type=\""
+ alias5(((helper = (helper = helpers.shareType || (depth0 != null ? depth0.shareType : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareType","hash":{},"data":data}) : helper)))
+ "\" data-share-with=\""
+ alias5(((helper = (helper = helpers.shareWith || (depth0 != null ? depth0.shareWith : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareWith","hash":{},"data":data}) : helper)))
+ "\">\n <div class=\"avatar "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.modSeed : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\" data-username=\""
+ alias5(((helper = (helper = helpers.shareWith || (depth0 != null ? depth0.shareWith : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareWith","hash":{},"data":data}) : helper)))
+ "\" data-avatar=\""
+ alias5(((helper = (helper = helpers.shareWithAvatar || (depth0 != null ? depth0.shareWithAvatar : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareWithAvatar","hash":{},"data":data}) : helper)))
+ "\" data-displayname=\""
+ alias5(((helper = (helper = helpers.shareWithDisplayName || (depth0 != null ? depth0.shareWithDisplayName : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareWithDisplayName","hash":{},"data":data}) : helper)))
+ "\" "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.modSeed : depth0),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "></div>\n <span class=\"username\" title=\""
+ alias5(((helper = (helper = helpers.shareWithTitle || (depth0 != null ? depth0.shareWithTitle : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareWithTitle","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.shareWithDisplayName || (depth0 != null ? depth0.shareWithDisplayName : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareWithDisplayName","hash":{},"data":data}) : helper)))
+ "</span>\n"
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.canUpdateShareSettings : depth0),{"name":"if","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " </li>\n";
},"3":function(container,depth0,helpers,partials,data) {
return "imageplaceholderseed";
},"5":function(container,depth0,helpers,partials,data) {
var helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return "data-seed=\""
+ alias5(((helper = (helper = helpers.shareWith || (depth0 != null ? depth0.shareWith : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareWith","hash":{},"data":data}) : helper)))
+ " "
+ alias5(((helper = (helper = helpers.shareType || (depth0 != null ? depth0.shareType : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareType","hash":{},"data":data}) : helper)))
+ "\"";
},"7":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {});
return " <span class=\"sharingOptionsGroup\">\n"
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.editPermissionPossible : depth0),{"name":"if","hash":{},"fn":container.program(8, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " <div tabindex=\"0\" class=\"share-menu\"><span class=\"icon icon-more\"></span>\n "
+ ((stack1 = ((helper = (helper = helpers.popoverMenu || (depth0 != null ? depth0.popoverMenu : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(alias2,{"name":"popoverMenu","hash":{},"data":data}) : helper))) != null ? stack1 : "")
+ "\n </div>\n </span>\n";
},"8":function(container,depth0,helpers,partials,data) {
var helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return " <span>\n <input id=\"canEdit-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\" type=\"checkbox\" name=\"edit\" class=\"permissions checkbox\" />\n <label for=\"canEdit-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.canEditLabel || (depth0 != null ? depth0.canEditLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"canEditLabel","hash":{},"data":data}) : helper)))
+ "</label>\n </span>\n";
},"10":function(container,depth0,helpers,partials,data) {
var helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return " <li data-share-id=\""
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\" data-share-type=\""
+ alias5(((helper = (helper = helpers.shareType || (depth0 != null ? depth0.shareType : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareType","hash":{},"data":data}) : helper)))
+ "\">\n <div class=\"avatar\" data-username=\""
+ alias5(((helper = (helper = helpers.shareInitiator || (depth0 != null ? depth0.shareInitiator : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareInitiator","hash":{},"data":data}) : helper)))
+ "\"></div>\n <span class=\"has-tooltip username\" title=\""
+ alias5(((helper = (helper = helpers.shareInitiator || (depth0 != null ? depth0.shareInitiator : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareInitiator","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.shareInitiatorText || (depth0 != null ? depth0.shareInitiatorText : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareInitiatorText","hash":{},"data":data}) : helper)))
+ "</span>\n <span class=\"sharingOptionsGroup\">\n <a href=\"#\" class=\"unshare\"><span class=\"icon-loading-small hidden\"></span><span class=\"icon icon-delete\"></span><span class=\"hidden-visually\">"
+ alias5(((helper = (helper = helpers.unshareLabel || (depth0 != null ? depth0.unshareLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"unshareLabel","hash":{},"data":data}) : helper)))
+ "</span></a>\n </span>\n </li>\n";
},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
var stack1, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {});
return "<ul id=\"shareWithList\" class=\"shareWithList\">\n"
+ ((stack1 = helpers.each.call(alias2,(depth0 != null ? depth0.sharees : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ ((stack1 = helpers.each.call(alias2,(depth0 != null ? depth0.linkReshares : depth0),{"name":"each","hash":{},"fn":container.program(10, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "</ul>\n";
},"useData":true});
templates['sharedialogshareelistview_popover_menu'] = template({"1":function(container,depth0,helpers,partials,data) {
var stack1, alias1=container.propertyIsEnumerable;
return " "
+ ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.sharePermissionPossible : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " ";
},"2":function(container,depth0,helpers,partials,data) {
var stack1, alias1=container.propertyIsEnumerable;
return " "
+ ((stack1 = helpers.unless.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.isMailShare : depth0),{"name":"unless","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " ";
},"3":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return "\n <li>\n <span class=\"menuitem\">\n <input id=\"canShare-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\" type=\"checkbox\" name=\"share\" class=\"permissions checkbox\" "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.hasSharePermission : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " data-permissions=\""
+ alias5(((helper = (helper = helpers.sharePermission || (depth0 != null ? depth0.sharePermission : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"sharePermission","hash":{},"data":data}) : helper)))
+ "\" />\n <label for=\"canShare-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.canShareLabel || (depth0 != null ? depth0.canShareLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"canShareLabel","hash":{},"data":data}) : helper)))
+ "</label>\n </span>\n </li>\n ";
},"4":function(container,depth0,helpers,partials,data) {
return "checked=\"checked\"";
},"6":function(container,depth0,helpers,partials,data) {
var stack1, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {});
return " "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.createPermissionPossible : depth0),{"name":"if","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\n "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.updatePermissionPossible : depth0),{"name":"if","hash":{},"fn":container.program(10, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\n "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.deletePermissionPossible : depth0),{"name":"if","hash":{},"fn":container.program(13, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\n";
},"7":function(container,depth0,helpers,partials,data) {
var stack1, alias1=container.propertyIsEnumerable;
return ((stack1 = helpers.unless.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.isMailShare : depth0),{"name":"unless","hash":{},"fn":container.program(8, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "");
},"8":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return "\n <li>\n <span class=\"menuitem\">\n <input id=\"canCreate-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\" type=\"checkbox\" name=\"create\" class=\"permissions checkbox\" "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.hasCreatePermission : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " data-permissions=\""
+ alias5(((helper = (helper = helpers.createPermission || (depth0 != null ? depth0.createPermission : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"createPermission","hash":{},"data":data}) : helper)))
+ "\"/>\n <label for=\"canCreate-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.createPermissionLabel || (depth0 != null ? depth0.createPermissionLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"createPermissionLabel","hash":{},"data":data}) : helper)))
+ "</label>\n </span>\n </li>\n ";
},"10":function(container,depth0,helpers,partials,data) {
var stack1, alias1=container.propertyIsEnumerable;
return ((stack1 = helpers.unless.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.isMailShare : depth0),{"name":"unless","hash":{},"fn":container.program(11, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "");
},"11":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return "\n <li>\n <span class=\"menuitem\">\n <input id=\"canUpdate-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\" type=\"checkbox\" name=\"update\" class=\"permissions checkbox\" "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.hasUpdatePermission : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " data-permissions=\""
+ alias5(((helper = (helper = helpers.updatePermission || (depth0 != null ? depth0.updatePermission : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"updatePermission","hash":{},"data":data}) : helper)))
+ "\"/>\n <label for=\"canUpdate-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.updatePermissionLabel || (depth0 != null ? depth0.updatePermissionLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"updatePermissionLabel","hash":{},"data":data}) : helper)))
+ "</label>\n </span>\n </li>\n ";
},"13":function(container,depth0,helpers,partials,data) {
var stack1, alias1=container.propertyIsEnumerable;
return ((stack1 = helpers.unless.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.isMailShare : depth0),{"name":"unless","hash":{},"fn":container.program(14, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "");
},"14":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return "\n <li>\n <span class=\"menuitem\">\n <input id=\"canDelete-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\" type=\"checkbox\" name=\"delete\" class=\"permissions checkbox\" "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.hasDeletePermission : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " data-permissions=\""
+ alias5(((helper = (helper = helpers.deletePermission || (depth0 != null ? depth0.deletePermission : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"deletePermission","hash":{},"data":data}) : helper)))
+ "\"/>\n <label for=\"canDelete-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.deletePermissionLabel || (depth0 != null ? depth0.deletePermissionLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"deletePermissionLabel","hash":{},"data":data}) : helper)))
+ "</label>\n </span>\n </li>\n ";
},"16":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.hasCreatePermission : depth0),{"name":"if","hash":{},"fn":container.program(17, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " <li>\n <span class=\"menuitem\">\n <input id=\"password-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\" type=\"checkbox\" name=\"password\" class=\"password checkbox\" "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.isPasswordSet : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.isPasswordSet : depth0),{"name":"if","hash":{},"fn":container.program(19, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\" />\n <label for=\"password-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.passwordLabel || (depth0 != null ? depth0.passwordLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"passwordLabel","hash":{},"data":data}) : helper)))
+ "</label>\n </span>\n </li>\n <li class=\"passwordMenu-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ " "
+ ((stack1 = helpers.unless.call(alias2,(depth0 != null ? depth0.isPasswordSet : depth0),{"name":"unless","hash":{},"fn":container.program(22, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\">\n <span class=\"passwordContainer-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ " icon-passwordmail menuitem\">\n <label for=\"passwordField-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\" class=\"hidden-visually\" value=\""
+ alias5(((helper = (helper = helpers.password || (depth0 != null ? depth0.password : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"password","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.passwordLabel || (depth0 != null ? depth0.passwordLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"passwordLabel","hash":{},"data":data}) : helper)))
+ "</label>\n <input id=\"passwordField-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\" class=\"passwordField\" type=\"password\" placeholder=\""
+ alias5(((helper = (helper = helpers.passwordPlaceholder || (depth0 != null ? depth0.passwordPlaceholder : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"passwordPlaceholder","hash":{},"data":data}) : helper)))
+ "\" value=\""
+ alias5(((helper = (helper = helpers.passwordValue || (depth0 != null ? depth0.passwordValue : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"passwordValue","hash":{},"data":data}) : helper)))
+ "\" autocomplete=\"new-password\" />\n <span class=\"icon-loading-small hidden\"></span>\n </span>\n </li>\n"
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.isTalkEnabled : depth0),{"name":"if","hash":{},"fn":container.program(24, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "");
},"17":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return " <li>\n <span class=\"menuitem\">\n <input id=\"secureDrop-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\" type=\"checkbox\" name=\"secureDrop\" class=\"checkbox secureDrop\" "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.secureDropMode : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " data-permissions=\""
+ alias5(((helper = (helper = helpers.readPermission || (depth0 != null ? depth0.readPermission : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"readPermission","hash":{},"data":data}) : helper)))
+ "\"/>\n <label for=\"secureDrop-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.secureDropLabel || (depth0 != null ? depth0.secureDropLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"secureDropLabel","hash":{},"data":data}) : helper)))
+ "</label>\n </span>\n </li>\n";
},"19":function(container,depth0,helpers,partials,data) {
var stack1, alias1=container.propertyIsEnumerable;
return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.isPasswordForMailSharesRequired : depth0),{"name":"if","hash":{},"fn":container.program(20, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "");
},"20":function(container,depth0,helpers,partials,data) {
return "disabled=\"\"";
},"22":function(container,depth0,helpers,partials,data) {
return "hidden";
},"24":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return " <li>\n <span class=\"menuitem\">\n <input id=\"passwordByTalk-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\" type=\"checkbox\" name=\"passwordByTalk\" class=\"passwordByTalk checkbox\" "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.isPasswordByTalkSet : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " />\n <label for=\"passwordByTalk-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.passwordByTalkLabel || (depth0 != null ? depth0.passwordByTalkLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"passwordByTalkLabel","hash":{},"data":data}) : helper)))
+ "</label>\n </span>\n </li>\n <li class=\"passwordByTalkMenu-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ " "
+ ((stack1 = helpers.unless.call(alias2,(depth0 != null ? depth0.isPasswordByTalkSet : depth0),{"name":"unless","hash":{},"fn":container.program(22, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\">\n <span class=\"passwordByTalkContainer-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ " icon-passwordtalk menuitem\">\n <label for=\"passwordByTalkField-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\" class=\"hidden-visually\" value=\""
+ alias5(((helper = (helper = helpers.password || (depth0 != null ? depth0.password : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"password","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.passwordByTalkLabel || (depth0 != null ? depth0.passwordByTalkLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"passwordByTalkLabel","hash":{},"data":data}) : helper)))
+ "</label>\n <input id=\"passwordByTalkField-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\" class=\"passwordField\" type=\"password\" placeholder=\""
+ alias5(((helper = (helper = helpers.passwordByTalkPlaceholder || (depth0 != null ? depth0.passwordByTalkPlaceholder : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"passwordByTalkPlaceholder","hash":{},"data":data}) : helper)))
+ "\" value=\""
+ alias5(((helper = (helper = helpers.passwordValue || (depth0 != null ? depth0.passwordValue : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"passwordValue","hash":{},"data":data}) : helper)))
+ "\" autocomplete=\"new-password\" />\n <span class=\"icon-loading-small hidden\"></span>\n </span>\n </li>\n";
},"26":function(container,depth0,helpers,partials,data) {
var helper, alias1=container.propertyIsEnumerable;
return container.escapeExpression(((helper = (helper = helpers.expireDate || (depth0 != null ? depth0.expireDate : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"expireDate","hash":{},"data":data}) : helper)));
},"28":function(container,depth0,helpers,partials,data) {
var helper, alias1=container.propertyIsEnumerable;
return container.escapeExpression(((helper = (helper = helpers.defaultExpireDate || (depth0 != null ? depth0.defaultExpireDate : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"defaultExpireDate","hash":{},"data":data}) : helper)));
},"30":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return " <li>\n <a href=\"#\" class=\"share-add\">\n <span class=\"icon-loading-small hidden\"></span>\n <span class=\"icon icon-edit\"></span>\n <span>"
+ alias5(((helper = (helper = helpers.addNoteLabel || (depth0 != null ? depth0.addNoteLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"addNoteLabel","hash":{},"data":data}) : helper)))
+ "</span>\n <input type=\"button\" class=\"share-note-delete icon-delete "
+ ((stack1 = helpers.unless.call(alias2,(depth0 != null ? depth0.hasNote : depth0),{"name":"unless","hash":{},"fn":container.program(22, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\">\n </a>\n </li>\n <li class=\"share-note-form "
+ ((stack1 = helpers.unless.call(alias2,(depth0 != null ? depth0.hasNote : depth0),{"name":"unless","hash":{},"fn":container.program(22, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\">\n <span class=\"menuitem icon-note\">\n <textarea class=\"share-note\">"
+ alias5(((helper = (helper = helpers.shareNote || (depth0 != null ? depth0.shareNote : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareNote","hash":{},"data":data}) : helper)))
+ "</textarea>\n <input type=\"submit\" class=\"icon-confirm share-note-submit\" value=\"\" id=\"add-note-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\" />\n </span>\n </li>\n";
},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return "<div class=\"popovermenu bubble hidden menu\">\n <ul>\n "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.isResharingAllowed : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\n"
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.isFolder : depth0),{"name":"if","hash":{},"fn":container.program(6, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.isMailShare : depth0),{"name":"if","hash":{},"fn":container.program(16, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " <li>\n <span class=\"menuitem\">\n <input id=\"expireDate-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\" type=\"checkbox\" name=\"expirationDate\" class=\"expireDate checkbox\" "
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.hasExpireDate : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\" />\n <label for=\"expireDate-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.expireDateLabel || (depth0 != null ? depth0.expireDateLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"expireDateLabel","hash":{},"data":data}) : helper)))
+ "</label>\n </span>\n </li>\n <li class=\"expirationDateMenu-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ " "
+ ((stack1 = helpers.unless.call(alias2,(depth0 != null ? depth0.hasExpireDate : depth0),{"name":"unless","hash":{},"fn":container.program(22, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "\">\n <span class=\"expirationDateContainer-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ " icon-expiredate menuitem\">\n <label for=\"expirationDatePicker-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\" class=\"hidden-visually\" value=\""
+ alias5(((helper = (helper = helpers.expirationDate || (depth0 != null ? depth0.expirationDate : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"expirationDate","hash":{},"data":data}) : helper)))
+ "\">"
+ alias5(((helper = (helper = helpers.expirationLabel || (depth0 != null ? depth0.expirationLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"expirationLabel","hash":{},"data":data}) : helper)))
+ "</label>\n <input id=\"expirationDatePicker-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "-"
+ alias5(((helper = (helper = helpers.shareId || (depth0 != null ? depth0.shareId : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareId","hash":{},"data":data}) : helper)))
+ "\" class=\"datepicker\" type=\"text\" placeholder=\""
+ alias5(((helper = (helper = helpers.expirationDatePlaceholder || (depth0 != null ? depth0.expirationDatePlaceholder : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"expirationDatePlaceholder","hash":{},"data":data}) : helper)))
+ "\" value=\""
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.hasExpireDate : depth0),{"name":"if","hash":{},"fn":container.program(26, data, 0),"inverse":container.program(28, data, 0),"data":data})) != null ? stack1 : "")
+ "\" />\n </span>\n </li>\n"
+ ((stack1 = helpers["if"].call(alias2,(depth0 != null ? depth0.isNoteAvailable : depth0),{"name":"if","hash":{},"fn":container.program(30, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ " <li>\n <a href=\"#\" class=\"unshare\"><span class=\"icon-loading-small hidden\"></span><span class=\"icon icon-delete\"></span><span>"
+ alias5(((helper = (helper = helpers.unshareLabel || (depth0 != null ? depth0.unshareLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"unshareLabel","hash":{},"data":data}) : helper)))
+ "</span></a>\n </li>\n </ul>\n</div>\n";
},"useData":true});
templates['sharedialogview'] = template({"1":function(container,depth0,helpers,partials,data) {
var helper, alias1=container.propertyIsEnumerable, alias2=depth0 != null ? depth0 : (container.nullContext || {}), alias3=container.hooks.helperMissing, alias4="function", alias5=container.escapeExpression;
return " <label for=\"shareWith-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\" class=\"hidden-visually\">"
+ alias5(((helper = (helper = helpers.shareLabel || (depth0 != null ? depth0.shareLabel : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"shareLabel","hash":{},"data":data}) : helper)))
+ "</label>\n <div class=\"oneline\">\n <input id=\"shareWith-"
+ alias5(((helper = (helper = helpers.cid || (depth0 != null ? depth0.cid : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"cid","hash":{},"data":data}) : helper)))
+ "\" class=\"shareWithField\" type=\"text\" placeholder=\""
+ alias5(((helper = (helper = helpers.sharePlaceholder || (depth0 != null ? depth0.sharePlaceholder : depth0)) != null ? helper : alias3),(typeof helper === alias4 ? helper.call(alias2,{"name":"sharePlaceholder","hash":{},"data":data}) : helper)))
+ "\" />\n <span class=\"shareWithLoading icon-loading-small hidden\"></span>\n <span class=\"shareWithConfirm icon icon-confirm\"></span>\n </div>\n";
},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
var stack1, alias1=container.propertyIsEnumerable;
return "<div class=\"resharerInfoView subView\"></div>\n"
+ ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.isSharingAllowed : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
+ "<div class=\"linkShareView subView\"></div>\n<div class=\"shareeListView subView\"></div>\n<div class=\"loading hidden\" style=\"height: 50px\"></div>\n";
},"useData":true});
})();

View File

@ -31,7 +31,6 @@ module.exports = [
}, },
{ {
entry: { entry: {
share_backend: path.resolve(__dirname, 'js/merged-share-backend.js'),
systemtags: path.resolve(__dirname, 'js/systemtags/merged-systemtags.js') systemtags: path.resolve(__dirname, 'js/systemtags/merged-systemtags.js')
}, },
output: { output: {

View File

@ -84,9 +84,6 @@ class Share extends Constants {
'collectionOf' => $collectionOf, 'collectionOf' => $collectionOf,
'supportedFileExtensions' => $supportedFileExtensions 'supportedFileExtensions' => $supportedFileExtensions
); );
if(count(self::$backendTypes) === 1) {
Util::addScript('core', 'dist/share_backend');
}
return true; return true;
} }
\OCP\Util::writeLog('OCP\Share', \OCP\Util::writeLog('OCP\Share',