<!-- 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>
: 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
}
},
+ /**
+ * 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
*/
* 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
}
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}`)
}
},
},
/**
* 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