Skip to content

Commit cf5bf30

Browse files
authored
Merge pull request #33915 from nextcloud/enh/33914-replace_expiration_date_picker_with_native_date_picker
Replace vue2-datepicker with native date picker for share expiration dates
2 parents 00485ef + 1eac730 commit cf5bf30

7 files changed

Lines changed: 68 additions & 103 deletions

File tree

apps/files_sharing/src/components/SharingEntry.vue

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -95,20 +95,15 @@
9595
</NcActionCheckbox>
9696
<NcActionInput v-if="hasExpirationDate"
9797
ref="expireDate"
98-
v-tooltip.auto="{
99-
content: errors.expireDate,
100-
show: errors.expireDate,
101-
trigger: 'manual'
102-
}"
98+
:is-native-picker="true"
99+
:hide-label="true"
103100
:class="{ error: errors.expireDate}"
104101
:disabled="saving"
105-
:lang="lang"
106102
:value="share.expireDate"
107-
value-type="format"
108-
icon="icon-calendar-dark"
109103
type="date"
110-
:disabled-date="disabledDate"
111-
@update:value="onExpirationChange">
104+
:min="dateTomorrow"
105+
:max="dateMaxEnforced"
106+
@input="onExpirationChange">
112107
{{ t('files_sharing', 'Enter a date') }}
113108
</NcActionInput>
114109

