2015-07-30 22:07:41 +00:00
|
|
|
/*
|
|
|
|
* 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 = {};
|
|
|
|
}
|
|
|
|
|
|
|
|
var TEMPLATE_BASE =
|
2015-08-21 13:00:15 +00:00
|
|
|
'<div class="resharerInfo"></div>' +
|
2015-08-07 22:23:06 +00:00
|
|
|
'<label for="shareWith" class="hidden-visually">{{shareLabel}}</label>' +
|
|
|
|
'<div class="oneline">' +
|
|
|
|
' <input id="shareWith" type="text" placeholder="{{sharePlaceholder}}" />' +
|
|
|
|
' <span class="shareWithLoading icon-loading-small hidden"></span>'+
|
|
|
|
'</div>' +
|
2015-07-30 22:07:41 +00:00
|
|
|
// FIXME: find a good position for remoteShareInfo
|
2015-08-07 22:23:06 +00:00
|
|
|
'{{{remoteShareInfo}}}' +
|
|
|
|
'<ul id="shareWithList">' +
|
|
|
|
'</ul>' +
|
2015-08-13 00:38:14 +00:00
|
|
|
'{{#if shareAllowed}}' +
|
|
|
|
'{{{linkShare}}}' +
|
|
|
|
'{{else}}' +
|
|
|
|
'{{{noSharing}}}' +
|
|
|
|
'{{/if}}' +
|
|
|
|
'{{{expiration}}}'
|
|
|
|
;
|
2015-07-30 22:07:41 +00:00
|
|
|
|
|
|
|
var TEMPLATE_REMOTE_SHARE_INFO =
|
2015-08-18 15:23:32 +00:00
|
|
|
'<a target="_blank" class="icon-info svg shareWithRemoteInfo hasTooltip" href="{{docLink}}" ' +
|
2015-07-30 22:07:41 +00:00
|
|
|
'title="{{tooltip}}"></a>';
|
|
|
|
|
|
|
|
var TEMPLATE_LINK_SHARE =
|
|
|
|
'<div id="link" class="linkShare">' +
|
|
|
|
' <span class="icon-loading-small hidden"></span>' +
|
|
|
|
' <input type="checkbox" name="linkCheckbox" id="linkCheckbox" value="1" /><label for="linkCheckbox">{{linkShareLabel}}</label>' +
|
|
|
|
' <br />' +
|
|
|
|
' <label for="linkText" class="hidden-visually">{{urlLabel}}</label>' +
|
|
|
|
' <input id="linkText" type="text" readonly="readonly" />' +
|
|
|
|
' <input type="checkbox" name="showPassword" id="showPassword" value="1" class="hidden" /><label for="showPassword" class="hidden-visually">{{enablePasswordLabel}}</label>' +
|
|
|
|
' <div id="linkPass">' +
|
|
|
|
' <label for="linkPassText" class="hidden-visually">{{passwordLabel}}</label>' +
|
|
|
|
' <input id="linkPassText" type="password" placeholder="passwordPlaceholder" />' +
|
|
|
|
' <span class="icon-loading-small hidden"></span>' +
|
2015-08-13 00:38:14 +00:00
|
|
|
' </div>' +
|
|
|
|
' {{#if publicUpload}}' +
|
|
|
|
' <div id="allowPublicUploadWrapper" class="hidden">' +
|
|
|
|
' <span class="icon-loading-small hidden"></span>' +
|
|
|
|
' <input type="checkbox" value="1" name="allowPublicUpload" id="sharingDialogAllowPublicUpload" {{{publicUploadChecked}}} />' +
|
|
|
|
' <label for="sharingDialogAllowPublicUpload">{{publicUploadLabel}}</label>' +
|
|
|
|
' </div>' +
|
|
|
|
' {{/if}}' +
|
|
|
|
' {{#if mailPublicNotificationEnabled}}' +
|
|
|
|
' <form id="emailPrivateLink">' +
|
|
|
|
' <input id="email" class="hidden" value="" placeholder="{{mailPrivatePlaceholder}}" type="text" />' +
|
|
|
|
' <input id="emailButton" class="hidden" type="submit" value="{{mailButtonText}}" />' +
|
|
|
|
' </form>' +
|
|
|
|
' {{/if}}' +
|
|
|
|
'</div>'
|
2015-07-30 22:07:41 +00:00
|
|
|
;
|
|
|
|
|
2015-08-13 00:38:14 +00:00
|
|
|
var TEMPLATE_NO_SHARING =
|
|
|
|
'<input id="shareWith" type="text" placeholder="{{placeholder}}" disabled="disabled"/>'
|
|
|
|
;
|
|
|
|
|
|
|
|
var TEMPLATE_EXPIRATION =
|
|
|
|
'<div id="expiration">' +
|
|
|
|
' <input type="checkbox" name="expirationCheckbox" id="expirationCheckbox" value="1" />' +
|
|
|
|
' <label for="expirationCheckbox">{{setExpirationLabel}}</label>' +
|
|
|
|
' <label for="expirationDate" class="hidden-visually">{{expirationLabel}}</label>' +
|
|
|
|
' <input id="expirationDate" type="text" placeholder="{{expirationDatePlaceholder}}" class="hidden" />' +
|
|
|
|
' <em id="defaultExpireMessage">{{defaultExpireMessage}}</em>' +
|
|
|
|
'</div>'
|
|
|
|
;
|
|
|
|
|
2015-07-30 22:07:41 +00:00
|
|
|
/**
|
|
|
|
* @class OCA.Share.ShareDialogView
|
2015-08-07 22:23:06 +00:00
|
|
|
* @member {OC.Share.ShareItemModel} model
|
|
|
|
* @member {jQuery} $el
|
|
|
|
* @memberof OCA.Sharing
|
2015-07-30 22:07:41 +00:00
|
|
|
* @classdesc
|
|
|
|
*
|
|
|
|
* Represents the GUI of the share dialogue
|
|
|
|
*
|
|
|
|
*/
|
2015-08-07 22:23:06 +00:00
|
|
|
var ShareDialogView = OC.Backbone.View.extend({
|
|
|
|
/** @type {Object} **/
|
2015-07-30 22:07:41 +00:00
|
|
|
_templates: {},
|
|
|
|
|
2015-08-07 22:23:06 +00:00
|
|
|
/** @type {boolean} **/
|
2015-07-30 22:07:41 +00:00
|
|
|
_showLink: true,
|
|
|
|
|
2015-08-07 22:23:06 +00:00
|
|
|
/** @type {string} **/
|
|
|
|
tagName: 'div',
|
|
|
|
|
2015-08-13 00:38:14 +00:00
|
|
|
/** @type {OC.Share.ShareConfigModel} **/
|
|
|
|
configModel: undefined,
|
|
|
|
|
2015-08-18 22:04:16 +00:00
|
|
|
/** @type {object} **/
|
|
|
|
resharerInfoView: undefined,
|
|
|
|
|
2015-08-13 00:38:14 +00:00
|
|
|
initialize: function(options) {
|
2015-08-11 20:36:28 +00:00
|
|
|
var view = this;
|
|
|
|
this.model.on('change', function() {
|
|
|
|
view.render();
|
|
|
|
});
|
|
|
|
|
|
|
|
this.model.on('fetchError', function() {
|
|
|
|
OC.Notification.showTemporary(t('core', 'Share details could not be loaded for this item.'));
|
|
|
|
});
|
2015-08-13 00:38:14 +00:00
|
|
|
|
|
|
|
if(!_.isUndefined(options.configModel)) {
|
|
|
|
this.configModel = options.configModel;
|
|
|
|
} else {
|
|
|
|
console.warn('missing OC.Share.ShareConfigModel');
|
|
|
|
}
|
2015-08-18 22:04:16 +00:00
|
|
|
|
|
|
|
var subViewOptions = {
|
|
|
|
model: this.model,
|
|
|
|
configModel: this.configModel
|
|
|
|
};
|
|
|
|
|
|
|
|
this.resharerInfoView = _.isUndefined(options.resharerInfoView)
|
|
|
|
? new OC.Share.ShareDialogResharerInfoView(subViewOptions)
|
|
|
|
: options.resharerInfoView;
|
|
|
|
|
2015-08-11 20:36:28 +00:00
|
|
|
},
|
|
|
|
|
2015-07-30 22:07:41 +00:00
|
|
|
render: function() {
|
|
|
|
var baseTemplate = this._getTemplate('base', TEMPLATE_BASE);
|
|
|
|
|
2015-08-07 22:23:06 +00:00
|
|
|
this.$el.html(baseTemplate({
|
2015-07-30 22:07:41 +00:00
|
|
|
shareLabel: t('core', 'Share'),
|
|
|
|
sharePlaceholder: this._renderSharePlaceholderPart(),
|
|
|
|
remoteShareInfo: this._renderRemoteShareInfoPart(),
|
2015-08-13 00:38:14 +00:00
|
|
|
linkShare: this._renderLinkSharePart(),
|
|
|
|
shareAllowed: this.model.hasSharePermission(),
|
|
|
|
noSharing: this._renderNoSharing(),
|
|
|
|
expiration: this._renderExpirationPart()
|
2015-07-30 22:07:41 +00:00
|
|
|
}));
|
|
|
|
|
2015-08-21 13:00:15 +00:00
|
|
|
this.resharerInfoView.$el = this.$el.find('.resharerInfo');
|
|
|
|
this.resharerInfoView.render();
|
|
|
|
|
2015-08-18 15:23:32 +00:00
|
|
|
this.$el.find('.hasTooltip').tooltip();
|
2015-08-18 22:04:16 +00:00
|
|
|
if(this.configModel.areAvatarsEnabled()) {
|
|
|
|
this.$el.find('.avatar').avatar(this.model.getReshareOwner, 32);
|
|
|
|
}
|
2015-08-18 15:23:32 +00:00
|
|
|
|
2015-08-07 22:23:06 +00:00
|
|
|
return this;
|
2015-07-30 22:07:41 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* sets whether share by link should be displayed or not. Default is
|
|
|
|
* true.
|
|
|
|
*
|
|
|
|
* @param {bool} showLink
|
|
|
|
*/
|
|
|
|
setShowLink: function(showLink) {
|
|
|
|
this._showLink = (typeof showLink === 'boolean') ? showLink : true;
|
|
|
|
},
|
|
|
|
|
|
|
|
_renderRemoteShareInfoPart: function() {
|
|
|
|
var remoteShareInfo = '';
|
2015-08-18 10:13:08 +00:00
|
|
|
if(this.configModel.isRemoteShareAllowed()) {
|
2015-07-30 22:07:41 +00:00
|
|
|
var infoTemplate = this._getRemoteShareInfoTemplate();
|
|
|
|
remoteShareInfo = infoTemplate({
|
2015-08-18 10:13:08 +00:00
|
|
|
docLink: this.configModel.getFederatedShareDocLink(),
|
2015-07-30 22:07:41 +00:00
|
|
|
tooltip: t('core', 'Share with people on other ownClouds using the syntax username@example.com/owncloud')
|
|
|
|
});
|
|
|
|
}
|
2015-08-18 15:23:32 +00:00
|
|
|
|
2015-07-30 22:07:41 +00:00
|
|
|
return remoteShareInfo;
|
|
|
|
},
|
|
|
|
|
|
|
|
_renderLinkSharePart: function() {
|
|
|
|
var linkShare = '';
|
2015-08-13 00:38:14 +00:00
|
|
|
if( this.model.hasSharePermission()
|
|
|
|
&& this._showLink
|
2015-08-18 10:13:08 +00:00
|
|
|
&& this.configModel.isShareWithLinkAllowed())
|
2015-08-13 00:38:14 +00:00
|
|
|
{
|
2015-07-30 22:07:41 +00:00
|
|
|
var linkShareTemplate = this._getLinkShareTemplate();
|
2015-08-13 00:38:14 +00:00
|
|
|
|
|
|
|
var publicUpload =
|
|
|
|
this.model.isFolder()
|
|
|
|
&& this.model.hasCreatePermission()
|
|
|
|
&& this.configModel.isPublicUploadEnabled();
|
|
|
|
|
|
|
|
var publicUploadChecked = '';
|
|
|
|
if(this.model.isPublicUploadAllowed) {
|
|
|
|
publicUploadChecked = 'checked="checked"';
|
|
|
|
}
|
|
|
|
|
2015-07-30 22:07:41 +00:00
|
|
|
linkShare = linkShareTemplate({
|
|
|
|
linkShareLabel: t('core', 'Share link'),
|
|
|
|
urlLabel: t('core', 'Link'),
|
|
|
|
enablePasswordLabel: t('core', 'Password protect'),
|
|
|
|
passwordLabel: t('core', 'Password'),
|
2015-08-13 00:38:14 +00:00
|
|
|
passwordPlaceholder: t('core', 'Choose a password for the public link'),
|
|
|
|
publicUpload: publicUpload,
|
|
|
|
publicUploadChecked: publicUploadChecked,
|
|
|
|
publicUploadLabel: t('core', 'Allow editing'),
|
|
|
|
mailPublicNotificationEnabled: this.configModel.isMailPublicNotificationEnabled(),
|
|
|
|
mailPrivatePlaceholder: t('core', 'Email link to person'),
|
|
|
|
mailButtonText: t('core', 'Send')
|
2015-07-30 22:07:41 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
return linkShare;
|
|
|
|
},
|
|
|
|
|
|
|
|
_renderSharePlaceholderPart: function () {
|
|
|
|
var sharePlaceholder = t('core', 'Share with users or groups …');
|
2015-08-18 10:13:08 +00:00
|
|
|
if (this.configModel.isRemoteShareAllowed()) {
|
2015-07-30 22:07:41 +00:00
|
|
|
sharePlaceholder = t('core', 'Share with users, groups or remote users …');
|
|
|
|
}
|
|
|
|
return sharePlaceholder;
|
|
|
|
},
|
|
|
|
|
2015-08-13 00:38:14 +00:00
|
|
|
_renderNoSharing: function () {
|
|
|
|
var noSharing = '';
|
|
|
|
if(!this.model.hasSharePermission()) {
|
|
|
|
var noSharingTemplate = this._getTemplate('noSharing', TEMPLATE_NO_SHARING);
|
|
|
|
noSharing = noSharingTemplate({
|
|
|
|
placeholder: t('core', 'Resharing is not allowed')
|
|
|
|
});
|
|
|
|
}
|
|
|
|
return noSharing;
|
|
|
|
},
|
|
|
|
|
|
|
|
_renderExpirationPart: function() {
|
|
|
|
var expirationTemplate = this._getTemplate('expiration', TEMPLATE_EXPIRATION);
|
|
|
|
|
|
|
|
var defaultExpireMessage = '';
|
|
|
|
if(( this.model.isFolder() || this.model.isFile())
|
|
|
|
&& this.configModel.isDefaultExpireDateEnforced()) {
|
|
|
|
defaultExpireMessage = t(
|
|
|
|
'core',
|
|
|
|
'The public link will expire no later than {days} days after it is created',
|
|
|
|
{'days': this.configModel.getDefaultExpireDate()}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
var expiration = expirationTemplate({
|
|
|
|
setExpirationLabel: t('core', 'Set expiration date'),
|
|
|
|
expirationLabel: t('core', 'Expiration'),
|
|
|
|
expirationDatePlaceholder: t('core', 'Expiration date'),
|
|
|
|
defaultExpireMessage: defaultExpireMessage
|
|
|
|
});
|
|
|
|
|
|
|
|
return expiration;
|
|
|
|
},
|
|
|
|
|
2015-08-10 19:46:46 +00:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param {string} key - an identifier for the template
|
|
|
|
* @param {string} template - the HTML to be compiled by Handlebars
|
|
|
|
* @returns {Function} from Handlebars
|
|
|
|
* @private
|
|
|
|
*/
|
2015-07-30 22:07:41 +00:00
|
|
|
_getTemplate: function (key, template) {
|
|
|
|
if (!this._templates[key]) {
|
|
|
|
this._templates[key] = Handlebars.compile(template);
|
|
|
|
}
|
|
|
|
return this._templates[key];
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* returns the info template for remote sharing
|
|
|
|
*
|
2015-08-10 19:46:46 +00:00
|
|
|
* @returns {Function}
|
2015-07-30 22:07:41 +00:00
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
_getRemoteShareInfoTemplate: function() {
|
|
|
|
return this._getTemplate('remoteShareInfo', TEMPLATE_REMOTE_SHARE_INFO);
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* returns the info template for link sharing
|
|
|
|
*
|
2015-08-10 19:46:46 +00:00
|
|
|
* @returns {Function}
|
2015-07-30 22:07:41 +00:00
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
_getLinkShareTemplate: function() {
|
|
|
|
return this._getTemplate('linkShare', TEMPLATE_LINK_SHARE);
|
|
|
|
},
|
|
|
|
|
|
|
|
_getReshareTemplate: function() {
|
|
|
|
return this._getTemplate('reshare', TEMPLATE_RESHARER_INFO);
|
2015-08-07 22:23:06 +00:00
|
|
|
}
|
|
|
|
});
|
2015-07-30 22:07:41 +00:00
|
|
|
|
|
|
|
OC.Share.ShareDialogView = ShareDialogView;
|
|
|
|
|
|
|
|
})();
|