mirror of
https://github.com/telekom-security/tpotce.git
synced 2025-04-29 11:48:52 +00:00
310 lines
8.4 KiB
Text
310 lines
8.4 KiB
Text
/*
|
|
* 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 =
|
|
'<span class="icon-loading-small hidden"></span>' +
|
|
'<ul class="link-shares">' +
|
|
'{{#each shares}}' +
|
|
'<li class="link-entry" data-id="{{id}}">' +
|
|
'<span class="link-entry--icon icon-public-white"></span>' +
|
|
'<span class="link-entry--title">{{linkTitle}}</span>' +
|
|
'<div class="minify"><input id="linkText-{{../cid}}-{{id}}" class="linkText" type="text" readonly="readonly" value="{{link}}" /></div>' +
|
|
'<div class="link-entry--icon-button clipboardButton" data-clipboard-target="#linkText-{{../cid}}-{{id}}" title="{{../copyToClipboardText}}">' +
|
|
' <span class="icon icon-clippy-dark"></span>' +
|
|
' <span class="hidden">{{../copyToClipboardText}}</span>' +
|
|
'</div>' +
|
|
'<div class="link-entry--icon-button editLink" title="{{../editLinkText}}">' +
|
|
' <span class="icon icon-settings-dark"></span>' +
|
|
' <span class="hidden">{{../editLinkText}}</span>' +
|
|
'</div>' +
|
|
'{{#if ../socialShareEnabled}}' +
|
|
'<div class="link-entry--icon-button shareLink" title="{{../shareText}}">' +
|
|
' <span class="icon icon-share"></span>' +
|
|
' <span class="hidden">{{../shareText}}</span>' +
|
|
'</div>' +
|
|
'{{/if}}' +
|
|
'<div class="link-entry--icon-button removeLink" title="{{../removeLinkText}}">' +
|
|
' <span class="icon icon-delete"></span>' +
|
|
' <span class="hidden">{{../removeLinkText}}</span>' +
|
|
'</div>' +
|
|
'{{#if ../socialShareEnabled}}' +
|
|
'<div class="socialShareContainer hidden"></div>' +
|
|
'{{/if}}' +
|
|
'</li>' +
|
|
'{{/each}}' +
|
|
'</ul>' +
|
|
'{{#if noShares}}' +
|
|
'<div class="empty-message">{{noSharesMessage}}</div>' +
|
|
'{{/if}}' +
|
|
'<div class="clear-both">' +
|
|
' <button class="addLink">{{addLinkText}}</button>' +
|
|
'</div>' +
|
|
'<div class="privacyWarningMessage">{{privacyWarningMessage}}</div>';
|
|
|
|
/**
|
|
* @class OCA.Share.ShareDialogLinkListView
|
|
* @member {OC.Share.ShareItemModel} model
|
|
* @member {jQuery} $el
|
|
* @memberof OCA.Sharing
|
|
* @classdesc
|
|
*
|
|
* Represents the GUI of the share dialogue
|
|
*
|
|
*/
|
|
var ShareDialogLinkListView = OC.Backbone.View.extend({
|
|
/** @type {string} **/
|
|
id: 'shareDialogLinkList',
|
|
|
|
className: 'shareDialogLinkList',
|
|
|
|
/** @type {OCA.Files.FileInfoModel} **/
|
|
fileInfoModel: undefined,
|
|
|
|
/** @type {OC.Share.ShareConfigModel} **/
|
|
configModel: undefined,
|
|
|
|
/** @type {OC.Share.ShareItemModel} **/
|
|
itemModel: undefined,
|
|
|
|
/** @type {Function} **/
|
|
_template: undefined,
|
|
|
|
events: {
|
|
'click .addLink': 'onAddButtonClick',
|
|
'click .editLink': 'onEditButtonClick',
|
|
'click .removeLink': 'onRemoveButtonClick',
|
|
'click .shareLink': 'onShareButtonClick'
|
|
},
|
|
|
|
initialize: function (options) {
|
|
var view = this;
|
|
|
|
// if any item in the list changes, render the whole thing
|
|
this.collection.on('change update delete', function() {
|
|
view.render();
|
|
});
|
|
|
|
if (!_.isUndefined(options.itemModel)) {
|
|
this.itemModel = options.itemModel;
|
|
this.fileInfoModel = this.itemModel.getFileInfo();
|
|
this.configModel = this.itemModel.configModel;
|
|
} else {
|
|
throw 'missing OC.Share.ShareItemModel';
|
|
}
|
|
},
|
|
|
|
onRemoveButtonClick: function (ev) {
|
|
var $target = $(ev.target);
|
|
var linkId = $target.closest('.link-entry').attr('data-id');
|
|
|
|
var linkModel = this.collection.get(linkId);
|
|
var linkTitle = (linkModel.attributes.name) ? linkModel.attributes.name : linkModel.attributes.token;
|
|
|
|
if (!linkModel) {
|
|
return;
|
|
}
|
|
|
|
OCdialogs.confirm(
|
|
t('core', 'Delete {link}', { link: linkTitle }),
|
|
t('core', 'Remove link'),
|
|
function(cb) {
|
|
if (cb) {
|
|
linkModel.destroy();
|
|
}
|
|
},
|
|
true
|
|
);
|
|
|
|
},
|
|
|
|
_generateName: function() {
|
|
var index = 1;
|
|
var baseName = t('core', '{fileName} link', {
|
|
fileName: this.fileInfoModel.get('name')
|
|
});
|
|
var name = baseName;
|
|
|
|
while (this.collection.findWhere({name: name})) {
|
|
index++;
|
|
name = baseName + ' (' + index + ')';
|
|
}
|
|
|
|
return name;
|
|
},
|
|
|
|
onAddButtonClick: function () {
|
|
var newShare = new OC.Share.ShareModel({
|
|
name: this._generateName(),
|
|
password: '',
|
|
permissions: OC.PERMISSION_READ,
|
|
expireDate: this.configModel.getDefaultExpirationDateString(),
|
|
shareType: OC.Share.SHARE_TYPE_LINK,
|
|
itemType: this.itemModel.get('itemType'),
|
|
itemSource: this.itemModel.get('itemSource')
|
|
});
|
|
this._showPopupForShare(newShare);
|
|
},
|
|
|
|
onEditButtonClick: function (ev) {
|
|
var $target = $(ev.target);
|
|
var linkId = $target.closest('.link-entry').attr('data-id');
|
|
|
|
var linkModel = this.collection.get(linkId);
|
|
if (!linkModel) {
|
|
return;
|
|
}
|
|
|
|
this._showPopupForShare(linkModel);
|
|
},
|
|
|
|
onShareButtonClick: function (ev) {
|
|
var $target = $(ev.target);
|
|
var $li = $target.closest('.link-entry');
|
|
var linkId = $li.attr('data-id');
|
|
var $container = $li.find('.socialShareContainer');
|
|
|
|
var linkModel = this.collection.get(linkId);
|
|
if (!linkModel) {
|
|
return;
|
|
}
|
|
|
|
if ($container.is(':empty')) {
|
|
if (this.configModel.isSocialShareEnabled()) {
|
|
var socialView = new OC.Share.ShareDialogLinkSocialView({
|
|
model: linkModel,
|
|
configModel: this.configModel
|
|
});
|
|
socialView.render();
|
|
$container.append(socialView.$el);
|
|
$container.removeClass('hidden');
|
|
}
|
|
} else {
|
|
$container.toggleClass('hidden', !$container.hasClass('hidden'));
|
|
}
|
|
},
|
|
|
|
_showPopupForShare: function(model) {
|
|
var self = this;
|
|
var popupView = new OC.Share.ShareDialogLinkShareView({
|
|
model: model,
|
|
configModel: this.configModel,
|
|
// pass in legacy stuff...
|
|
itemModel: this.itemModel
|
|
});
|
|
|
|
popupView.once('saved', function() {
|
|
// add/update in collection on success
|
|
self.collection.add(model);
|
|
});
|
|
popupView.show();
|
|
},
|
|
|
|
_formatItem: function(model) {
|
|
return _.extend(model.toJSON(), {
|
|
linkTitle: model.get('name') || model.get('token'),
|
|
link: this._makeLink(model)
|
|
});
|
|
},
|
|
|
|
_makeLink: function(model) {
|
|
var link = '';
|
|
if (!model.get('token')) {
|
|
var preTokenLink = OC.getProtocol() + '://' + OC.getHost();
|
|
var fullPath = this.fileInfoModel.get('path') + '/' +
|
|
this.fileInfoModel.get('name');
|
|
var location = '/' + OC.currentUser + '/files' + fullPath;
|
|
var type = this.fileInfoModel.isDirectory() ? 'folder' : 'file';
|
|
link = preTokenLink + OC.linkTo('', 'public.php') + '?service=files&' +
|
|
type + '=' + encodeURIComponent(location);
|
|
} else {
|
|
link = model.getLink();
|
|
}
|
|
return link;
|
|
},
|
|
|
|
render: function () {
|
|
this.$el.html(this.template({
|
|
cid: this.cid,
|
|
urlLabel: t('core', 'Link'),
|
|
addLinkText: t('core', 'Create public link'),
|
|
editLinkText: t('core', 'Edit'),
|
|
removeLinkText: t('core', 'Remove'),
|
|
copyToClipboardText: t('core', 'Copy to clipboard'),
|
|
shareText: t('core', 'Social share'),
|
|
socialShareEnabled: this.configModel.isSocialShareEnabled(),
|
|
noShares: !this.collection.length,
|
|
noSharesMessage: t('core', 'There are currently no link shares, you can create one'),
|
|
privacyWarningMessage: t('core', 'Anyone with the link has access to the file/folder'),
|
|
shares: this.collection.map(_.bind(this._formatItem, this))
|
|
}));
|
|
|
|
this.$el.find('[title]').tooltip();
|
|
|
|
var clipboard = new Clipboard('#' + this.id + ' .clipboardButton');
|
|
clipboard.on('success', function (e) {
|
|
var $input = $(e.trigger);
|
|
$input.tooltip({
|
|
placement: 'bottom',
|
|
trigger: 'manual',
|
|
title: t('core', 'Copied!')
|
|
});
|
|
$input.tooltip('show');
|
|
_.delay(function () {
|
|
$input.tooltip('hide');
|
|
}, 3000);
|
|
});
|
|
clipboard.on('error', function (e) {
|
|
var $input = $(e.trigger);
|
|
var actionMsg = '';
|
|
if (bowser.ios) {
|
|
actionMsg = t('core', 'Not supported!');
|
|
} else if (bowser.mac) {
|
|
actionMsg = t('core', 'Press ⌘-C to copy.');
|
|
} else {
|
|
actionMsg = t('core', 'Press Ctrl-C to copy.');
|
|
}
|
|
|
|
$input.tooltip({
|
|
placement: 'bottom',
|
|
trigger: 'manual',
|
|
title: actionMsg
|
|
});
|
|
$input.tooltip('show');
|
|
_.delay(function () {
|
|
$input.tooltip('hide');
|
|
}, 3000);
|
|
});
|
|
|
|
this.delegateEvents();
|
|
|
|
return this;
|
|
},
|
|
|
|
/**
|
|
* @returns {Function} from Handlebars
|
|
* @private
|
|
*/
|
|
template: function (data) {
|
|
if (!this._template) {
|
|
this._template = Handlebars.compile(TEMPLATE);
|
|
}
|
|
return this._template(data);
|
|
}
|
|
|
|
});
|
|
|
|
OC.Share.ShareDialogLinkListView = ShareDialogLinkListView;
|
|
|
|
})();
|