@@ -380,21 +375,20 @@ export default {
380375
},
381376
set(enabled) {
382377
this.share.expireDate = enabled
383-
? this.config.defaultInternalExpirationDateString !== ''
384-
? this.config.defaultInternalExpirationDateString
385-
: moment().format('YYYY-MM-DD')
378+
? this.config.defaultInternalExpirationDate !== ''
379+
? this.config.defaultInternalExpirationDate
380+
: new Date()
386381
: ''
387382
},
388383
},
389384
390385
dateMaxEnforced() {
391-
if (!this.isRemote) {
392-
return this.config.isDefaultInternalExpireDateEnforced
393-
&& moment().add(1 + this.config.defaultInternalExpireDate, 'days')
394-
} else {
395-
return this.config.isDefaultRemoteExpireDateEnforced
396-
&& moment().add(1 + this.config.defaultRemoteExpireDate, 'days')
386+
if (!this.isRemote && this.config.isDefaultInternalExpireDateEnforced) {
387+
return new Date(new Date().setDate(new Date().getDate() + 1 + this.config.defaultInternalExpireDate))
388+
} else if (this.config.isDefaultRemoteExpireDateEnforced) {
389+
return new Date(new Date().setDate(new Date().getDate() + 1 + this.config.defaultRemoteExpireDate))
397390
}
391+
return null
398392
},
399393
400394
/**

apps/files_sharing/src/components/SharingEntryLink.vue

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -98,20 +98,13 @@
9898
</NcActionText>
9999
<NcActionInput v-if="pendingExpirationDate"
100100
v-model="share.expireDate"
101-
v-tooltip.auto="{
102-
content: errors.expireDate,
103-
show: errors.expireDate,
104-
trigger: 'manual',
105-
defaultContainer: '#app-sidebar'
106-
}"
107101
class="share-link-expire-date"
108102
:disabled="saving"
109-
110-
:lang="lang"
111-
icon=""
103+
:is-native-picker="true"
104+
:hide-label="true"
112105
type="date"
113-
value-type="format"
114-
:disabled-date="disabledDate">
106+
:min="dateTomorrow"
107+
:max="dateMaxEnforced">
115108
<!-- let's not submit when picked, the user
116109
might want to still edit or copy the password -->
117110
{{ t('files_sharing', 'Enter a date') }}
@@ -220,22 +213,16 @@
220213
</NcActionCheckbox>
221214
<NcActionInput v-if="hasExpirationDate"
222215
ref="expireDate"
223-
v-tooltip.auto="{
224-
content: errors.expireDate,
225-
show: errors.expireDate,
226-
trigger: 'manual',
227-
defaultContainer: '#app-sidebar'
228-
}"
216+
:is-native-picker="true"
217+
:hide-label="true"
229218
class="share-link-expire-date"
230219
:class="{ error: errors.expireDate}"
231220
:disabled="saving"
232-
:lang="lang"
233221
:value="share.expireDate"
234-
value-type="format"
235-
icon="icon-calendar-dark"
236222
type="date"
237-
:disabled-date="disabledDate"
238-
@update:value="onExpirationChange">
223+
:min="dateTomorrow"
224+
:max="dateMaxEnforced"
225+
@input="onExpirationChange">
239226
{{ t('files_sharing', 'Enter a date') }}
240227
</NcActionInput>
241228

@@ -435,20 +422,22 @@ export default {
435422
|| !!this.share.expireDate
436423
},
437424
set(enabled) {
438-
let dateString = moment(this.config.defaultExpirationDateString)
439-
if (!dateString.isValid()) {
440-
dateString = moment()
425+
let defaultExpirationDate = this.config.defaultExpirationDate
426+
if (!defaultExpirationDate) {
427+
defaultExpirationDate = new Date()
441428
}
442429
this.share.state.expiration = enabled
443-
? dateString.format('YYYY-MM-DD')
430+
? defaultExpirationDate
444431
: ''
445432
console.debug('Expiration date status', enabled, this.share.expireDate)
446433
},
447434
},
448435
449436
dateMaxEnforced() {
450-
return this.config.isDefaultExpireDateEnforced
451-
&& moment().add(1 + this.config.defaultExpireDate, 'days')
437+
if (this.config.isDefaultExpireDateEnforced) {
438+
return new Date(new Date().setDate(new Date().getDate() + 1 + this.config.defaultExpireDate))
439+
}
440+
return null
452441
},
453442
454443
/**
@@ -631,7 +620,7 @@ export default {
631620
if (this.config.isDefaultExpireDateEnforced) {
632621
// default is empty string if not set
633622
// expiration is the share object key, not expireDate
634-
shareDefaults.expiration = this.config.defaultExpirationDateString
623+
shareDefaults.expiration = this.config.defaultExpirationDate
635624
}
636625
if (this.config.enableLinkPasswordByDefault) {
637626
shareDefaults.password = await GeneratePassword()

apps/files_sharing/src/mixins/SharesMixin.js

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ export default {
9797
},
9898

9999
dateTomorrow() {
100-
return moment().add(1, 'days')
100+
return new Date(new Date().setDate(new Date().getDate() + 1))
101101
},
102102

103103
// Datepicker language
@@ -142,7 +142,7 @@ export default {
142142
}
143143
}
144144
if (share.expirationDate) {
145-
const date = moment(share.expirationDate)
145+
const date = share.expirationDate
146146
if (!date.isValid()) {
147147
return false
148148
}
@@ -151,16 +151,12 @@ export default {
151151
},
152152

153153
/**
154-
* ActionInput can be a little tricky to work with.
155-
* Since we expect a string and not a Date,
156-
* we need to process the value here
154+
* Save given value to expireDate and trigger queueUpdate
157155
*
158-
* @param {Date} date js date to be parsed by moment.js
156+
* @param {Date} date
159157
*/
160158
onExpirationChange(date) {
161-
// format to YYYY-MM-DD
162-
const value = moment(date).format('YYYY-MM-DD')
163-
this.share.expireDate = value
159+
this.share.expireDate = date
164160
this.queueUpdate('expireDate')
165161
},
166162

@@ -318,17 +314,5 @@ export default {
318314
debounceQueueUpdate: debounce(function(property) {
319315
this.queueUpdate(property)
320316
}, 500),
321-
322-
/**
323-
* Returns which dates are disabled for the datepicker
324-
*
325-
* @param {Date} date date to check
326-
* @return {boolean}
327-
*/
328-
disabledDate(date) {
329-
const dateMoment = moment(date)
330-
return (this.dateTomorrow && dateMoment.isBefore(this.dateTomorrow, 'day'))
331-
|| (this.dateMaxEnforced && dateMoment.isSameOrAfter(this.dateMaxEnforced, 'day'))
332-
},
333317
},
334318
}

