Skip to content

Commit c610911

Browse files
committed
feat(date): add dateMin and dateMax fields to question settings
Signed-off-by: Christian Hartmann <[email protected]>
1 parent e12dc0e commit c610911

File tree

4 files changed

+101
-0
lines changed

4 files changed

+101
-0
lines changed

lib/Constants.php

+5
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,11 @@ class Constants {
145145
'allowedFileExtensions' => ['array'],
146146
'maxAllowedFilesCount' => ['integer'],
147147
'maxFileSize' => ['integer'],
148+
];
149+
150+
public const EXTRA_SETTINGS_DATE = [
151+
'dateMax' => ['integer'],
152+
'dateMin' => ['integer'],
148153
];
149154

150155
// should be in sync with FileTypes.js

lib/ResponseDefinitions.php

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
* allowOtherAnswer?: bool,
2424
* allowedFileExtensions?: list<string>,
2525
* allowedFileTypes?: list<string>,
26+
* dateMax?: int,
27+
* dateMin?: int,
2628
* maxAllowedFilesCount?: int,
2729
* maxFileSize?: int,
2830
* optionsLimitMax?: int,

lib/Service/FormsService.php

+3
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,9 @@ public function areExtraSettingsValid(array $extraSettings, string $questionType
629629
case Constants::ANSWER_TYPE_FILE:
630630
$allowed = Constants::EXTRA_SETTINGS_FILE;
631631
break;
632+
case Constants::ANSWER_TYPE_DATE:
633+
$allowed = Constants::EXTRA_SETTINGS_DATE;
634+
break;
632635
default:
633636
$allowed = [];
634637
}

src/components/Questions/QuestionDate.vue

+91
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,23 @@
99
:title-placeholder="answerType.titlePlaceholder"
1010
:warning-invalid="answerType.warningInvalid"
1111
v-on="commonListeners">
12+
<template v-if="answerType.pickerType === 'date'" #actions>
13+
<NcActionInput
14+
v-model="dateMin"
15+
:aria-label="t('forms', 'Pick minimum date')"
16+
:formatter="extraSettingsFormatter"
17+
type="date"
18+
clearable>
19+
{{ t('forms', 'Pick minimum date') }}
20+
</NcActionInput>
21+
<NcActionInput
22+
v-model="dateMax"
23+
:aria-label="t('forms', 'Pick maximum date')"
24+
:formatter="extraSettingsFormatter"
25+
type="date">
26+
{{ t('forms', 'Pick maximum date') }}
27+
</NcActionInput>
28+
</template>
1229
<div class="question__content">
1330
<NcDateTimePicker
1431
:value="time"
@@ -17,6 +34,7 @@
1734
:placeholder="datetimePickerPlaceholder"
1835
:show-second="false"
1936
:type="answerType.pickerType"
37+
:disabled-date="disabledDates"
2038
:input-attr="inputAttr"
2139
@change="onValueChange" />
2240
</div>
@@ -27,12 +45,14 @@
2745
import moment from '@nextcloud/moment'
2846

2947
import QuestionMixin from '../../mixins/QuestionMixin.js'
48+
import NcActionInput from '@nextcloud/vue/components/NcActionInput'
3049
import NcDateTimePicker from '@nextcloud/vue/components/NcDateTimePicker'
3150

3251
export default {
3352
name: 'QuestionDate',
3453

3554
components: {
55+
NcActionInput,
3656
NcDateTimePicker,
3757
},
3858

@@ -44,6 +64,10 @@ export default {
4464
stringify: this.stringify,
4565
parse: this.parse,
4666
},
67+
extraSettingsFormatter: {
68+
stringify: this.stringifyDate,
69+
parse: this.parseTimestampToDate,
70+
},
4771
}
4872
},
4973

@@ -70,6 +94,40 @@ export default {
7094
time() {
7195
return this.values ? this.parse(this.values[0]) : null
7296
},
97+
98+
dateMax: {
99+
get() {
100+
return moment(this.extraSettings?.dateMax, 'X').toDate() ?? null
101+
},
102+
set(value) {
103+
if (!value) {
104+
this.onExtraSettingsChange({
105+
dateMax: null,
106+
})
107+
} else {
108+
this.onExtraSettingsChange({
109+
dateMax: parseInt(moment(value).format('X')),
110+
})
111+
}
112+
},
113+
},
114+
115+
dateMin: {
116+
get() {
117+
return moment(this.extraSettings?.dateMin, 'X').toDate() ?? null
118+
},
119+
set(value) {
120+
if (!value) {
121+
this.onExtraSettingsChange({
122+
dateMax: null,
123+
})
124+
} else {
125+
this.onExtraSettingsChange({
126+
dateMin: parseInt(moment(value).format('X')),
127+
})
128+
}
129+
},
130+
},
73131
},
74132

75133
methods: {
@@ -106,6 +164,39 @@ export default {
106164
moment(date).format(this.answerType.storageFormat),
107165
])
108166
},
167+
168+
/**
169+
* Determines if a given date should be disabled.
170+
*
171+
* @param {Date} date - The date to check.
172+
* @return {boolean} - Returns true if the date should be disabled, otherwise false.
173+
*/
174+
disabledDates(date) {
175+
return (
176+
(this.dateMin && date < this.dateMin) ||
177+
(this.dateMax && date > this.dateMax)
178+
)
179+
},
180+
181+
/**
182+
* Datepicker timestamp to string
183+
*
184+
* @param {Date} datetime the datepicker Date
185+
* @return {string}
186+
*/
187+
stringifyDate(datetime) {
188+
return moment(datetime).format('L')
189+
},
190+
191+
/**
192+
* Form expires timestamp to Date of the datepicker
193+
*
194+
* @param {number} value the expires timestamp
195+
* @return {Date}
196+
*/
197+
parseTimestampToDate(value) {
198+
return moment(value, 'X').toDate()
199+
},
109200
},
110201
}
111202
</script>

0 commit comments

Comments
 (0)