mirror of
https://github.com/nextcloud/server.git
synced 2026-02-27 18:37:17 +01:00
Cleanup sharing leftovers
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
This commit is contained in:
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
apps/files_sharing/js/dist/collaboration.js
vendored
2
apps/files_sharing/js/dist/collaboration.js
vendored
@@ -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
|
||||
File diff suppressed because one or more lines are too long
2
apps/files_sharing/js/dist/files_sharing.js
vendored
2
apps/files_sharing/js/dist/files_sharing.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
46
apps/files_sharing/js/dist/files_sharing_tab.js
vendored
46
apps/files_sharing/js/dist/files_sharing_tab.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,8 +1,6 @@
|
||||
import './share'
|
||||
import './sharetabview'
|
||||
import './sharebreadcrumbview'
|
||||
|
||||
import './style/sharetabview.scss'
|
||||
import './style/sharebreadcrumb.scss'
|
||||
|
||||
import './collaborationresourceshandler.js'
|
||||
|
||||
@@ -247,15 +247,94 @@
|
||||
* @returns {boolean} true if the icon was set, false otherwise
|
||||
*/
|
||||
_updateFileActionIcon: function($tr, hasUserShares, hasLinkShares) {
|
||||
console.info('object');
|
||||
// if the statuses are loaded already, use them for the icon
|
||||
// (needed when scrolling to the next page)
|
||||
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 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
|
||||
* @returns {String}
|
||||
|
||||
@@ -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
|
||||
})()
|
||||
@@ -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;
|
||||
}
|
||||
@@ -27,7 +27,7 @@
|
||||
* @returns {string} the title
|
||||
*/
|
||||
const shareWithTitle = function(share) {
|
||||
if (share.type === OC.Share.type_GROUP) {
|
||||
if (share.type === OC.Share.SHARE_TYPE_GROUP) {
|
||||
return t(
|
||||
'files_sharing',
|
||||
'Shared with you and the group {group} by {owner}',
|
||||
@@ -38,7 +38,7 @@ const shareWithTitle = function(share) {
|
||||
undefined,
|
||||
{ escape: false }
|
||||
)
|
||||
} else if (share.type === OC.Share.type_CIRCLE) {
|
||||
} else if (share.type === OC.Share.SHARE_TYPE_CIRCLE) {
|
||||
return t(
|
||||
'files_sharing',
|
||||
'Shared with you and {circle} by {owner}',
|
||||
@@ -49,7 +49,7 @@ const shareWithTitle = function(share) {
|
||||
undefined,
|
||||
{ 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) {
|
||||
return t(
|
||||
'files_sharing',
|
||||
|
||||
@@ -10,9 +10,6 @@ node node_modules/handlebars/bin/handlebars -n OC.Settings.Templates apps/setti
|
||||
# Systemtags
|
||||
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
|
||||
node node_modules/handlebars/bin/handlebars -n OCA.Files.Templates apps/files/js/templates -f apps/files/js/templates.js
|
||||
|
||||
|
||||
24
core/js/dist/share_backend.js
vendored
24
core/js/dist/share_backend.js
vendored
File diff suppressed because one or more lines are too long
1
core/js/dist/share_backend.js.map
vendored
1
core/js/dist/share_backend.js.map
vendored
File diff suppressed because one or more lines are too long
2
core/js/dist/systemtags.js
vendored
2
core/js/dist/systemtags.js
vendored
File diff suppressed because one or more lines are too long
2
core/js/dist/systemtags.js.map
vendored
2
core/js/dist/systemtags.js.map
vendored
File diff suppressed because one or more lines are too long
@@ -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'
|
||||
399
core/js/share.js
399
core/js/share.js
@@ -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()
|
||||
}
|
||||
})
|
||||
|
||||
})
|
||||
@@ -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}}
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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}}
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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
|
||||
})()
|
||||
@@ -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
|
||||
|
||||
})()
|
||||
@@ -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
|
||||
|
||||
})()
|
||||
@@ -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
@@ -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
|
||||
})()
|
||||
@@ -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()
|
||||
})()
|
||||
@@ -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});
|
||||
})();
|
||||
@@ -31,7 +31,6 @@ module.exports = [
|
||||
},
|
||||
{
|
||||
entry: {
|
||||
share_backend: path.resolve(__dirname, 'js/merged-share-backend.js'),
|
||||
systemtags: path.resolve(__dirname, 'js/systemtags/merged-systemtags.js')
|
||||
},
|
||||
output: {
|
||||
|
||||
@@ -84,9 +84,6 @@ class Share extends Constants {
|
||||
'collectionOf' => $collectionOf,
|
||||
'supportedFileExtensions' => $supportedFileExtensions
|
||||
);
|
||||
if(count(self::$backendTypes) === 1) {
|
||||
Util::addScript('core', 'dist/share_backend');
|
||||
}
|
||||
return true;
|
||||
}
|
||||
\OCP\Util::writeLog('OCP\Share',
|
||||
|
||||
Reference in New Issue
Block a user