apps/files_sharing/src/models/Share.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -248,9 +248,9 @@ export default class Share {
248248
}
249249

250250
/**
251-
* Get the expiration date as a string format
251+
* Get the expiration date
252252
*
253-
* @return {string}
253+
* @return {Date|null}
254254
* @readonly
255255
* @memberof Share
256256
*/
@@ -259,10 +259,9 @@ export default class Share {
259259
}
260260

261261
/**
262-
* Set the expiration date as a string format
263-
* e.g. YYYY-MM-DD
262+
* Set the expiration date
264263
*
265-
* @param {string} date the share expiration date
264+
* @param {Date|null} date the share expiration date
266265
* @memberof Share
267266
*/
268267
set expireDate(date) {

apps/files_sharing/src/services/ConfigService.js

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -60,57 +60,45 @@ export default class Config {
6060
}
6161

6262
/**
63-
* Get the default link share expiration date as string
63+
* Get the default link share expiration date
6464
*
65-
* @return {string}
65+
* @return {Date|null}
6666
* @readonly
6767
* @memberof Config
6868
*/
69-
get defaultExpirationDateString() {
70-
let expireDateString = ''
69+
get defaultExpirationDate() {
7170
if (this.isDefaultExpireDateEnabled) {
72-
const date = window.moment.utc()
73-
const expireAfterDays = this.defaultExpireDate
74-
date.add(expireAfterDays, 'days')
75-
expireDateString = date.format('YYYY-MM-DD')
71+
return new Date(new Date().setDate(new Date().getDate() + this.defaultExpireDate))
7672
}
77-
return expireDateString
73+
return null
7874
}
7975

8076
/**
81-
* Get the default internal expiration date as string
77+
* Get the default internal expiration date
8278
*
83-
* @return {string}
79+
* @return {Date|null}
8480
* @readonly
8581
* @memberof Config
8682
*/
87-
get defaultInternalExpirationDateString() {
88-
let expireDateString = ''
83+
get defaultInternalExpirationDate() {
8984
if (this.isDefaultInternalExpireDateEnabled) {
90-
const date = window.moment.utc()
91-
const expireAfterDays = this.defaultInternalExpireDate
92-
date.add(expireAfterDays, 'days')
93-
expireDateString = date.format('YYYY-MM-DD')
85+
return new Date(new Date().setDate(new Date().getDate() + this.defaultInternalExpireDate))
9486
}
95-
return expireDateString
87+
return null
9688
}
9789

9890
/**
99-
* Get the default remote expiration date as string
91+
* Get the default remote expiration date
10092
*
101-
* @return {string}
93+
* @return {Date|null}
10294
* @readonly
10395
* @memberof Config
10496
*/
10597
get defaultRemoteExpirationDateString() {
106-
let expireDateString = ''
10798
if (this.isDefaultRemoteExpireDateEnabled) {
108-
const date = window.moment.utc()
109-
const expireAfterDays = this.defaultRemoteExpireDate
110-
date.add(expireAfterDays, 'days')
111-
expireDateString = date.format('YYYY-MM-DD')
99+
return new Date(new Date().setDate(new Date().getDate() + this.defaultRemoteExpireDate))
112100
}
113-
return expireDateString
101+
return null
114102
}
115103

116104
/**
@@ -190,6 +178,17 @@ export default class Config {
190178
return OC.appConfig.core.defaultInternalExpireDateEnabled === true
191179
}
192180

181+
/**
182+
* Is there a default expiration date for new remote shares ?
183+
*
184+
* @return {boolean}
185+
* @readonly
186+
* @memberof Config
187+
*/
188+
get isDefaultRemoteExpireDateEnabled() {
189+
return OC.appConfig.core.defaultRemoteExpireDateEnabled === true
190+
}
191+
193192
/**
194193
* Are users on this server allowed to send shares to other servers ?
195194
*

dist/files_sharing-files_sharing_tab.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/files_sharing-files_sharing_tab.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)