Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions apps/files_sharing/js/dist/files_sharing_tab.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion apps/files_sharing/js/dist/files_sharing_tab.js.map

Large diffs are not rendered by default.

34 changes: 32 additions & 2 deletions apps/files_sharing/src/components/SharingEntryLink.vue
Original file line number Diff line number Diff line change
Expand Up @@ -198,9 +198,9 @@
<!-- password protected by Talk -->
<ActionCheckbox v-if="isPasswordProtectedByTalkAvailable"
:checked.sync="isPasswordProtectedByTalk"
:disabled="saving"
:disabled="!canTogglePasswordProtectedByTalkAvailable || saving"
class="share-link-password-talk-checkbox"
@change="queueUpdate('sendPasswordByTalk')">
@change="onPasswordProtectedByTalkChange">
{{ t('files_sharing', 'Video verification') }}
</ActionCheckbox>

Expand Down Expand Up @@ -476,6 +476,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
Expand Down Expand Up @@ -787,6 +801,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
*/
Expand Down
14 changes: 4 additions & 10 deletions apps/files_sharing/src/mixins/ShareRequests.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand All @@ -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}`)
}
},
},
Expand Down
29 changes: 20 additions & 9 deletions apps/files_sharing/src/mixins/SharesMixin.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -288,6 +291,14 @@ export default {
}
break
}
case 'sendPasswordByTalk': {
// show error
this.$set(this.errors, property, message)

// Restore previous state
this.share.sendPasswordByTalk = !this.share.sendPasswordByTalk
break
}
}
},

Expand Down