diff options
author | Thomas Müller <thomas.mueller@tmit.eu> | 2016-03-01 14:47:44 +0300 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2016-03-01 14:47:44 +0300 |
commit | 408e365600ad82da0f62d6e9220af9e683ec2cff (patch) | |
tree | 224363b7b0cfd438f425a13f9a50b56328508b99 | |
parent | 7b013e2142dba9ca1c6896b18d28152428c051d4 (diff) | |
parent | 4a1325769d38785b761f2c9f55627c202718c73a (diff) |
Merge pull request #541 from owncloud/sharing-9.0v9.0.0RC1
Make share.js work with new OCS Share API
-rw-r--r-- | js/gallery.js | 16 | ||||
-rw-r--r-- | js/galleryconfig.js | 2 | ||||
-rw-r--r-- | js/vendor/owncloud/share.js | 1985 | ||||
-rw-r--r-- | templates/part.content.php | 2 |
4 files changed, 999 insertions, 1006 deletions
diff --git a/js/gallery.js b/js/gallery.js index c16b7062..d598443f 100644 --- a/js/gallery.js +++ b/js/gallery.js @@ -176,24 +176,12 @@ // Clicking on share button does not trigger automatic slide-up $('.album-info-container').slideUp(); - if (!OC.Share.droppedDown) { + if (!Gallery.Share.droppedDown) { event.preventDefault(); event.stopPropagation(); - (function () { - var target = OC.Share.showLink; - OC.Share.showLink = function () { - var r = target.apply(this, arguments); - $('#linkText').val($('#linkText').val().replace('index.php/s/', - 'index.php/apps/' + - Gallery.appName + '/s/')); - - return r; - }; - })(); - var albumPermissions = Gallery.config.albumPermissions; - $('a.share').data('item', albumPermissions.fileid).data('link', true) + $('a.share').data('path', albumPermissions.path).data('link', true) .data('possible-permissions', albumPermissions.permissions). click(); if (!$('#linkCheckbox').is(':checked')) { diff --git a/js/galleryconfig.js b/js/galleryconfig.js index 9329bdc7..8e136346 100644 --- a/js/galleryconfig.js +++ b/js/galleryconfig.js @@ -163,7 +163,7 @@ */ _setAlbumPermissions: function (albumConfig) { return { - fileid: albumConfig.fileid, + path: albumConfig.path, permissions: albumConfig.permissions }; }, diff --git a/js/vendor/owncloud/share.js b/js/vendor/owncloud/share.js index ac40cda8..4c1d49bc 100644 --- a/js/vendor/owncloud/share.js +++ b/js/vendor/owncloud/share.js @@ -1,16 +1,39 @@ -/* global escapeHTML */ +/* global Gallery, escapeHTML */ + +(function ($, Gallery) { + "use strict"; + + /** + * @typedef {Object} Gallery.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} mail_send + * @property {String} displayname_file_owner + * @property {String} displayname_owner + * @property {String} uid_owner + * @property {String} uid_file_owner + * @property {String} expiration optional + * @property {Number} stime + */ -(function(OC) { // copied and stripped out from the old core - OC.Share = _.extend(OC.Share, { + var Share = { + SHARE_TYPE_USER: 0, + SHARE_TYPE_GROUP: 1, + SHARE_TYPE_LINK: 3, + SHARE_TYPE_EMAIL: 4, + SHARE_TYPE_REMOTE: 6, + /** * @deprecated use OC.Share.currentShares instead */ - itemShares:[], - /** - * Full list of all share statuses - */ - statuses:{}, + itemShares: [], + /** * Shares for the currently selected file. * (for which the dropdown is open) @@ -19,298 +42,130 @@ * shares of the given item type. */ currentShares: {}, + /** * Whether the share dropdown is opened. */ - droppedDown:false, + 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) { - // Load all share icons - $.get( - OC.filePath('core', 'ajax', 'share.php'), - { - fetch: 'getItemsSharedStatuses', - itemType: itemType - }, function(result) { - if (result && result.status === 'success') { - OC.Share.statuses = {}; - $.each(result.data, function(item, data) { - OC.Share.statuses[item] = data; - }); - 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 path {String} path to the file/folder which should be shared + * @param shareType {Number} 0 = user; 1 = group; 3 = public link; 6 = federated cloud + * share + * @param shareWith {String} user / group id with which the file should be shared + * @param publicUpload {Boolean} allow public upload to a public shared folder + * @param password {String} password to protect public link Share with + * @param permissions {Number} 1 = read; 2 = update; 4 = create; 8 = delete; 16 = share; 31 + * = all (default: 31, for public shares: 1) + * @param callback {Function} method to call back after a successful share creation + * @param errorCallback {Function} method to call back after a failed share creation * - * @param itemType item type - * @param fileList file list instance - * defaults to OCA.Files.App.fileList + * @returns {*} */ - 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 image = OC.imagePath('core', 'actions/share'); - var data = OC.Share.statuses[item]; - var hasLink = data.link; - // Links override shared in terms of icon display - if (hasLink) { - image = OC.imagePath('core', 'actions/public'); + share: function (path, shareType, shareWith, publicUpload, password, permissions, callback, errorCallback) { + return $.ajax({ + url: OC.linkToOCS('apps/files_sharing/api/v1', 2) + 'shares' + '?format=json', + type: 'POST', + data: { + path: path, + shareType: shareType, + shareWith: shareWith, + publicUpload: publicUpload, + password: password, + permissions: permissions + }, + dataType: 'json' + }).done(function (result) { + if (callback) { + callback(result.ocs.data); } - if (itemType !== 'file' && itemType !== 'folder') { - $('a.share[data-item="'+item+'"]').css('background', 'url('+image+') no-repeat center'); + }).fail(function (xhr) { + var result = xhr.responseJSON; + if (_.isFunction(errorCallback)) { + errorCallback(result); } 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 image = OC.imagePath('core', 'actions/share'); - $.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; - image = OC.imagePath('core', 'actions/public'); - link = true; - return; - } - } else if (OC.Share.itemShares[index].length > 0) { - shares = true; - image = OC.imagePath('core', 'actions/share'); + var msg = t('core', 'Error'); + if (result.ocs && result.ocs.meta.message) { + msg = result.ocs.meta.message; } + OC.dialogs.alert(msg, t('core', 'Error while sharing')); } }); - if (itemType != 'file' && itemType != 'folder') { - $('a.share[data-item="'+itemSource+'"]').css('background', 'url('+image+') no-repeat center'); - } 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} remoteAddress full remote share - * @return {String} HTML code to display + * @param {Number} shareId + * @param {Function} callback */ - _formatRemoteShare: function(remoteAddress) { - var parts = this._REMOTE_OWNER_REGEXP.exec(remoteAddress); - if (!parts) { - // display as is, most likely to be a simple owner name - return escapeHTML(remoteAddress); - } - - var userName = parts[1]; - var userDomain = parts[3]; - var server = parts[4]; - var dir = parts[6]; - var tooltip = userName; - if (userDomain) { - tooltip += '@' + userDomain; - } - if (server) { - if (!userDomain) { - userDomain = '…'; + unshare: function (shareId, callback) { + $.ajax({ + url: OC.linkToOCS('apps/files_sharing/api/v1', 2) + 'shares/' + shareId + + '?format=json', + type: 'DELETE' + }).done(function () { + if (callback) { + callback(); } - tooltip += '@' + server; - } + }).fail(function () { + OC.dialogs.alert(t('core', 'Error while unsharing'), t('core', 'Error')); - 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; + }); }, /** - * 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 + * @param {Number} shareId + * @param {Number} permissions */ - loadItem:function(itemType, itemSource) { - var data = ''; - var checkReshare = true; - if (typeof OC.Share.statuses[itemSource] === 'undefined') { - // NOTE: Check does not always work and misses some shares, fix later - var checkShares = true; - } else { - var checkShares = true; - } - $.ajax({type: 'GET', url: OC.filePath('core', 'ajax', 'share.php'), data: { fetch: 'getItem', itemType: itemType, itemSource: itemSource, checkReshare: checkReshare, checkShares: checkShares }, async: false, success: function(result) { - if (result && result.status === 'success') { - data = result.data; - } else { - data = false; - } - }}); - - return data; - }, - share:function(itemType, itemSource, shareType, shareWith, permissions, itemSourceName, expirationDate, callback, errorCallback) { - // Add a fallback for old share() calls without expirationDate. - // We should remove this in a later version, - // after the Apps have been updated. - if (typeof callback === 'undefined' && - typeof expirationDate === 'function') { - callback = expirationDate; - expirationDate = ''; - console.warn( - "Call to 'OC.Share.share()' with too few arguments. " + - "'expirationDate' was assumed to be 'callback'. " + - "Please revisit the call and fix the list of arguments." - ); - } - - return $.post(OC.filePath('core', 'ajax', 'share.php'), - { - action: 'share', - itemType: itemType, - itemSource: itemSource, - shareType: shareType, - shareWith: shareWith, - permissions: permissions, - itemSourceName: itemSourceName, - expirationDate: expirationDate - }, function (result) { - if (result && result.status === 'success') { - if (callback) { - callback(result.data); - } - } else { - if (_.isUndefined(errorCallback)) { - var msg = t('core', 'Error'); - if (result.data && result.data.message) { - msg = result.data.message; - } - OC.dialogs.alert(msg, t('core', 'Error while sharing')); - } else { - errorCallback(result); - } - } - } - ); - }, - unshare:function(itemType, itemSource, shareType, shareWith, callback) { - $.post(OC.filePath('core', 'ajax', 'share.php'), { action: 'unshare', itemType: itemType, itemSource: itemSource, shareType: shareType, shareWith: shareWith }, function(result) { - if (result && result.status === 'success') { - if (callback) { - callback(); - } - } else { - OC.dialogs.alert(t('core', 'Error while unsharing'), t('core', 'Error')); - } - }); - }, - setPermissions:function(itemType, itemSource, shareType, shareWith, permissions) { - $.post(OC.filePath('core', 'ajax', 'share.php'), { action: 'setPermissions', itemType: itemType, itemSource: itemSource, shareType: shareType, shareWith: shareWith, permissions: permissions }, function(result) { - if (!result || result.status !== 'success') { - OC.dialogs.alert(t('core', 'Error while changing permissions'), t('core', 'Error')); + setPermissions: function (shareId, permissions) { + $.ajax({ + url: OC.linkToOCS('apps/files_sharing/api/v1', 2) + 'shares/' + shareId + + '?format=json', + type: 'PUT', + data: { + permissions: permissions } + }).fail(function () { + OC.dialogs.alert(t('core', 'Error while changing permissions'), + t('core', 'Error')); }); }, - showDropDown:function(itemType, itemSource, appendTo, link, possiblePermissions, filename) { - var data = OC.Share.loadItem(itemType, itemSource); + /** + * + * @param {String} itemType + * @param {String} path + * @param {String} appendTo + * @param {String} link + * @param {Number} possiblePermissions + * @param {String} filename + */ + showDropDown: function (itemType, path, appendTo, link, possiblePermissions, filename) { + // This is a sync AJAX request on the main thread... + var data = this._loadShares(path); var dropDownEl; - var html = '<div id="dropdown" class="drop shareDropDown" data-item-type="'+itemType+'" data-item-source="'+itemSource+'">'; - if (data !== false && data.reshare !== false && data.reshare.uid_owner !== undefined && data.reshare.uid_owner !== OC.currentUser) { + var self = this; + var html = '<div id="dropdown" class="drop shareDropDown" data-item-type="' + itemType + + '" data-item-source="' + path + '">'; + if (data !== false && data[0] && !_.isUndefined(data[0].uid_file_owner) && + data[0].uid_file_owner !== OC.currentUser + ) { html += '<span class="reshare">'; if (oc_config.enable_avatars === true) { - html += '<div class="avatar"></div> '; + html += '<div class="avatar"></div>'; } - if (data.reshare.share_type == OC.Share.SHARE_TYPE_GROUP) { - html += t('core', 'Shared with you and the group {group} by {owner}', {group: data.reshare.share_with, owner: data.reshare.displayname_owner}); + if (data[0].share_type == this.SHARE_TYPE_GROUP) { + html += t('core', 'Shared with you and the group {group} by {owner}', { + group: data[0].share_with, + owner: data[0].displayname_owner + }); } else { - html += t('core', 'Shared with you by {owner}', {owner: data.reshare.displayname_owner}); + html += t('core', 'Shared with you by {owner}', + {owner: data[0].displayname_owner}); } html += '</span><br />'; // reduce possible permissions to what the original share allowed - possiblePermissions = possiblePermissions & data.reshare.permissions; + possiblePermissions = possiblePermissions & data[0].permissions; } if (possiblePermissions & OC.PERMISSION_SHARE) { @@ -318,31 +173,38 @@ // Used later on to determine if the // respective checkbox should be checked or // not. - - var publicUploadEnabled = $('#filestable').data('allow-public-upload'); - if (typeof publicUploadEnabled == 'undefined') { - publicUploadEnabled = 'no'; - } - var allowPublicUploadStatus = false; - - $.each(data.shares, function(key, value) { - if (value.share_type === OC.Share.SHARE_TYPE_LINK) { - allowPublicUploadStatus = (value.permissions & OC.PERMISSION_CREATE) ? true : false; - return true; - } - }); + // FIXME public uploading is not supported in Gallery + /*var publicUploadEnabled = $('#filestable').data('allow-public-upload'); + if (typeof publicUploadEnabled == 'undefined') { + publicUploadEnabled = 'no'; + } + var allowPublicUploadStatus = false; + + $.each(data, function (key, value) { + if (value.share_type === self.SHARE_TYPE_LINK) { + allowPublicUploadStatus = + (value.permissions & OC.PERMISSION_CREATE) ? true : false; + return true; + } + });*/ var sharePlaceholder = t('core', 'Share with users or groups …'); - if(oc_appconfig.core.remoteShareAllowed) { + if (oc_appconfig.core.remoteShareAllowed) { sharePlaceholder = t('core', 'Share with users, groups or remote users …'); } - html += '<label for="shareWith" class="hidden-visually">'+t('core', 'Share')+'</label>'; - html += '<input id="shareWith" type="text" placeholder="' + sharePlaceholder + '" />'; - if(oc_appconfig.core.remoteShareAllowed) { - var federatedCloudSharingDoc = '<a target="_blank" class="icon-info svg shareWithRemoteInfo" href="{docLink}" ' - + 'title="' + t('core', 'Share with people on other ownClouds using the syntax username@example.com/owncloud') + '"></a>'; - html += federatedCloudSharingDoc.replace('{docLink}', oc_appconfig.core.federatedCloudShareDoc); + html += '<label for="shareWith" class="hidden-visually">' + t('core', 'Share') + + '</label>'; + html += + '<input id="shareWith" type="text" placeholder="' + sharePlaceholder + '" />'; + if (oc_appconfig.core.remoteShareAllowed) { + var federatedCloudSharingDoc = + '<a target="_blank" class="icon-info svg shareWithRemoteInfo" ' + + 'href="{docLink}" title="' + t('core', + 'Share with people on other ownClouds using the syntax username@example.com/owncloud') + + '"></a>'; + html += federatedCloudSharingDoc.replace('{docLink}', + oc_appconfig.core.federatedCloudShareDoc); } html += '<span class="shareWithLoading icon-loading-small hidden"></span>'; html += '<ul id="shareWithList">'; @@ -351,218 +213,291 @@ if (link && linksAllowed) { html += '<div id="link" class="linkShare">'; html += '<span class="icon-loading-small hidden"></span>'; - html += '<input type="checkbox" class="checkbox checkbox--right" name="linkCheckbox" id="linkCheckbox" value="1" /><label for="linkCheckbox">'+t('core', 'Share link')+'</label>'; + html += + '<input type="checkbox" class="checkbox checkbox--right" ' + + 'name="linkCheckbox" id="linkCheckbox" value="1" />' + + '<label for="linkCheckbox">' + t('core', 'Share link') + '</label>'; html += '<br />'; var defaultExpireMessage = ''; - if ((itemType === 'folder' || itemType === 'file') && oc_appconfig.core.defaultExpireDateEnforced) { - defaultExpireMessage = t('core', 'The public link will expire no later than {days} days after it is created', {'days': oc_appconfig.core.defaultExpireDate}) + '<br/>'; + if ((itemType === 'folder' || itemType === 'file') && + oc_appconfig.core.defaultExpireDateEnforced) { + defaultExpireMessage = + t('core', + 'The public link will expire no later than {days} days after it is created', + {'days': oc_appconfig.core.defaultExpireDate}) + '<br/>'; } - html += '<label for="linkText" class="hidden-visually">'+t('core', 'Link')+'</label>'; + html += '<label for="linkText" class="hidden-visually">' + t('core', 'Link') + + '</label>'; html += '<input id="linkText" type="text" readonly="readonly" />'; - html += '<input type="checkbox" class="checkbox checkbox--right" name="showPassword" id="showPassword" value="1" /><label for="showPassword" style="display:none;">'+t('core', 'Password protect')+'</label>'; + html += + '<input type="checkbox" class="checkbox checkbox--right" ' + + 'name="showPassword" id="showPassword" value="1" />' + + '<label for="showPassword" style="display:none;">' + + t('core', 'Password protect') + '</label>'; html += '<div id="linkPass">'; - html += '<label for="linkPassText" class="hidden-visually">'+t('core', 'Password')+'</label>'; - html += '<input id="linkPassText" type="password" placeholder="'+t('core', 'Choose a password for the public link')+'" />'; + html += '<label for="linkPassText" class="hidden-visually">' + + t('core', 'Password') + '</label>'; + html += '<input id="linkPassText" type="password" placeholder="' + + t('core', 'Choose a password for the public link') + '" />'; html += '<span class="icon-loading-small hidden"></span>'; html += '</div>'; - if (itemType === 'folder' && (possiblePermissions & OC.PERMISSION_CREATE) && publicUploadEnabled === 'yes') { - html += '<div id="allowPublicUploadWrapper" style="display:none;">'; - html += '<span class="icon-loading-small hidden"></span>'; - html += '<input type="checkbox" class="checkbox checkbox--right" value="1" name="allowPublicUpload" id="sharingDialogAllowPublicUpload"' + ((allowPublicUploadStatus) ? 'checked="checked"' : '') + ' />'; - html += '<label for="sharingDialogAllowPublicUpload">' + t('core', 'Allow editing') + '</label>'; - html += '</div>'; - } - html += '</div>'; - var mailPublicNotificationEnabled = $('input:hidden[name=mailPublicNotificationEnabled]').val(); - if (mailPublicNotificationEnabled === 'yes') { - html += '<form id="emailPrivateLink">'; - html += '<input id="email" style="display:none; width:62%;" value="" placeholder="'+t('core', 'Email link to person')+'" type="text" />'; - html += '<input id="emailButton" style="display:none;" type="submit" value="'+t('core', 'Send')+'" />'; - html += '</form>'; - } + // FIXME public uploading is not supported in Gallery + /*if (itemType === 'folder' && (possiblePermissions & OC.PERMISSION_CREATE) && + publicUploadEnabled === 'yes') { + html += '<div id="allowPublicUploadWrapper" style="display:none;">'; + html += '<span class="icon-loading-small hidden"></span>'; + html += + '<input type="checkbox" class="checkbox checkbox--right" value="1" name="allowPublicUpload" id="sharingDialogAllowPublicUpload"' + + ((allowPublicUploadStatus) ? 'checked="checked"' : '') + ' />'; + html += '<label for="sharingDialogAllowPublicUpload">' + + t('core', 'Allow editing') + '</label>'; + html += '</div>'; + } + html += '</div>'; + var mailPublicNotificationEnabled = $( + 'input:hidden[name=mailPublicNotificationEnabled]').val(); + if (mailPublicNotificationEnabled === 'yes') { + html += '<form id="emailPrivateLink">'; + html += + '<input id="email" style="display:none; width:62%;" value="" placeholder="' + + t('core', 'Email link to person') + '" type="text" />'; + html += + '<input id="emailButton" style="display:none;" type="submit" value="' + + t('core', 'Send') + '" />'; + html += '</form>'; + }*/ } html += '<div id="expiration">'; - html += '<input type="checkbox" class="checkbox checkbox--right" name="expirationCheckbox" id="expirationCheckbox" value="1" /><label for="expirationCheckbox">'+t('core', 'Set expiration date')+'</label>'; - html += '<label for="expirationDate" class="hidden-visually">'+t('core', 'Expiration')+'</label>'; - html += '<input id="expirationDate" type="text" placeholder="'+t('core', 'Expiration date')+'" style="display:none; width:90%;" />'; - html += '<em id="defaultExpireMessage">'+defaultExpireMessage+'</em>'; + html += + '<input type="checkbox" class="checkbox checkbox--right" ' + + 'name="expirationCheckbox" id="expirationCheckbox" value="1" />' + + '<label for="expirationCheckbox">' + + t('core', 'Set expiration date') + '</label>'; + html += '<label for="expirationDate" class="hidden-visually">' + + t('core', 'Expiration') + '</label>'; + html += '<input id="expirationDate" type="text" placeholder="' + + t('core', 'Expiration date') + '" style="display:none; width:90%;" />'; + html += '<em id="defaultExpireMessage">' + defaultExpireMessage + '</em>'; html += '</div>'; dropDownEl = $(html); dropDownEl = dropDownEl.appendTo(appendTo); // trigger remote share info tooltip - if(oc_appconfig.core.remoteShareAllowed) { - $('.shareWithRemoteInfo').tipsy({gravity: 'e'}); + if (oc_appconfig.core.remoteShareAllowed) { + $('.shareWithRemoteInfo').tooltip({placement: 'top'}); } //Get owner avatars - if (oc_config.enable_avatars === true && data !== false && data.reshare !== false && data.reshare.uid_owner !== undefined) { - dropDownEl.find(".avatar").avatar(data.reshare.uid_owner, 32); + if (oc_config.enable_avatars === true && data !== false && data[0] !== false && + !_.isUndefined(data[0]) && !_.isUndefined(data[0].uid_file_owner)) { + dropDownEl.find(".avatar").avatar(data[0].uid_file_owner, 32); } // Reset item shares - OC.Share.itemShares = []; - OC.Share.currentShares = {}; - if (data.shares) { - $.each(data.shares, function(index, share) { - if (share.share_type == OC.Share.SHARE_TYPE_LINK) { - if (itemSource === share.file_source || itemSource === share.item_source) { - OC.Share.showLink(share.token, share.share_with, itemSource); - } + this.itemShares = []; + this.currentShares = {}; + if (data) { + $.each(data, function (index, share) { + if (share.share_type === self.SHARE_TYPE_LINK) { + self.showLink(share.id, share.token, share.share_with); } else { - if (share.collection) { - OC.Share.addShareWith(share.share_type, share.share_with, share.share_with_displayname, share.permissions, possiblePermissions, share.mail_send, share.collection); - } else { - if (share.share_type === OC.Share.SHARE_TYPE_REMOTE) { - OC.Share.addShareWith(share.share_type, share.share_with, share.share_with_displayname, share.permissions, OC.PERMISSION_READ | OC.PERMISSION_UPDATE | OC.PERMISSION_CREATE, share.mail_send, false); + if (share.share_with !== OC.currentUser) { + if (share.share_type === self.SHARE_TYPE_REMOTE) { + self._addShareWith(share.id, + share.share_type, + share.share_with, + share.share_with_displayname, + share.permissions, + OC.PERMISSION_READ | OC.PERMISSION_UPDATE | + OC.PERMISSION_CREATE, + share.mail_send, + false); } else { - OC.Share.addShareWith(share.share_type, share.share_with, share.share_with_displayname, share.permissions, possiblePermissions, share.mail_send, false); + self._addShareWith(share.id, + share.share_type, + share.share_with, + share.share_with_displayname, + share.permissions, + possiblePermissions, + share.mail_send, + false); } } } if (share.expiration != null) { - var expireDate = moment(share.expiration, 'YYYY-MM-DD').format('DD-MM-YYYY'); - OC.Share.showExpirationDate(expireDate, share.stime); + var expireDate = moment(share.expiration, 'YYYY-MM-DD').format( + 'DD-MM-YYYY'); + self.showExpirationDate(expireDate, share.stime); } }); } - $('#shareWith').autocomplete({minLength: 2, delay: 750, source: function(search, response) { - var $loading = $('#dropdown .shareWithLoading'); - $loading.removeClass('hidden'); - $.get(OC.filePath('core', 'ajax', 'share.php'), { fetch: 'getShareWith', search: search.term.trim(), limit: 200, itemShares: OC.Share.itemShares, itemType: itemType }, function(result) { - $loading.addClass('hidden'); - if (result.status == 'success' && result.data.length > 0) { - $( "#shareWith" ).autocomplete( "option", "autoFocus", true ); - response(result.data); - } else { - response(); - } - }).fail(function(){ - $('#dropdown').find('.shareWithLoading').addClass('hidden'); - OC.Notification.show(t('core', 'An error occured. Please try again')); - window.setTimeout(OC.Notification.hide, 5000); - }); - }, - focus: function(event, focused) { - event.preventDefault(); - }, - select: function(event, selected) { - event.stopPropagation(); - var $dropDown = $('#dropdown'); - var itemType = $dropDown.data('item-type'); - var itemSource = $dropDown.data('item-source'); - var itemSourceName = $dropDown.data('item-source-name'); - var expirationDate = ''; - if ( $('#expirationCheckbox').is(':checked') === true ) { - expirationDate = $( "#expirationDate" ).val(); - } - var shareType = selected.item.value.shareType; - var shareWith = selected.item.value.shareWith; - $(this).val(shareWith); - // Default permissions are Edit (CRUD) and Share - // Check if these permissions are possible - var permissions = OC.PERMISSION_READ; - if (shareType === OC.Share.SHARE_TYPE_REMOTE) { - permissions = OC.PERMISSION_CREATE | OC.PERMISSION_UPDATE | OC.PERMISSION_READ; - } else { - if (possiblePermissions & OC.PERMISSION_UPDATE) { - permissions = permissions | OC.PERMISSION_UPDATE; - } - if (possiblePermissions & OC.PERMISSION_CREATE) { - permissions = permissions | OC.PERMISSION_CREATE; - } - if (possiblePermissions & OC.PERMISSION_DELETE) { - permissions = permissions | OC.PERMISSION_DELETE; + $('#shareWith').autocomplete({ + minLength: 2, + delay: 750, + source: function (search, response) { + var $loading = $('#dropdown .shareWithLoading'); + $loading.removeClass('hidden'); + // Can be replaced with Sharee API + // https://github.com/owncloud/core/pull/18234 + $.get(OC.filePath('core', 'ajax', 'share.php'), { + fetch: 'getShareWith', + search: search.term.trim(), + limit: 200, + itemShares: this.itemShares, + itemType: itemType + }, function (result) { + $loading.addClass('hidden'); + if (result.status == 'success' && result.data.length > 0) { + $("#shareWith").autocomplete("option", "autoFocus", true); + response(result.data); + } else { + response(); + } + }).fail(function () { + $('#dropdown').find('.shareWithLoading').addClass('hidden'); + OC.Notification.show(t('core', 'An error occured. Please try again')); + window.setTimeout(OC.Notification.hide, 5000); + }); + }, + focus: function (event) { + event.preventDefault(); + }, + select: function (event, selected) { + event.stopPropagation(); + var $dropDown = $('#dropdown'); + var itemSource = $dropDown.data('item-source'); + var expirationDate = ''; + if ($('#expirationCheckbox').is(':checked') === true) { + expirationDate = $("#expirationDate").val(); } - if (oc_appconfig.core.resharingAllowed && (possiblePermissions & OC.PERMISSION_SHARE)) { - permissions = permissions | OC.PERMISSION_SHARE; + var shareType = selected.item.value.shareType; + var shareWith = selected.item.value.shareWith; + $(this).val(shareWith); + // Default permissions are Edit (CRUD) and Share + // Check if these permissions are possible + var permissions = OC.PERMISSION_READ; + if (shareType === Gallery.Share.SHARE_TYPE_REMOTE) { + permissions = + OC.PERMISSION_CREATE | OC.PERMISSION_UPDATE | OC.PERMISSION_READ; + } else { + if (possiblePermissions & OC.PERMISSION_UPDATE) { + permissions = permissions | OC.PERMISSION_UPDATE; + } + if (possiblePermissions & OC.PERMISSION_CREATE) { + permissions = permissions | OC.PERMISSION_CREATE; + } + if (possiblePermissions & OC.PERMISSION_DELETE) { + permissions = permissions | OC.PERMISSION_DELETE; + } + if (oc_appconfig.core.resharingAllowed && + (possiblePermissions & OC.PERMISSION_SHARE)) { + permissions = permissions | OC.PERMISSION_SHARE; + } } - } - - var $input = $(this); - var $loading = $dropDown.find('.shareWithLoading'); - $loading.removeClass('hidden'); - $input.val(t('core', 'Adding user...')); - $input.prop('disabled', true); - OC.Share.share(itemType, itemSource, shareType, shareWith, permissions, itemSourceName, expirationDate, function() { + var $input = $(this); + var $loading = $dropDown.find('.shareWithLoading'); + $loading.removeClass('hidden'); + $input.val(t('core', 'Adding user...')); + $input.prop('disabled', true); + Gallery.Share.share( + itemSource, + shareType, + shareWith, + 0, + null, + permissions, + function (data) { + var posPermissions = possiblePermissions; + if (shareType === Gallery.Share.SHARE_TYPE_REMOTE) { + posPermissions = permissions; + } + Gallery.Share._addShareWith(data.id, shareType, shareWith, + selected.item.label, + permissions, posPermissions); + }); $input.prop('disabled', false); $loading.addClass('hidden'); - var posPermissions = possiblePermissions; - if (shareType === OC.Share.SHARE_TYPE_REMOTE) { - posPermissions = permissions; - } - OC.Share.addShareWith(shareType, shareWith, selected.item.label, permissions, posPermissions); $('#shareWith').val(''); - $('#dropdown').trigger(new $.Event('sharesChanged', {shares: OC.Share.currentShares})); - OC.Share.updateIcon(itemType, itemSource); - }); - return false; - } - }) - // customize internal _renderItem function to display groups and users differently - .data("ui-autocomplete")._renderItem = function( ul, item ) { - var insert = $( "<a>" ); + return false; + } + }).data("ui-autocomplete")._renderItem = function (ul, item) { + // customize internal _renderItem function to display groups and users + // differently + var insert = $("<a>"); var text = item.label; - if (item.value.shareType === OC.Share.SHARE_TYPE_GROUP) { - text = text + ' ('+t('core', 'group')+')'; - } else if (item.value.shareType === OC.Share.SHARE_TYPE_REMOTE) { - text = text + ' ('+t('core', 'remote')+')'; + if (item.value.shareType === Gallery.Share.SHARE_TYPE_GROUP) { + text = text + ' (' + t('core', 'group') + ')'; + } else if (item.value.shareType === Gallery.Share.SHARE_TYPE_REMOTE) { + text = text + ' (' + t('core', 'remote') + ')'; } - insert.text( text ); - if(item.value.shareType === OC.Share.SHARE_TYPE_GROUP) { + insert.text(text); + if (item.value.shareType === Gallery.Share.SHARE_TYPE_GROUP) { insert = insert.wrapInner('<strong></strong>'); } - return $( "<li>" ) - .addClass((item.value.shareType === OC.Share.SHARE_TYPE_GROUP)?'group':'user') - .append( insert ) - .appendTo( ul ); + return $("<li>") + .addClass( + (item.value.shareType === + Gallery.Share.SHARE_TYPE_GROUP) ? 'group' : 'user') + .append(insert) + .appendTo(ul); }; - if (link && linksAllowed && $('#email').length != 0) { - $('#email').autocomplete({ - minLength: 1, - source: function (search, response) { - $.get(OC.filePath('core', 'ajax', 'share.php'), { fetch: 'getShareWithEmail', search: search.term }, function(result) { - if (result.status == 'success' && result.data.length > 0) { - response(result.data); - } - }); - }, - select: function( event, item ) { - $('#email').val(item.item.email); - return false; - } - }) - .data("ui-autocomplete")._renderItem = function( ul, item ) { - return $('<li>') - .append('<a>' + escapeHTML(item.displayname) + "<br>" + escapeHTML(item.email) + '</a>' ) - .appendTo( ul ); - }; - } + // FIXME Emailing links is not supported in Gallery + /*if (link && linksAllowed && $('#email').length != 0) { + $('#email').autocomplete({ + minLength: 1, + source: function (search, response) { + $.get(OC.filePath('core', 'ajax', 'share.php'), { + fetch: 'getShareWithEmail', + search: search.term + }, function (result) { + if (result.status == 'success' && result.data.length > 0) { + response(result.data); + } + }); + }, + select: function (event, item) { + $('#email').val(item.item.email); + return false; + } + }) + .data("ui-autocomplete")._renderItem = function (ul, item) { + return $('<li>') + .append('<a>' + escapeHTML(item.displayname) + "<br>" + + escapeHTML(item.email) + '</a>') + .appendTo(ul); + }; + }*/ } else { - html += '<input id="shareWith" type="text" placeholder="'+t('core', 'Resharing is not allowed')+'" style="width:90%;" disabled="disabled"/>'; + html += '<input id="shareWith" type="text" placeholder="' + + t('core', 'Resharing is not allowed') + + '" style="width:90%;" disabled="disabled"/>'; html += '</div>'; dropDownEl = $(html); dropDownEl.appendTo(appendTo); } dropDownEl.attr('data-item-source-name', filename); - $('#dropdown').slideDown(OC.menuSpeed, function() { - OC.Share.droppedDown = true; + $('#dropdown').slideDown(OC.menuSpeed, function () { + Gallery.Share.droppedDown = true; }); - if ($('html').hasClass('lte9')){ + if ($('html').hasClass('lte9')) { $('#dropdown input[placeholder]').placeholder(); } $('#shareWith').focus(); }, - hideDropDown:function(callback) { - OC.Share.currentShares = null; - $('#dropdown').slideUp(OC.menuSpeed, function() { - OC.Share.droppedDown = false; + /** + * + * @param callback + */ + hideDropDown: function (callback) { + this.currentShares = null; + $('#dropdown').slideUp(OC.menuSpeed, function () { + Gallery.Share.droppedDown = false; $('#dropdown').remove(); if (typeof FileActions !== 'undefined') { $('tr').removeClass('mouseOver'); @@ -572,150 +507,25 @@ } }); }, - addShareWith:function(shareType, shareWith, shareWithDisplayName, permissions, possiblePermissions, mailSend, collection) { - var shareItem = { - share_type: shareType, - share_with: shareWith, - share_with_displayname: shareWithDisplayName, - permissions: permissions - }; - if (shareType === OC.Share.SHARE_TYPE_GROUP) { - shareWithDisplayName = shareWithDisplayName + " (" + t('core', 'group') + ')'; - } - if (shareType === OC.Share.SHARE_TYPE_REMOTE) { - shareWithDisplayName = shareWithDisplayName + " (" + t('core', 'remote') + ')'; - } - if (!OC.Share.itemShares[shareType]) { - OC.Share.itemShares[shareType] = []; - } - OC.Share.itemShares[shareType].push(shareWith); - if (collection) { - if (collection.item_type == 'file' || collection.item_type == 'folder') { - var item = collection.path; - } else { - var item = collection.item_source; - } - var collectionList = $('#shareWithList li').filterAttr('data-collection', item); - if (collectionList.length > 0) { - $(collectionList).append(', '+shareWithDisplayName); - } else { - var html = '<li style="clear: both;" data-collection="'+item+'">'+t('core', 'Shared in {item} with {user}', {'item': item, user: shareWithDisplayName})+'</li>'; - $('#shareWithList').prepend(html); - } - } else { - var editChecked = createChecked = updateChecked = deleteChecked = shareChecked = ''; - if (permissions & OC.PERMISSION_CREATE) { - createChecked = 'checked="checked"'; - editChecked = 'checked="checked"'; - } - if (permissions & OC.PERMISSION_UPDATE) { - updateChecked = 'checked="checked"'; - editChecked = 'checked="checked"'; - } - if (permissions & OC.PERMISSION_DELETE) { - deleteChecked = 'checked="checked"'; - editChecked = 'checked="checked"'; - } - if (permissions & OC.PERMISSION_SHARE) { - shareChecked = 'checked="checked"'; - } - var html = '<li style="clear: both;" data-share-type="'+escapeHTML(shareType)+'" data-share-with="'+escapeHTML(shareWith)+'" title="' + escapeHTML(shareWith) + '">'; - var showCrudsButton; - html += '<a href="#" class="unshare"><img class="svg" alt="'+t('core', 'Unshare')+'" title="'+t('core', 'Unshare')+'" src="'+OC.imagePath('core', 'actions/delete')+'"/></a>'; - if (oc_config.enable_avatars === true) { - html += '<div class="avatar"></div>'; - } - html += '<span class="username">' + escapeHTML(shareWithDisplayName) + '</span>'; - var mailNotificationEnabled = $('input:hidden[name=mailNotificationEnabled]').val(); - if (mailNotificationEnabled === 'yes' && shareType !== OC.Share.SHARE_TYPE_REMOTE) { - var checked = ''; - if (mailSend === '1') { - checked = 'checked'; - } - html += '<label><input type="checkbox" class="checkbox checkbox--right" name="mailNotification" class="mailNotification" ' + checked + ' />'+t('core', 'notify by email')+'</label> '; - } - if (oc_appconfig.core.resharingAllowed && (possiblePermissions & OC.PERMISSION_SHARE)) { - html += '<label><input id="canShare-'+escapeHTML(shareWith)+'" type="checkbox" class="checkbox checkbox--right" name="share" class="permissions" '+shareChecked+' data-permissions="'+OC.PERMISSION_SHARE+'" />'+t('core', 'can share')+'</label>'; - } - if (possiblePermissions & OC.PERMISSION_CREATE || possiblePermissions & OC.PERMISSION_UPDATE || possiblePermissions & OC.PERMISSION_DELETE) { - html += '<label><input id="canEdit-'+escapeHTML(shareWith)+'" type="checkbox" class="checkbox checkbox--right" name="edit" class="permissions" '+editChecked+' />'+t('core', 'can edit')+'</label>'; - } - if (shareType !== OC.Share.SHARE_TYPE_REMOTE) { - showCrudsButton = '<a href="#" class="showCruds"><img class="svg" alt="'+t('core', 'access control')+'" src="'+OC.imagePath('core', 'actions/triangle-s')+'"/></a>'; - } - html += '<div class="cruds" style="display:none;">'; - if (possiblePermissions & OC.PERMISSION_CREATE) { - html += '<label><input id="canCreate-' + escapeHTML(shareWith) + '" type="checkbox" class="checkbox checkbox--right" name="create" class="permissions" ' + createChecked + ' data-permissions="' + OC.PERMISSION_CREATE + '"/>' + t('core', 'create') + '</label>'; - } - if (possiblePermissions & OC.PERMISSION_UPDATE) { - html += '<label><input id="canUpdate-' + escapeHTML(shareWith) + '" type="checkbox" class="checkbox checkbox--right" name="update" class="permissions" ' + updateChecked + ' data-permissions="' + OC.PERMISSION_UPDATE + '"/>' + t('core', 'change') + '</label>'; - } - if (possiblePermissions & OC.PERMISSION_DELETE) { - html += '<label><input id="canDelete-' + escapeHTML(shareWith) + '" type="checkbox" class="checkbox checkbox--right" name="delete" class="permissions" ' + deleteChecked + ' data-permissions="' + OC.PERMISSION_DELETE + '"/>' + t('core', 'delete') + '</label>'; - } - html += '</div>'; - html += '</li>'; - html = $(html).appendTo('#shareWithList'); - if (oc_config.enable_avatars === true) { - if (shareType === OC.Share.SHARE_TYPE_USER) { - html.find('.avatar').avatar(escapeHTML(shareWith), 32); - } else { - //Add sharetype to generate different seed if there is a group and use with the same name - html.find('.avatar').imageplaceholder(escapeHTML(shareWith) + ' ' + shareType); - } - } - // insert cruds button into last label element - var lastLabel = html.find('>label:last'); - if (lastLabel.exists()){ - lastLabel.append(showCrudsButton); - } - else{ - html.find('.cruds').before(showCrudsButton); - } - if (!OC.Share.currentShares[shareType]) { - OC.Share.currentShares[shareType] = []; - } - OC.Share.currentShares[shareType].push(shareItem); - } - }, - showLink:function(token, password, itemSource) { - OC.Share.itemShares[OC.Share.SHARE_TYPE_LINK] = true; - $('#linkCheckbox').attr('checked', true); - - //check itemType - var linkSharetype=$('#dropdown').data('item-type'); - - if (! token) { - //fallback to pre token link - var filename = $('tr').filterAttr('data-id', String(itemSource)).data('file'); - var type = $('tr').filterAttr('data-id', String(itemSource)).data('type'); - if ($('#dir').val() == '/') { - var file = $('#dir').val() + filename; - } else { - var file = $('#dir').val() + '/' + filename; - } - file = '/'+OC.currentUser+'/files'+file; - // TODO: use oc webroot ? - var link = parent.location.protocol+'//'+location.host+OC.linkTo('', 'public.php')+'?service=files&'+type+'='+encodeURIComponent(file); - } else { - //TODO add path param when showing a link to file in a subfolder of a public link share - var service=''; - if(linkSharetype === 'folder' || linkSharetype === 'file'){ - service='files'; - }else{ - service=linkSharetype; - } - - // TODO: use oc webroot ? - if (service !== 'files') { - var link = parent.location.protocol+'//'+location.host+OC.linkTo('', 'public.php')+'?service='+service+'&t='+token; - } else { - var link = parent.location.protocol+'//'+location.host+OC.generateUrl('/s/')+token; - } - } - $('#linkText').val(link); - $('#linkText').slideDown(OC.menuSpeed); - $('#linkText').css('display','block'); + /** + * + * @param id + * @param token + * @param password + */ + showLink: function (id, token, password) { + var $linkCheckbox = $('#linkCheckbox'); + this.itemShares[this.SHARE_TYPE_LINK] = true; + $linkCheckbox.attr('checked', true); + $linkCheckbox.attr('data-id', id); + var $linkText = $('#linkText'); + + var link = parent.location.protocol + '//' + location.host + + OC.generateUrl('/apps/' + Gallery.appName + '/s/') + token; + + $linkText.val(link); + $linkText.slideDown(OC.menuSpeed); + $linkText.css('display', 'block'); if (oc_appconfig.core.enforcePasswordForPublicLink === false || password === null) { $('#showPassword+label').show(); } @@ -729,7 +539,10 @@ $('#emailPrivateLink #emailButton').show(); $('#allowPublicUploadWrapper').show(); }, - hideLink:function() { + /** + * + */ + hideLink: function () { $('#linkText').slideUp(OC.menuSpeed); $('#defaultExpireMessage').hide(); $('#showPassword+label').hide(); @@ -738,65 +551,46 @@ $('#emailPrivateLink #emailButton').hide(); $('#allowPublicUploadWrapper').hide(); }, - dirname:function(path) { - return path.replace(/\\/g,'/').replace(/\/[^\/]*$/, ''); - }, - /** - * 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; - }, /** * Displays the expiration date field * - * @param {Date} date current expiration date - * @param {int} [shareTime] share timestamp in seconds, defaults to now + * @param {String} date current expiration date + * @param {Date|Number|String} [shareTime] share timestamp in seconds, defaults to now */ - showExpirationDate:function(date, shareTime) { + showExpirationDate: function (date, shareTime) { + var $expirationDate = $('#expirationDate'); + var $expirationCheckbox = $('#expirationCheckbox'); var now = new Date(); // min date should always be the next day var minDate = new Date(); - minDate.setDate(minDate.getDate()+1); + minDate.setDate(minDate.getDate() + 1); var datePickerOptions = { minDate: minDate, maxDate: null }; // TODO: hack: backend returns string instead of integer - shareTime = OC.Share._parseTime(shareTime); + shareTime = this._parseTime(shareTime); if (_.isNumber(shareTime)) { shareTime = new Date(shareTime * 1000); } if (!shareTime) { shareTime = now; } - $('#expirationCheckbox').attr('checked', true); - $('#expirationDate').val(date); - $('#expirationDate').slideDown(OC.menuSpeed); - $('#expirationDate').css('display','block'); - $('#expirationDate').datepicker({ - dateFormat : 'dd-mm-yy' + $expirationCheckbox.attr('checked', true); + $expirationDate.val(date); + $expirationDate.slideDown(OC.menuSpeed); + $expirationDate.css('display', 'block'); + $expirationDate.datepicker({ + dateFormat: 'dd-mm-yy' }); if (oc_appconfig.core.defaultExpireDateEnforced) { - $('#expirationCheckbox').attr('disabled', true); + $expirationCheckbox.attr('disabled', true); shareTime = OC.Util.stripTime(shareTime).getTime(); // max date is share date + X days - datePickerOptions.maxDate = new Date(shareTime + oc_appconfig.core.defaultExpireDate * 24 * 3600 * 1000); + datePickerOptions.maxDate = + new Date(shareTime + oc_appconfig.core.defaultExpireDate * 24 * 3600 * 1000); } - if(oc_appconfig.core.defaultExpireDateEnabled) { + if (oc_appconfig.core.defaultExpireDateEnabled) { $('#defaultExpireMessage').slideDown(OC.menuSpeed); } $.datepicker.setDefaults(datePickerOptions); @@ -806,7 +600,7 @@ * * @return {String} The expire date */ - getDefaultExpirationDate:function() { + getDefaultExpirationDate: function () { var expireDateString = ''; if (oc_appconfig.core.defaultExpireDateEnabled) { var date = new Date().getTime(); @@ -818,424 +612,635 @@ expireDateString = year + "-" + month + '-' + day + ' 00:00:00'; } return expireDateString; - } - }); - - $(document).ready(function() { + }, + /** + * Loads all shares associated with a path + * + * @param path + * + * @returns {Gallery.Share.Types.ShareInfo|Boolean} + * @private + */ + _loadShares: function (path) { + var data = false; + var url = OC.linkToOCS('apps/files_sharing/api/v1', 2) + 'shares' + '?format=json'; + $.ajax({ + url: url, + type: 'GET', + data: { + path: path, + shared_with_me: true + }, + async: false + }).done(function (result) { + data = result.ocs.data; + $.ajax({ + url: url, + type: 'GET', + data: { + path: path, + reshares: true + }, + async: false + }).done(function (result) { + data = _.union(data, result.ocs.data); + }) - 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: $.map(monthNames, function(v) { return v.slice(0,3)+'.'; }), - dayNames: dayNames, - dayNamesMin: $.map(dayNames, function(v) { return v.slice(0,2); }), - dayNamesShort: $.map(dayNames, function(v) { return v.slice(0,3)+'.'; }), - firstDay: firstDay, - minDate : minDate }); - } - $(document).on('click', 'a.share', function(event) { - event.stopPropagation(); - if ($(this).data('item-type') !== undefined && $(this).data('item') !== undefined) { - var itemType = $(this).data('item-type'); - var itemSource = $(this).data('item'); - var appendTo = $(this).parent().parent(); - var link = false; - var possiblePermissions = $(this).data('possible-permissions'); - if ($(this).data('link') !== undefined && $(this).data('link') == true) { - link = true; + + if (data === false) { + OC.dialogs.alert(t('gallery', 'Error while retrieving shares'), + t('core', 'Error')); + } + + return data; + }, + /** + * + * @param shareId + * @param shareType + * @param shareWith + * @param shareWithDisplayName + * @param permissions + * @param possiblePermissions + * @param mailSend + * + * @private + */ + _addShareWith: function (shareId, shareType, shareWith, shareWithDisplayName, permissions, possiblePermissions, mailSend) { + var shareItem = { + share_id: shareId, + share_type: shareType, + share_with: shareWith, + share_with_displayname: shareWithDisplayName, + permissions: permissions + }; + if (shareType === this.SHARE_TYPE_GROUP) { + shareWithDisplayName = shareWithDisplayName + " (" + t('core', 'group') + ')'; + } + if (shareType === this.SHARE_TYPE_REMOTE) { + shareWithDisplayName = shareWithDisplayName + " (" + t('core', 'remote') + ')'; + } + if (!this.itemShares[shareType]) { + this.itemShares[shareType] = []; + } + this.itemShares[shareType].push(shareWith); + + var editChecked = '', + createChecked = '', + updateChecked = '', + deleteChecked = '', + shareChecked = ''; + if (permissions & OC.PERMISSION_CREATE) { + createChecked = 'checked="checked"'; + editChecked = 'checked="checked"'; + } + if (permissions & OC.PERMISSION_UPDATE) { + updateChecked = 'checked="checked"'; + editChecked = 'checked="checked"'; + } + if (permissions & OC.PERMISSION_DELETE) { + deleteChecked = 'checked="checked"'; + editChecked = 'checked="checked"'; + } + if (permissions & OC.PERMISSION_SHARE) { + shareChecked = 'checked="checked"'; + } + var html = '<li style="clear: both;" ' + + 'data-id="' + escapeHTML(shareId) + '"' + + 'data-share-type="' + escapeHTML(shareType) + '"' + + 'data-share-with="' + escapeHTML(shareWith) + '"' + + 'title="' + escapeHTML(shareWith) + '">'; + var showCrudsButton; + html += + '<a href="#" class="unshare"><img class="svg" alt="' + t('core', 'Unshare') + + '" title="' + t('core', 'Unshare') + '" src="' + + OC.imagePath('core', 'actions/delete') + '"/></a>'; + if (oc_config.enable_avatars === true) { + html += '<div class="avatar"></div>'; + } + html += '<span class="username">' + escapeHTML(shareWithDisplayName) + '</span>'; + var mailNotificationEnabled = $('input:hidden[name=mailNotificationEnabled]').val(); + if (mailNotificationEnabled === 'yes' && + shareType !== this.SHARE_TYPE_REMOTE) { + var checked = ''; + if (mailSend === '1') { + checked = 'checked'; } - if (OC.Share.droppedDown) { - if (itemSource != $('#dropdown').data('item')) { - OC.Share.hideDropDown(function () { - OC.Share.showDropDown(itemType, itemSource, appendTo, link, possiblePermissions); - }); - } else { - OC.Share.hideDropDown(); - } + html += + '<input type="checkbox" class="checkbox checkbox--right" ' + + 'name="mailNotification" class="mailNotification" ' + + checked + ' />'; + html += + '<label>' + t('core', 'notify by email') + '</label>'; + } + if (oc_appconfig.core.resharingAllowed && + (possiblePermissions & OC.PERMISSION_SHARE)) { + html += '<input id="canShare-' + escapeHTML(shareWith) + + '" type="checkbox" class="permissions checkbox checkbox--right" name="share" ' + + shareChecked + ' data-permissions="' + OC.PERMISSION_SHARE + '" />'; + html += '<label for="canShare-' + escapeHTML(shareWith) + '">' + + t('core', 'can share') + '</label>'; + } + if (possiblePermissions & OC.PERMISSION_CREATE || + possiblePermissions & OC.PERMISSION_UPDATE || + possiblePermissions & OC.PERMISSION_DELETE) { + html += '<input id="canEdit-' + escapeHTML(shareWith) + + '" type="checkbox" class="permissions checkbox checkbox--right" name="edit" ' + + editChecked + ' />'; + html += '<label for="canEdit-' + escapeHTML(shareWith) + '">' + + t('core', 'can edit') + '</label>'; + } + if (shareType !== this.SHARE_TYPE_REMOTE) { + showCrudsButton = '<a href="#" class="showCruds"><img class="svg" alt="' + + t('core', 'access control') + '" src="' + + OC.imagePath('core', 'actions/triangle-s') + '"/></a>'; + } + html += '<div class="cruds" style="display:none;">'; + if (possiblePermissions & OC.PERMISSION_CREATE) { + html += '<input id="canCreate-' + escapeHTML(shareWith) + + '" type="checkbox" class="permissions checkbox checkbox--right" name="create" ' + + createChecked + ' data-permissions="' + OC.PERMISSION_CREATE + '"/>'; + html += '<label for="canCreate-' + escapeHTML(shareWith) + '">' + + t('core', 'create') + '</label>'; + } + if (possiblePermissions & OC.PERMISSION_UPDATE) { + html += '<input id="canUpdate-' + escapeHTML(shareWith) + + '" type="checkbox" class="permissions checkbox checkbox--right" name="update" ' + + updateChecked + ' data-permissions="' + OC.PERMISSION_UPDATE + '"/>'; + html += '<label for="canUpdate-' + escapeHTML(shareWith) + '">' + + t('core', 'change') + '</label>'; + } + if (possiblePermissions & OC.PERMISSION_DELETE) { + html += '<input id="canDelete-' + escapeHTML(shareWith) + + '" type="checkbox" class="permissions checkbox checkbox--right" name="delete" ' + + deleteChecked + ' data-permissions="' + OC.PERMISSION_DELETE + '"/>'; + html += '<label for="canDelete-' + escapeHTML(shareWith) + '">' + + t('core', 'delete') + '</label>'; + } + html += '</div>'; + html += '</li>'; + html = $(html).appendTo('#shareWithList'); + if (oc_config.enable_avatars === true) { + if (shareType === this.SHARE_TYPE_USER) { + html.find('.avatar').avatar(escapeHTML(shareWith), 32); } else { - OC.Share.showDropDown(itemType, itemSource, appendTo, link, possiblePermissions); + //Add sharetype to generate different seed if there is a group and use with + // the same name + html.find('.avatar').imageplaceholder( + escapeHTML(shareWith) + ' ' + shareType); } } - }); - - $(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.droppedDown && isMatched && $('#dropdown').has(event.target).length === 0) { - OC.Share.hideDropDown(); + // insert cruds button into last label element + var lastLabel = html.find('>label:last'); + if (lastLabel.exists()) { + lastLabel.append(showCrudsButton); } + else { + html.find('.cruds').before(showCrudsButton); + } + if (!this.currentShares[shareType]) { + this.currentShares[shareType] = []; + } + this.currentShares[shareType].push(shareItem); + }, + /** + * Parses a string to an valid integer (unix timestamp) + * @param time + * @returns {*} + * @internal Only used to work around a bug in the backend + * @private + */ + _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; + } + }; + + Gallery.Share = Share; +})(jQuery, Gallery); + +$(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: $.map(monthNames, function (v) { + return v.slice(0, 3) + '.'; + }), + dayNames: dayNames, + dayNamesMin: $.map(dayNames, function (v) { + return v.slice(0, 2); + }), + dayNamesShort: $.map(dayNames, function (v) { + return v.slice(0, 3) + '.'; + }), + firstDay: firstDay, + minDate: minDate }); + } + $(document).on('click', 'a.share', function (event) { + event.stopPropagation(); + if ($(this).data('item-type') !== undefined && $(this).data('path') !== undefined) { + var itemType = $(this).data('item-type'); + var path = $(this).data('path'); + var appendTo = $(this).parent().parent(); + var link = false; + var possiblePermissions = $(this).data('possible-permissions'); + if ($(this).data('link') !== undefined && $(this).data('link') == true) { + link = true; + } + if (Gallery.Share.droppedDown) { + if (path != $('#dropdown').data('path')) { + Gallery.Share.hideDropDown(function () { + Gallery.Share.showDropDown(itemType, path, appendTo, link, + possiblePermissions); + }); + } else { + Gallery.Share.hideDropDown(); + } + } else { + Gallery.Share.showDropDown(itemType, path, appendTo, link, possiblePermissions); + } + } + }); - $(document).on('click', '#dropdown .showCruds', function() { - $(this).closest('li').find('.cruds').toggle(); - return false; - }); - - $(document).on('click', '#dropdown .unshare', function() { - var $li = $(this).closest('li'); - var itemType = $('#dropdown').data('item-type'); - var itemSource = $('#dropdown').data('item-source'); - var shareType = $li.data('share-type'); - var shareWith = $li.attr('data-share-with'); - var $button = $(this); + $(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 (Gallery.Share.droppedDown && isMatched && + $('#dropdown').has(event.target).length === 0) { + Gallery.Share.hideDropDown(); + } + }); - if (!$button.is('a')) { - $button = $button.closest('a'); - } + $(document).on('click', '#dropdown .showCruds', function () { + $(this).closest('li').find('.cruds').toggle(); + return false; + }); - if ($button.hasClass('icon-loading-small')) { - // deletion in progress - return false; - } - $button.empty().addClass('icon-loading-small'); + $(document).on('click', '#dropdown .unshare', function () { + var $li = $(this).closest('li'); + var shareType = $li.data('share-type'); + var shareWith = $li.attr('data-share-with'); + var shareId = $li.attr('data-id'); + var $button = $(this); - OC.Share.unshare(itemType, itemSource, shareType, shareWith, function() { - $li.remove(); - var index = OC.Share.itemShares[shareType].indexOf(shareWith); - OC.Share.itemShares[shareType].splice(index, 1); - // updated list of shares - OC.Share.currentShares[shareType].splice(index, 1); - $('#dropdown').trigger(new $.Event('sharesChanged', {shares: OC.Share.currentShares})); - OC.Share.updateIcon(itemType, itemSource); - if (typeof OC.Share.statuses[itemSource] === 'undefined') { - $('#expiration').slideUp(OC.menuSpeed); - } - }); + if (!$button.is('a')) { + $button = $button.closest('a'); + } + if ($button.hasClass('icon-loading-small')) { + // deletion in progress return false; + } + $button.empty().addClass('icon-loading-small'); + Gallery.Share.unshare(shareId, function () { + $li.remove(); + var index = Gallery.Share.itemShares[shareType].indexOf(shareWith); + Gallery.Share.itemShares[shareType].splice(index, 1); + // updated list of shares + Gallery.Share.currentShares[shareType].splice(index, 1); }); - $(document).on('change', '#dropdown .permissions', function() { - var li = $(this).closest('li'); - if ($(this).attr('name') == 'edit') { - var checkboxes = $('.permissions', li); - var checked = $(this).is(':checked'); - // Check/uncheck Create, Update, and Delete checkboxes if Edit is checked/unck - $(checkboxes).filter('input[name="create"]').attr('checked', checked); - $(checkboxes).filter('input[name="update"]').attr('checked', checked); - $(checkboxes).filter('input[name="delete"]').attr('checked', checked); - } else { - var checkboxes = $('.permissions', li); - // Uncheck Edit if Create, Update, and Delete are not checked - if (!$(this).is(':checked') - && !$(checkboxes).filter('input[name="create"]').is(':checked') - && !$(checkboxes).filter('input[name="update"]').is(':checked') - && !$(checkboxes).filter('input[name="delete"]').is(':checked')) - { - $(checkboxes).filter('input[name="edit"]').attr('checked', false); + return false; + }); + + $(document).on('change', '#dropdown .permissions', function () { + var $li = $(this).closest('li'); + var checkboxes = $('.permissions', $li); + if ($(this).attr('name') == 'edit') { + var checked = $(this).is(':checked'); + // Check/uncheck Create, Update, and Delete checkboxes if Edit is checked/unck + $(checkboxes).filter('input[name="create"]').attr('checked', checked); + $(checkboxes).filter('input[name="update"]').attr('checked', checked); + $(checkboxes).filter('input[name="delete"]').attr('checked', checked); + } else { + // Uncheck Edit if Create, Update, and Delete are not checked + if (!$(this).is(':checked') + && !$(checkboxes).filter('input[name="create"]').is(':checked') + && !$(checkboxes).filter('input[name="update"]').is(':checked') + && !$(checkboxes).filter('input[name="delete"]').is(':checked')) { + $(checkboxes).filter('input[name="edit"]').attr('checked', false); // Check Edit if Create, Update, or Delete is checked - } else if (($(this).attr('name') == 'create' - || $(this).attr('name') == 'update' - || $(this).attr('name') == 'delete')) - { - $(checkboxes).filter('input[name="edit"]').attr('checked', true); - } + } else if (($(this).attr('name') == 'create' + || $(this).attr('name') == 'update' + || $(this).attr('name') == 'delete')) { + $(checkboxes).filter('input[name="edit"]').attr('checked', true); } - var permissions = OC.PERMISSION_READ; - $(checkboxes).filter(':not(input[name="edit"])').filter(':checked').each(function(index, checkbox) { + } + var permissions = OC.PERMISSION_READ; + $(checkboxes).filter(':not(input[name="edit"])').filter(':checked').each( + function (index, checkbox) { permissions |= $(checkbox).data('permissions'); }); - OC.Share.setPermissions($('#dropdown').data('item-type'), - $('#dropdown').data('item-source'), - li.data('share-type'), - li.attr('data-share-with'), - permissions); - }); - - $(document).on('change', '#dropdown #linkCheckbox', function() { - var $dropDown = $('#dropdown'); - var itemType = $dropDown.data('item-type'); - var itemSource = $dropDown.data('item-source'); - var itemSourceName = $dropDown.data('item-source-name'); - var $loading = $dropDown.find('#link .icon-loading-small'); - var $button = $(this); - if (!$loading.hasClass('hidden')) { - // already in progress - return false; - } + Gallery.Share.setPermissions($li.attr('data-id'), permissions); + }); - if (this.checked) { - // Reset password placeholder - $('#linkPassText').attr('placeholder', t('core', 'Choose a password for the public link')); - // Reset link - $('#linkText').val(''); - $('#showPassword').prop('checked', false); - $('#linkPass').hide(); - $('#sharingDialogAllowPublicUpload').prop('checked', false); - $('#expirationCheckbox').prop('checked', false); - $('#expirationDate').hide(); - var expireDateString = ''; - // Create a link - if (oc_appconfig.core.enforcePasswordForPublicLink === false) { - expireDateString = OC.Share.getDefaultExpirationDate(); - $loading.removeClass('hidden'); - $button.addClass('hidden'); - $button.prop('disabled', true); + $(document).on('change', '#dropdown #linkCheckbox', function () { + var $dropDown = $('#dropdown'); + var path = $dropDown.data('item-source'); + var shareId = $('#linkCheckbox').data('id'); + var shareWith = ''; + var publicUpload = 0; + var $loading = $dropDown.find('#link .icon-loading-small'); + var $button = $(this); + + if (!$loading.hasClass('hidden')) { + // already in progress + return false; + } - OC.Share.share(itemType, itemSource, OC.Share.SHARE_TYPE_LINK, '', OC.PERMISSION_READ, itemSourceName, expireDateString, function(data) { + if (this.checked) { + // Reset password placeholder + $('#linkPassText').attr('placeholder', + t('core', 'Choose a password for the public link')); + // Reset link + $('#linkText').val(''); + $('#showPassword').prop('checked', false); + $('#linkPass').hide(); + $('#sharingDialogAllowPublicUpload').prop('checked', false); + $('#expirationCheckbox').prop('checked', false); + $('#expirationDate').hide(); + var expireDateString = ''; + // Create a link + if (oc_appconfig.core.enforcePasswordForPublicLink === false) { + expireDateString = Gallery.Share.getDefaultExpirationDate(); + $loading.removeClass('hidden'); + $button.addClass('hidden'); + $button.prop('disabled', true); + Gallery.Share.share( + path, + Gallery.Share.SHARE_TYPE_LINK, + shareWith, + publicUpload, + null, + OC.PERMISSION_READ, + function (data) { $loading.addClass('hidden'); $button.removeClass('hidden'); $button.prop('disabled', false); - OC.Share.showLink(data.token, null, itemSource); - $('#dropdown').trigger(new $.Event('sharesChanged', {shares: OC.Share.currentShares})); - OC.Share.updateIcon(itemType, itemSource); + Gallery.Share.showLink(data.id, data.token, null); }); - } else { - $('#linkPass').slideToggle(OC.menuSpeed); - // TODO drop with IE8 drop - if($('html').hasClass('ie8')) { - $('#linkPassText').attr('placeholder', null); - $('#linkPassText').val(''); - } - $('#linkPassText').focus(); - } - if (expireDateString !== '') { - OC.Share.showExpirationDate(expireDateString); - } } else { - // Delete private link - OC.Share.hideLink(); - $('#expiration').slideUp(OC.menuSpeed); - if ($('#linkText').val() !== '') { - $loading.removeClass('hidden'); - $button.addClass('hidden'); - $button.prop('disabled', true); - OC.Share.unshare(itemType, itemSource, OC.Share.SHARE_TYPE_LINK, '', function() { - $loading.addClass('hidden'); - $button.removeClass('hidden'); - $button.prop('disabled', false); - OC.Share.itemShares[OC.Share.SHARE_TYPE_LINK] = false; - $('#dropdown').trigger(new $.Event('sharesChanged', {shares: OC.Share.currentShares})); - OC.Share.updateIcon(itemType, itemSource); - if (typeof OC.Share.statuses[itemSource] === 'undefined') { - $('#expiration').slideUp(OC.menuSpeed); - } - }); - } + $('#linkPass').slideToggle(OC.menuSpeed); + $('#linkPassText').focus(); } - }); - - $(document).on('click', '#dropdown #linkText', function() { - $(this).focus(); - $(this).select(); - }); - - // Handle the Allow Public Upload Checkbox - $(document).on('click', '#sharingDialogAllowPublicUpload', function() { - - // Gather data - var $dropDown = $('#dropdown'); - var allowPublicUpload = $(this).is(':checked'); - var itemType = $dropDown.data('item-type'); - var itemSource = $dropDown.data('item-source'); - var itemSourceName = $dropDown.data('item-source-name'); - var expirationDate = ''; - if ($('#expirationCheckbox').is(':checked') === true) { - expirationDate = $( "#expirationDate" ).val(); + if (expireDateString !== '') { + Gallery.Share.showExpirationDate(expireDateString); } - var permissions = 0; - var $button = $(this); - var $loading = $dropDown.find('#allowPublicUploadWrapper .icon-loading-small'); - - if (!$loading.hasClass('hidden')) { - // already in progress - return false; + } else { + // Delete private link + Gallery.Share.hideLink(); + $('#expiration').slideUp(OC.menuSpeed); + if ($('#linkText').val() !== '') { + $loading.removeClass('hidden'); + $button.addClass('hidden'); + $button.prop('disabled', true); + Gallery.Share.unshare(shareId, function () { + $loading.addClass('hidden'); + $button.removeClass('hidden'); + $button.prop('disabled', false); + Gallery.Share.itemShares[Gallery.Share.SHARE_TYPE_LINK] = false; + }); } + } + }); - // Calculate permissions - if (allowPublicUpload) { - permissions = OC.PERMISSION_UPDATE + OC.PERMISSION_CREATE + OC.PERMISSION_READ; - } else { - permissions = OC.PERMISSION_READ; - } + $(document).on('click', '#dropdown #linkText', function () { + $(this).focus(); + $(this).select(); + }); + + // Handle the Allow Public Upload Checkbox + // FIXME public uploading is not supported in Gallery + /*$(document).on('click', '#sharingDialogAllowPublicUpload', function () { + + // Gather data + var $dropDown = $('#dropdown'); + var allowPublicUpload = $(this).is(':checked'); + var $button = $(this); + var $loading = $dropDown.find('#allowPublicUploadWrapper .icon-loading-small'); + + if (!$loading.hasClass('hidden')) { + // already in progress + return false; + } + + // Update the share information + $button.addClass('hidden'); + $button.prop('disabled', true); + $loading.removeClass('hidden'); + //(path, shareType, shareWith, publicUpload, password, permissions) + $.ajax({ + url: OC.linkToOCS('apps/files_sharing/api/v1', 2) + 'shares/' + shareId + + '?format=json', + type: 'PUT', + data: { + publicUpload: allowPublicUpload + } + }).done(function () { + $loading.addClass('hidden'); + $button.removeClass('hidden'); + $button.prop('disabled', false); + }); + });*/ + + $(document).on('click', '#dropdown #showPassword', function () { + $('#linkPass').slideToggle(OC.menuSpeed); + if (!$('#showPassword').is(':checked')) { + var shareId = $('#linkCheckbox').data('id'); + var $loading = $('#showPassword .icon-loading-small'); - // Update the share information - $button.addClass('hidden'); - $button.prop('disabled', true); $loading.removeClass('hidden'); - OC.Share.share(itemType, itemSource, OC.Share.SHARE_TYPE_LINK, '', permissions, itemSourceName, expirationDate, function(data) { + $.ajax({ + url: OC.linkToOCS('apps/files_sharing/api/v1', 2) + 'shares/' + shareId + + '?format=json', + type: 'PUT', + data: { + password: null + } + }).done(function () { $loading.addClass('hidden'); - $button.removeClass('hidden'); - $button.prop('disabled', false); + $('#linkPassText').attr('placeholder', + t('core', 'Choose a password for the public link')); }); - }); + } else { + $('#linkPassText').focus(); + } + }); - $(document).on('click', '#dropdown #showPassword', function() { - $('#linkPass').slideToggle(OC.menuSpeed); - if (!$('#showPassword').is(':checked') ) { - var itemType = $('#dropdown').data('item-type'); - var itemSource = $('#dropdown').data('item-source'); - var itemSourceName = $('#dropdown').data('item-source-name'); - var allowPublicUpload = $('#sharingDialogAllowPublicUpload').is(':checked'); - var permissions = 0; - var $loading = $('#showPassword .icon-loading-small'); + $(document).on('focusout keyup', '#dropdown #linkPassText', function (event) { + var linkPassText = $('#linkPassText'); + if (linkPassText.val() != '' && (event.type == 'focusout' || event.keyCode == 13)) { + var dropDown = $('#dropdown'); + var $loading = dropDown.find('#linkPass .icon-loading-small'); + var shareId = $('#linkCheckbox').data('id'); - // Calculate permissions - if (allowPublicUpload) { - permissions = OC.PERMISSION_UPDATE + OC.PERMISSION_CREATE + OC.PERMISSION_READ; - } else { - permissions = OC.PERMISSION_READ; + $loading.removeClass('hidden'); + $.ajax({ + url: OC.linkToOCS('apps/files_sharing/api/v1', 2) + 'shares/' + shareId + + '?format=json', + type: 'PUT', + data: { + password: $('#linkPassText').val() } + }).done(function (data) { + $loading.addClass('hidden'); + linkPassText.val(''); + linkPassText.attr('placeholder', t('core', 'Password protected')); - $loading.removeClass('hidden'); - OC.Share.share(itemType, itemSource, OC.Share.SHARE_TYPE_LINK, '', permissions, itemSourceName).then(function() { - $loading.addClass('hidden'); - $('#linkPassText').attr('placeholder', t('core', 'Choose a password for the public link')); - }); - } else { - $('#linkPassText').focus(); - } - }); - - $(document).on('focusout keyup', '#dropdown #linkPassText', function(event) { - var linkPassText = $('#linkPassText'); - if ( linkPassText.val() != '' && (event.type == 'focusout' || event.keyCode == 13) ) { - var allowPublicUpload = $('#sharingDialogAllowPublicUpload').is(':checked'); - var dropDown = $('#dropdown'); - var itemType = dropDown.data('item-type'); - var itemSource = dropDown.data('item-source'); - var itemSourceName = $('#dropdown').data('item-source-name'); - var permissions = 0; - var $loading = dropDown.find('#linkPass .icon-loading-small'); - - // Calculate permissions - if (allowPublicUpload) { - permissions = OC.PERMISSION_UPDATE + OC.PERMISSION_CREATE + OC.PERMISSION_READ; - } else { - permissions = OC.PERMISSION_READ; + if (oc_appconfig.core.enforcePasswordForPublicLink) { + Gallery.Share.showLink(data.id, data.token, "password set"); } + }).fail(function (xhr) { + var result = xhr.responseJSON; + $loading.addClass('hidden'); + linkPassText.val(''); + linkPassText.attr('placeholder', result.data.message); + }); + } + }); - var expireDateString = OC.Share.getDefaultExpirationDate(); - - $loading.removeClass('hidden'); - OC.Share.share(itemType, itemSource, OC.Share.SHARE_TYPE_LINK, $('#linkPassText').val(), permissions, itemSourceName, expireDateString, function(data) { - $loading.addClass('hidden'); - linkPassText.val(''); - linkPassText.attr('placeholder', t('core', 'Password protected')); - - if (oc_appconfig.core.enforcePasswordForPublicLink) { - OC.Share.showLink(data.token, "password set", itemSource); - OC.Share.updateIcon(itemType, itemSource); - } - $('#dropdown').trigger(new $.Event('sharesChanged', {shares: OC.Share.currentShares})); - }, function(result) { - $loading.addClass('hidden'); - linkPassText.val(''); - linkPassText.attr('placeholder', result.data.message); - }); - - if (expireDateString !== '') { - OC.Share.showExpirationDate(expireDateString); + $(document).on('click', '#dropdown #expirationCheckbox', function () { + if (this.checked) { + Gallery.Share.showExpirationDate(''); + } else { + var shareId = $('#linkCheckbox').data('id'); + $.ajax({ + url: OC.linkToOCS('apps/files_sharing/api/v1', 2) + 'shares/' + shareId + + '?format=json', + type: 'PUT', + data: { + expireDate: '' } - } - }); - - $(document).on('click', '#dropdown #expirationCheckbox', function() { - if (this.checked) { - OC.Share.showExpirationDate(''); - } else { - var itemType = $('#dropdown').data('item-type'); - var itemSource = $('#dropdown').data('item-source'); - $.post(OC.filePath('core', 'ajax', 'share.php'), { action: 'setExpirationDate', itemType: itemType, itemSource: itemSource, date: '' }, function(result) { - if (!result || result.status !== 'success') { - OC.dialogs.alert(t('core', 'Error unsetting expiration date'), t('core', 'Error')); - } - $('#expirationDate').slideUp(OC.menuSpeed); - if (oc_appconfig.core.defaultExpireDateEnforced === false) { - $('#defaultExpireMessage').slideDown(OC.menuSpeed); - } - }); - } - }); - - $(document).on('change', '#dropdown #expirationDate', function() { - var itemType = $('#dropdown').data('item-type'); - var itemSource = $('#dropdown').data('item-source'); - - $(this).tipsy('hide'); - $(this).removeClass('error'); - - $.post(OC.filePath('core', 'ajax', 'share.php'), { action: 'setExpirationDate', itemType: itemType, itemSource: itemSource, date: $(this).val() }, function(result) { - if (!result || result.status !== 'success') { - var expirationDateField = $('#dropdown #expirationDate'); - if (!result.data.message) { - expirationDateField.attr('original-title', t('core', 'Error setting expiration date')); - } else { - expirationDateField.attr('original-title', result.data.message); - } - expirationDateField.tipsy({gravity: 'n'}); - expirationDateField.tipsy('show'); - expirationDateField.addClass('error'); - } else { - if (oc_appconfig.core.defaultExpireDateEnforced === 'no') { - $('#defaultExpireMessage').slideUp(OC.menuSpeed); - } + }).done(function () { + $('#expirationDate').slideUp(OC.menuSpeed); + if (oc_appconfig.core.defaultExpireDateEnforced === false) { + $('#defaultExpireMessage').slideDown(OC.menuSpeed); } + }).fail(function () { + OC.dialogs.alert(t('core', 'Error unsetting expiration date'), + t('core', 'Error')); }); - }); + } + }); + $(document).on('change', '#dropdown #expirationDate', function () { + var shareId = $('#linkCheckbox').data('id'); - $(document).on('submit', '#dropdown #emailPrivateLink', function(event) { - event.preventDefault(); - var link = $('#linkText').val(); - var itemType = $('#dropdown').data('item-type'); - var itemSource = $('#dropdown').data('item-source'); - var file = $('tr').filterAttr('data-id', String(itemSource)).data('file'); - var email = $('#email').val(); - var expirationDate = ''; - if ( $('#expirationCheckbox').is(':checked') === true ) { - expirationDate = $( "#expirationDate" ).val(); - } - if (email != '') { - $('#email').prop('disabled', true); - $('#email').val(t('core', 'Sending ...')); - $('#emailButton').prop('disabled', true); + $(this).tooltip('hide'); + $(this).removeClass('error'); - $.post(OC.filePath('core', 'ajax', 'share.php'), { action: 'email', toaddress: email, link: link, itemType: itemType, itemSource: itemSource, file: file, expiration: expirationDate}, - function(result) { - $('#email').prop('disabled', false); - $('#emailButton').prop('disabled', false); - if (result && result.status == 'success') { - $('#email').css('font-weight', 'bold').val(t('core','Email sent')); - setTimeout(function() { - $('#email').css('font-weight', 'normal').val(''); - }, 2000); - } else { - OC.dialogs.alert(result.data.message, t('core', 'Error while sharing')); - } - }); + $.ajax({ + url: OC.linkToOCS('apps/files_sharing/api/v1', 2) + 'shares/' + shareId + + '?format=json', + type: 'PUT', + data: { + expireDate: $(this).val() } - }); - - $(document).on('click', '#dropdown input[name=mailNotification]', function() { - var $li = $(this).closest('li'); - var itemType = $('#dropdown').data('item-type'); - var itemSource = $('#dropdown').data('item-source'); - var action = ''; - if (this.checked) { - action = 'informRecipients'; + }).done(function () { + if (oc_appconfig.core.defaultExpireDateEnforced === 'no') { + $('#defaultExpireMessage').slideUp(OC.menuSpeed); + } + }).fail(function (xhr) { + var result = xhr.responseJSON; + var expirationDateField = $('#dropdown #expirationDate'); + if (result && !result.ocs.meta.message) { + expirationDateField.attr('original-title', + t('core', 'Error setting expiration date')); } else { - action = 'informRecipientsDisabled'; + expirationDateField.attr('original-title', result.ocs.meta.message); } - - var shareType = $li.data('share-type'); - var shareWith = $li.attr('data-share-with'); - - $.post(OC.filePath('core', 'ajax', 'share.php'), {action: action, recipient: shareWith, shareType: shareType, itemSource: itemSource, itemType: itemType}, function(result) { - if (result.status !== 'success') { - OC.dialogs.alert(t('core', result.data.message), t('core', 'Warning')); - } - }); - + expirationDateField.tooltip({placement: 'top'}); + expirationDateField.tooltip('show'); + expirationDateField.addClass('error'); }); - }); -})(OC); + // FIXME Emailing links is not supported in Gallery + /*$(document).on('submit', '#dropdown #emailPrivateLink', function (event) { + event.preventDefault(); + var link = $('#linkText').val(); + var itemType = $('#dropdown').data('item-type'); + var itemSource = $('#dropdown').data('item-source'); + var file = $('tr').filterAttr('data-id', String(itemSource)).data('file'); + var email = $('#email').val(); + var expirationDate = ''; + if ($('#expirationCheckbox').is(':checked') === true) { + expirationDate = $("#expirationDate").val(); + } + if (email != '') { + $('#email').prop('disabled', true); + $('#email').val(t('core', 'Sending ...')); + $('#emailButton').prop('disabled', true); + + $.post(OC.filePath('core', 'ajax', 'share.php'), { + action: 'email', + toaddress: email, + link: link, + itemType: itemType, + itemSource: itemSource, + file: file, + expiration: expirationDate + }, + function (result) { + $('#email').prop('disabled', false); + $('#emailButton').prop('disabled', false); + if (result && result.status == 'success') { + $('#email').css('font-weight', 'bold').val(t('core', 'Email sent')); + setTimeout(function () { + $('#email').css('font-weight', 'normal').val(''); + }, 2000); + } else { + OC.dialogs.alert(result.data.message, t('core', 'Error while sharing')); + } + }); + } + });*/ + + // FIXME Emailing links is not supported in Gallery + /*$(document).on('click', '#dropdown input[name=mailNotification]', function () { + var $li = $(this).closest('li'); + var itemType = $('#dropdown').data('item-type'); + var itemSource = $('#dropdown').data('item-source'); + var action = ''; + if (this.checked) { + action = 'informRecipients'; + } else { + action = 'informRecipientsDisabled'; + } + + var shareType = $li.data('share-type'); + var shareWith = $li.attr('data-share-with'); + + $.post(OC.filePath('core', 'ajax', 'share.php'), { + action: action, + recipient: shareWith, + shareType: shareType, + itemSource: itemSource, + itemType: itemType + }, function (result) { + if (result.status !== 'success') { + OC.dialogs.alert(t('core', result.data.message), t('core', 'Warning')); + } + }); + + });*/ +}); diff --git a/templates/part.content.php b/templates/part.content.php index 7b019ae8..a1a92ce8 100644 --- a/templates/part.content.php +++ b/templates/part.content.php @@ -9,7 +9,6 @@ script( $_['appName'], [ 'app', - 'vendor/owncloud/share', 'gallery', 'galleryutility', 'galleryconfig', @@ -22,6 +21,7 @@ script( 'thumbnail', 'vendor/modified-eventsource-polyfill/eventsource-polyfill', 'eventsource', + 'vendor/owncloud/share', 'vendor/commonmark/dist/commonmark.min', 'vendor/dompurify/src/purify', 'vendor/bigshot/bigshot-compressed', |