diff --git a/apps/files_sharing/src/components/SharingEntryLink.vue b/apps/files_sharing/src/components/SharingEntryLink.vue index 912825b35d..50d731ca31 100644 --- a/apps/files_sharing/src/components/SharingEntryLink.vue +++ b/apps/files_sharing/src/components/SharingEntryLink.vue @@ -198,9 +198,9 @@ + @change="onPasswordProtectedByTalkChange"> {{ t('files_sharing', 'Video verification') }} @@ -481,6 +481,20 @@ export default { : false }, + canTogglePasswordProtectedByTalkAvailable() { + if (!this.isPasswordProtected) { + // Makes no sense + return false + } else if (this.isEmailShareType && !this.hasUnsavedPassword) { + // For email shares we need a new password in order to enable or + // disable + return false + } + + // Anything else should be fine + return true + }, + /** * Pending data. * If the share still doesn't have an id, it is not synced @@ -792,6 +806,22 @@ export default { } }, + /** + * Update the password along with "sendPasswordByTalk". + * + * If the password was modified the new password is sent; otherwise + * updating a mail share would fail, as in that case it is required that + * a new password is set when enabling or disabling + * "sendPasswordByTalk". + */ + onPasswordProtectedByTalkChange() { + if (this.hasUnsavedPassword) { + this.share.password = this.share.newPassword.trim() + } + + this.queueUpdate('sendPasswordByTalk', 'password') + }, + /** * Save potential changed data on menu close */ diff --git a/apps/files_sharing/src/mixins/ShareRequests.js b/apps/files_sharing/src/mixins/ShareRequests.js index bad59da659..bdc9a566a1 100644 --- a/apps/files_sharing/src/mixins/ShareRequests.js +++ b/apps/files_sharing/src/mixins/ShareRequests.js @@ -88,17 +88,11 @@ export default { * Update a share * * @param {number} id share id - * @param {Object} data destructuring object - * @param {string} data.property property to update - * @param {any} data.value value to set + * @param {Object} properties key-value object of the properties to update */ - async updateShare(id, { property, value }) { + async updateShare(id, properties) { try { - // ocs api requires x-www-form-urlencoded - const data = new URLSearchParams() - data.append(property, value) - - const request = await axios.put(shareUrl + `/${id}`, { [property]: value }, headers) + const request = await axios.put(shareUrl + `/${id}`, properties, headers) if (!('ocs' in request.data)) { throw request } @@ -107,7 +101,7 @@ export default { console.error('Error while updating share', error) OC.Notification.showTemporary(t('files_sharing', 'Error updating the share'), { type: 'error' }) const message = error.response.data.ocs.meta.message - throw new Error(`${property}, ${message}`) + throw new Error(`${Object.keys(properties)}, ${message}`) } }, }, diff --git a/apps/files_sharing/src/mixins/SharesMixin.js b/apps/files_sharing/src/mixins/SharesMixin.js index e19af48bc7..72fec9e122 100644 --- a/apps/files_sharing/src/mixins/SharesMixin.js +++ b/apps/files_sharing/src/mixins/SharesMixin.js @@ -224,31 +224,34 @@ export default { /** * Send an update of the share to the queue * - * @param {string} property the property to sync + * @param {string} propertyNames the properties to sync */ - queueUpdate(property) { + queueUpdate(...propertyNames) { + if (propertyNames.length === 0) { + // Nothing to update + return + } + if (this.share.id) { + const properties = {} // force value to string because that is what our // share api controller accepts - const value = this.share[property].toString() + propertyNames.map(p => (properties[p] = this.share[p].toString())) this.updateQueue.add(async() => { this.saving = true this.errors = {} try { - await this.updateShare(this.share.id, { - property, - value, - }) + await this.updateShare(this.share.id, properties) // clear any previous errors - this.$delete(this.errors, property) + this.$delete(this.errors, propertyNames[0]) // reset password state after sync this.$delete(this.share, 'newPassword') } catch ({ message }) { if (message && message !== '') { - this.onSyncError(property, message) + this.onSyncError(propertyNames[0], message) } } finally { this.saving = false