9
9
:title-placeholder="answerType.titlePlaceholder"
10
10
:warning-invalid="answerType.warningInvalid"
11
11
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>
12
29
<div class="question__content">
13
30
<NcDateTimePicker
14
31
:value="time"
17
34
:placeholder="datetimePickerPlaceholder"
18
35
:show-second="false"
19
36
:type="answerType.pickerType"
37
+ :disabled-date="disabledDates"
20
38
:input-attr="inputAttr"
21
39
@change="onValueChange" />
22
40
</div>
27
45
import moment from '@nextcloud/moment'
28
46
29
47
import QuestionMixin from '../../mixins/QuestionMixin.js'
48
+ import NcActionInput from '@nextcloud/vue/components/NcActionInput'
30
49
import NcDateTimePicker from '@nextcloud/vue/components/NcDateTimePicker'
31
50
32
51
export default {
33
52
name: 'QuestionDate',
34
53
35
54
components: {
55
+ NcActionInput,
36
56
NcDateTimePicker,
37
57
},
38
58
@@ -44,6 +64,10 @@ export default {
44
64
stringify: this.stringify,
45
65
parse: this.parse,
46
66
},
67
+ extraSettingsFormatter: {
68
+ stringify: this.stringifyDate,
69
+ parse: this.parseTimestampToDate,
70
+ },
47
71
}
48
72
},
49
73
@@ -70,6 +94,40 @@ export default {
70
94
time() {
71
95
return this.values ? this.parse(this.values[0]) : null
72
96
},
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
+ },
73
131
},
74
132
75
133
methods: {
@@ -106,6 +164,39 @@ export default {
106
164
moment(date).format(this.answerType.storageFormat),
107
165
])
108
166
},
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
+ },
109
200
},
110
201
}
111
202
</script>
0 commit comments