Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix sharing expiration date handling and saving #35207

Merged
merged 1 commit into from
Nov 16, 2022
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
12 changes: 5 additions & 7 deletions apps/files_sharing/src/components/SharingEntry.vue
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@
:hide-label="true"
:class="{ error: errors.expireDate}"
:disabled="saving"
:value="share.expireDate"
:value="new Date(share.expireDate)"
type="date"
:min="dateTomorrow"
:max="dateMaxEnforced"
Expand Down Expand Up @@ -149,7 +149,7 @@ import NcActionInput from '@nextcloud/vue/dist/Components/NcActionInput'
import NcActionTextEditable from '@nextcloud/vue/dist/Components/NcActionTextEditable'
import Tooltip from '@nextcloud/vue/dist/Directives/Tooltip'

import SharesMixin from '../mixins/SharesMixin'
import SharesMixin from '../mixins/SharesMixin.js'

export default {
name: 'SharingEntry',
Expand Down Expand Up @@ -374,12 +374,10 @@ export default {
return this.config.isDefaultInternalExpireDateEnforced || !!this.share.expireDate
},
set(enabled) {
let defaultExpirationDate = this.config.defaultInternalExpirationDate
if (!defaultExpirationDate) {
defaultExpirationDate = new Date()
}
const defaultExpirationDate = this.config.defaultInternalExpirationDate
|| new Date(new Date().setDate(new Date().getDate() + 1))
this.share.expireDate = enabled
? defaultExpirationDate
? this.formatDateToString(defaultExpirationDate)
: ''
console.debug('Expiration date status', enabled, this.share.expireDate)
},
Expand Down
50 changes: 29 additions & 21 deletions apps/files_sharing/src/components/SharingEntryLink.vue
Original file line number Diff line number Diff line change
Expand Up @@ -97,14 +97,15 @@
{{ t('files_sharing', 'Expiration date (enforced)') }}
</NcActionText>
<NcActionInput v-if="pendingExpirationDate"
v-model="share.expireDate"
class="share-link-expire-date"
:disabled="saving"
:is-native-picker="true"
:hide-label="true"
:value="new Date(share.expireDate)"
type="date"
:min="dateTomorrow"
:max="dateMaxEnforced">
:max="dateMaxEnforced"
@input="onExpirationChange">
<!-- let's not submit when picked, the user
might want to still edit or copy the password -->
{{ t('files_sharing', 'Enter a date') }}
Expand Down Expand Up @@ -218,7 +219,7 @@
class="share-link-expire-date"
:class="{ error: errors.expireDate}"
:disabled="saving"
:value="share.expireDate"
:value="new Date(share.expireDate)"
type="date"
:min="dateTomorrow"
:max="dateMaxEnforced"
Expand Down Expand Up @@ -298,6 +299,7 @@

<script>
import { generateUrl } from '@nextcloud/router'
import { showError } from '@nextcloud/dialogs'
import { Type as ShareTypes } from '@nextcloud/sharing'
import Vue from 'vue'

Expand All @@ -312,11 +314,11 @@ import NcActions from '@nextcloud/vue/dist/Components/NcActions'
import NcAvatar from '@nextcloud/vue/dist/Components/NcAvatar'
import Tooltip from '@nextcloud/vue/dist/Directives/Tooltip'

import ExternalShareAction from './ExternalShareAction'
import SharePermissionsEditor from './SharePermissionsEditor'
import GeneratePassword from '../utils/GeneratePassword'
import Share from '../models/Share'
import SharesMixin from '../mixins/SharesMixin'
import ExternalShareAction from './ExternalShareAction.vue'
import SharePermissionsEditor from './SharePermissionsEditor.vue'
import GeneratePassword from '../utils/GeneratePassword.js'
import Share from '../models/Share.js'
import SharesMixin from '../mixins/SharesMixin.js'

export default {
name: 'SharingEntryLink',
Expand Down Expand Up @@ -422,20 +424,18 @@ export default {
|| !!this.share.expireDate
},
set(enabled) {
let defaultExpirationDate = this.config.defaultExpirationDate
if (!defaultExpirationDate) {
defaultExpirationDate = new Date()
}
this.share.state.expiration = enabled
? defaultExpirationDate
const defaultExpirationDate = this.config.defaultExpirationDate
|| new Date(new Date().setDate(new Date().getDate() + 1))
this.share.expireDate = enabled
? this.formatDateToString(defaultExpirationDate)
: ''
console.debug('Expiration date status', enabled, this.share.expireDate)
},
},

dateMaxEnforced() {
if (this.config.isDefaultExpireDateEnforced) {
return new Date(new Date().setDate(new Date().getDate() + 1 + this.config.defaultExpireDate))
return new Date(new Date().setDate(new Date().getDate() + this.config.defaultExpireDate))
skjnldsv marked this conversation as resolved.
Show resolved Hide resolved
}
return null
},
Expand Down Expand Up @@ -620,7 +620,7 @@ export default {
if (this.config.isDefaultExpireDateEnforced) {
// default is empty string if not set
// expiration is the share object key, not expireDate
shareDefaults.expiration = this.config.defaultExpirationDate
shareDefaults.expiration = this.formatDateToString(this.config.defaultExpirationDate)
}
if (this.config.enableLinkPasswordByDefault) {
shareDefaults.password = await GeneratePassword()
Expand Down Expand Up @@ -687,7 +687,7 @@ export default {
this.errors = {}

const path = (this.fileInfo.path + '/' + this.fileInfo.name).replace('//', '/')
const newShare = await this.createShare({
const options = {
path,
shareType: ShareTypes.SHARE_TYPE_LINK,
password: share.password,
Expand All @@ -698,10 +698,12 @@ export default {
// Todo: We also need to fix the createShare method in
// lib/Controller/ShareAPIController.php to allow file drop
// (currently not supported on create, only update)
})
}

this.open = false
console.debug('Creating link share with options', options)
skjnldsv marked this conversation as resolved.
Show resolved Hide resolved
const newShare = await this.createShare(options)

this.open = false
console.debug('Link share created', newShare)

// if share already exists, copy link directly on next tick
Expand All @@ -728,8 +730,14 @@ export default {
component.copyLink()
}

} catch ({ response }) {
const message = response.data.ocs.meta.message
} catch (data) {
const message = data?.response?.data?.ocs?.meta?.message
if (!message) {
showError(t('sharing', 'Error while creating the share'))
console.error(data)
return
}

if (message.match(/password/i)) {
this.onSyncError('password', message)
} else if (message.match(/date/i)) {
Expand Down
41 changes: 33 additions & 8 deletions apps/files_sharing/src/mixins/SharesMixin.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@
*
*/

import { getCurrentUser } from '@nextcloud/auth'
// eslint-disable-next-line import/no-unresolved, node/no-missing-import
import PQueue from 'p-queue'
import debounce from 'debounce'

import Share from '../models/Share'
import SharesRequests from './ShareRequests'
import ShareTypes from './ShareTypes'
import Config from '../services/ConfigService'
import { getCurrentUser } from '@nextcloud/auth'
import Share from '../models/Share.js'
import SharesRequests from './ShareRequests.js'
import ShareTypes from './ShareTypes.js'
import Config from '../services/ConfigService.js'

export default {
mixins: [SharesRequests, ShareTypes],
Expand Down Expand Up @@ -150,13 +150,36 @@ export default {
return true
},

/**
* @param {string} date a date with YYYY-MM-DD format
* @return {Date} date
*/
parseDateString(date) {
if (!date) {
return
}
const regex = /([0-9]{4}-[0-9]{2}-[0-9]{2})/i
return new Date(date.match(regex)?.pop())
},

/**
* @param {Date} date
* @return {string} date a date with YYYY-MM-DD format
*/
formatDateToString(date) {
skjnldsv marked this conversation as resolved.
Show resolved Hide resolved
// Force utc time. Drop time information to be timezone-less
const utcDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()))
// Format to YYYY-MM-DD
return utcDate.toISOString().split('T')[0]
},

/**
* Save given value to expireDate and trigger queueUpdate
*
* @param {Date} date
*/
onExpirationChange(date) {
this.share.expireDate = date
this.share.expireDate = this.formatDateToString(date)
this.queueUpdate('expireDate')
},

Expand Down Expand Up @@ -258,9 +281,11 @@ export default {
this.saving = false
}
})
} else {
console.error('Cannot update share.', this.share, 'No valid id')
return
}

// This share does not exists on the server yet
console.debug('Updated local share', this.share)
},

/**
Expand Down
4 changes: 2 additions & 2 deletions apps/files_sharing/src/models/Share.js
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ export default class Share {
/**
* Get the expiration date
*
* @return {Date|null}
* @return {string} date with YYYY-MM-DD format
* @readonly
* @memberof Share
*/
Expand All @@ -261,7 +261,7 @@ export default class Share {
/**
* Set the expiration date
*
* @param {Date|null} date the share expiration date
* @param {string} date the share expiration date with YYYY-MM-DD format
* @memberof Share
*/
set expireDate(date) {
Expand Down
4 changes: 2 additions & 2 deletions dist/files_sharing-files_sharing_tab.js

Large diffs are not rendered by default.

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

Large diffs are not rendered by default.