123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291 |
- /*
- * 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 =
- '<ul id="shareWithList" class="shareWithList">' +
- '{{#each sharees}}' +
- ' <li data-share-id="{{shareId}}" data-share-type="{{shareType}}" data-share-with="{{shareWith}}">' +
- ' <a href="#" class="unshare"><span class="icon-loading-small hidden"></span><span class="icon icon-delete"></span><span class="hidden-visually">{{unshareLabel}}</span></a>' +
- ' {{#if avatarEnabled}}' +
- ' <div class="avatar {{#if modSeed}}imageplaceholderseed{{/if}}" data-username="{{shareWith}}" {{#if modSeed}}data-seed="{{shareWith}} {{shareType}}"{{/if}}></div>' +
- ' {{/if}}' +
- ' <span class="has-tooltip username" title="{{shareWith}}">{{shareWithDisplayName}}</span>' +
- ' {{#if mailNotificationEnabled}} {{#unless isRemoteShare}}' +
- ' <input id="mail-{{cid}}-{{shareWith}}" type="checkbox" name="mailNotification" class="mailNotification checkbox" {{#if wasMailSent}}checked="checked"{{/if}} />' +
- ' <label for="mail-{{cid}}-{{shareWith}}">{{notifyByMailLabel}}</label>' +
- ' {{/unless}} {{/if}}' +
- ' {{#if isResharingAllowed}} {{#if sharePermissionPossible}} {{#unless isRemoteShare}}' +
- ' <input id="canShare-{{cid}}-{{shareWith}}" type="checkbox" name="share" class="permissions checkbox" {{#if hasSharePermission}}checked="checked"{{/if}} data-permissions="{{sharePermission}}" />' +
- ' <label for="canShare-{{cid}}-{{shareWith}}">{{canShareLabel}}</label>' +
- ' {{/unless}} {{/if}} {{/if}}' +
- ' {{#if editPermissionPossible}}' +
- ' <input id="canEdit-{{cid}}-{{shareWith}}" type="checkbox" name="edit" class="permissions checkbox" {{#if hasEditPermission}}checked="checked"{{/if}} />' +
- ' <label for="canEdit-{{cid}}-{{shareWith}}">{{canEditLabel}}</label>' +
- ' {{/if}}' +
- ' {{#unless isRemoteShare}}' +
- ' <a href="#" class="showCruds"><img class="svg" alt="{{crudsLabel}}" src="{{triangleSImage}}"/></a>' +
- ' <div class="cruds hidden">' +
- ' {{#if createPermissionPossible}}' +
- ' <input id="canCreate-{{cid}}-{{shareWith}}" type="checkbox" name="create" class="permissions checkbox" {{#if hasCreatePermission}}checked="checked"{{/if}} data-permissions="{{createPermission}}"/>' +
- ' <label for="canCreate-{{cid}}-{{shareWith}}">{{createPermissionLabel}}</label>' +
- ' {{/if}}' +
- ' {{#if updatePermissionPossible}}' +
- ' <input id="canUpdate-{{cid}}-{{shareWith}}" type="checkbox" name="update" class="permissions checkbox" {{#if hasUpdatePermission}}checked="checked"{{/if}} data-permissions="{{updatePermission}}"/>' +
- ' <label for="canUpdate-{{cid}}-{{shareWith}}">{{updatePermissionLabel}}</label>' +
- ' {{/if}}' +
- ' {{#if deletePermissionPossible}} {{#unless isRemoteShare}}' +
- ' <input id="canDelete-{{cid}}-{{shareWith}}" type="checkbox" name="delete" class="permissions checkbox" {{#if hasDeletePermission}}checked="checked"{{/if}} data-permissions="{{deletePermission}}"/>' +
- ' <label for="canDelete-{{cid}}-{{shareWith}}">{{deletePermissionLabel}}</label>' +
- ' {{/unless}} {{/if}}' +
- ' </div>' +
- ' {{/unless}}' +
- ' </li>' +
- '{{/each}}' +
- '</ul>'
- ;
- /**
- * @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,
- /** @type {Function} **/
- _template: undefined,
- events: {
- 'click .unshare': 'onUnshare',
- 'click .permissions': 'onPermissionChange',
- 'click .showCruds': 'onCrudsToggle',
- 'click .mailNotification': 'onSendMailNotification'
- },
- 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 shareType = this.model.getShareType(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') + ')';
- hasPermissionOverride = {
- createPermissionPossible: true,
- updatePermissionPossible: true
- };
- }
- return _.extend(hasPermissionOverride, {
- cid: this.cid,
- hasSharePermission: this.model.hasSharePermission(shareIndex),
- hasEditPermission: this.model.hasEditPermission(shareIndex),
- hasCreatePermission: this.model.hasCreatePermission(shareIndex),
- hasUpdatePermission: this.model.hasUpdatePermission(shareIndex),
- hasDeletePermission: this.model.hasDeletePermission(shareIndex),
- wasMailSent: this.model.notificationMailWasSent(shareIndex),
- shareWith: shareWith,
- shareWithDisplayName: shareWithDisplayName,
- shareType: shareType,
- shareId: this.model.get('shares')[shareIndex].id,
- modSeed: shareType !== OC.Share.SHARE_TYPE_USER,
- isRemoteShare: shareType === OC.Share.SHARE_TYPE_REMOTE
- });
- },
- getShareeList: function() {
- var universal = {
- avatarEnabled: this.configModel.areAvatarsEnabled(),
- mailNotificationEnabled: this.configModel.isMailNotificationEnabled(),
- notifyByMailLabel: t('core', 'notify by email'),
- unshareLabel: t('core', 'Unshare'),
- canShareLabel: t('core', 'can share'),
- canEditLabel: t('core', 'can edit'),
- createPermissionLabel: t('core', 'create'),
- updatePermissionLabel: t('core', 'change'),
- deletePermissionLabel: t('core', 'delete'),
- crudsLabel: t('core', 'access control'),
- triangleSImage: OC.imagePath('core', 'actions/triangle-s'),
- isResharingAllowed: this.configModel.get('isResharingAllowed'),
- 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
- };
- if(!this.model.hasUserShares()) {
- return [];
- }
- var shares = this.model.get('shares');
- var list = [];
- for(var index = 0; index < shares.length; index++) {
- // first empty {} is necessary, otherwise we get in trouble
- // with references
- list.push(_.extend({}, universal, this.getShareeObject(index)));
- }
- return list;
- },
- render: function() {
- this.$el.html(this.template({
- cid: this.cid,
- sharees: this.getShareeList()
- }));
- if(this.configModel.areAvatarsEnabled()) {
- this.$el.find('.avatar').each(function() {
- var $this = $(this);
- if ($this.hasClass('imageplaceholderseed')) {
- $this.css({width: 32, height: 32});
- $this.imageplaceholder($this.data('seed'));
- } else {
- $this.avatar($this.data('username'), 32);
- }
- });
- }
- this.$el.find('.has-tooltip').tooltip({
- placement: 'bottom'
- });
- this.delegateEvents();
- return this;
- },
- /**
- * @returns {Function} from Handlebars
- * @private
- */
- template: function (data) {
- if (!this._template) {
- this._template = Handlebars.compile(TEMPLATE);
- }
- return this._template(data);
- },
- onUnshare: function(event) {
- 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');
- 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;
- },
- onPermissionChange: function(event) {
- var $element = $(event.target);
- var $li = $element.closest('li');
- var shareId = $li.data('share-id');
- var shareType = $li.data('share-type');
- var shareWith = $li.attr('data-share-with');
- // 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).attr('checked', checked);
- } else {
- var numberChecked = $checkboxes.filter(':checked').length;
- checked = numberChecked > 0;
- $('input[name="edit"]', $li).attr('checked', checked);
- }
- var permissions = OC.PERMISSION_READ;
- $('.permissions', $li).not('input[name="edit"]').filter(':checked').each(function(index, checkbox) {
- permissions |= $(checkbox).data('permissions');
- });
- this.model.updateShare(shareId, {permissions: permissions});
- },
- onCrudsToggle: function(event) {
- var $target = $(event.target);
- $target.closest('li').find('.cruds').toggleClass('hidden');
- return false;
- },
- onSendMailNotification: function(event) {
- var $target = $(event.target);
- var $li = $(event.target).closest('li');
- var shareType = $li.data('share-type');
- var shareWith = $li.attr('data-share-with');
- this.model.sendNotificationForShare(shareType, shareWith, $target.is(':checked'));
- }
- });
- OC.Share.ShareDialogShareeListView = ShareDialogShareeListView;
- })();
|