From e03248ec731f918d362c3c37193379b162495bc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Molakvo=C3=A6?= Date: Wed, 16 Nov 2022 12:19:35 +0100 Subject: [PATCH] Fix date handling and saving MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: John Molakvoæ --- .../src/components/SharingEntry.vue | 2 +- .../src/components/SharingEntryLink.vue | 27 +++++++++----- apps/files_sharing/src/mixins/SharesMixin.js | 35 +++++++++++++++---- apps/files_sharing/src/models/Share.js | 4 +-- 4 files changed, 50 insertions(+), 18 deletions(-) diff --git a/apps/files_sharing/src/components/SharingEntry.vue b/apps/files_sharing/src/components/SharingEntry.vue index 7cc283e705c29..44d723bc0d7e1 100644 --- a/apps/files_sharing/src/components/SharingEntry.vue +++ b/apps/files_sharing/src/components/SharingEntry.vue @@ -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" diff --git a/apps/files_sharing/src/components/SharingEntryLink.vue b/apps/files_sharing/src/components/SharingEntryLink.vue index e1118e680c07f..e0bcb23ca2e97 100644 --- a/apps/files_sharing/src/components/SharingEntryLink.vue +++ b/apps/files_sharing/src/components/SharingEntryLink.vue @@ -218,7 +218,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" @@ -317,6 +317,7 @@ import SharePermissionsEditor from './SharePermissionsEditor' import GeneratePassword from '../utils/GeneratePassword' import Share from '../models/Share' import SharesMixin from '../mixins/SharesMixin' +import { showError } from '@nextcloud/dialogs' export default { name: 'SharingEntryLink', @@ -427,7 +428,7 @@ export default { defaultExpirationDate = new Date() } this.share.state.expiration = enabled - ? defaultExpirationDate + ? this.formatDateToString(defaultExpirationDate) : '' console.debug('Expiration date status', enabled, this.share.expireDate) }, @@ -435,7 +436,7 @@ export default { 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)) } return null }, @@ -620,7 +621,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() @@ -687,7 +688,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, @@ -698,10 +699,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) + 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 @@ -728,8 +731,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)) { diff --git a/apps/files_sharing/src/mixins/SharesMixin.js b/apps/files_sharing/src/mixins/SharesMixin.js index cdedd213affeb..56941494f5b6a 100644 --- a/apps/files_sharing/src/mixins/SharesMixin.js +++ b/apps/files_sharing/src/mixins/SharesMixin.js @@ -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], @@ -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) { + // 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') }, diff --git a/apps/files_sharing/src/models/Share.js b/apps/files_sharing/src/models/Share.js index bc35cefb1a7f4..9b1535184a042 100644 --- a/apps/files_sharing/src/models/Share.js +++ b/apps/files_sharing/src/models/Share.js @@ -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 */ @@ -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) {