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
+ <NcActionCheckbox v-model="dateRange">
14
+ {{ t('forms', 'Use date range') }}
15
+ </NcActionCheckbox>
16
+ <NcActionInput
17
+ v-model="dateMin"
18
+ type="date"
19
+ :label="t('forms', 'Earliest date')"
20
+ hide-label
21
+ :formatter="extraSettingsFormatter"
22
+ is-native-picker
23
+ :max="dateMax">
24
+ <template #icon>
25
+ <Pencil :size="20" />
26
+ </template>
27
+ </NcActionInput>
28
+ <NcActionInput
29
+ v-model="dateMax"
30
+ type="date"
31
+ :label="t('forms', 'Latest date')"
32
+ hide-label
33
+ :formatter="extraSettingsFormatter"
34
+ is-native-picker
35
+ :min="dateMin">
36
+ <template #icon>
37
+ <Pencil :size="20" />
38
+ </template>
39
+ </NcActionInput>
40
+ </template>
12
41
<div class="question__content">
13
42
<NcDateTimePicker
14
43
:value="time"
17
46
:placeholder="datetimePickerPlaceholder"
18
47
:show-second="false"
19
48
:type="answerType.pickerType"
49
+ :disabled-date="disabledDates"
20
50
:input-attr="inputAttr"
51
+ :range="extraSettings?.dateRange"
52
+ range-separator=" - "
21
53
@change="onValueChange" />
22
54
</div>
23
55
</Question>
24
56
</template>
25
57
26
58
<script>
27
59
import moment from '@nextcloud/moment'
28
-
29
60
import QuestionMixin from '../../mixins/QuestionMixin.js'
61
+ import NcActionCheckbox from '@nextcloud/vue/components/NcActionCheckbox'
62
+ import NcActionInput from '@nextcloud/vue/components/NcActionInput'
30
63
import NcDateTimePicker from '@nextcloud/vue/components/NcDateTimePicker'
64
+ import Pencil from 'vue-material-design-icons/Pencil.vue'
31
65
32
66
export default {
33
67
name: 'QuestionDate',
34
68
35
69
components: {
70
+ NcActionCheckbox,
71
+ NcActionInput,
36
72
NcDateTimePicker,
73
+ Pencil,
37
74
},
38
75
39
76
mixins: [QuestionMixin],
@@ -44,15 +81,23 @@ export default {
44
81
stringify: this.stringify,
45
82
parse: this.parse,
46
83
},
84
+ extraSettingsFormatter: {
85
+ stringify: this.stringifyDate,
86
+ parse: this.parseTimestampToDate,
87
+ },
47
88
}
48
89
},
49
90
50
91
computed: {
51
92
datetimePickerPlaceholder() {
52
93
if (this.readOnly) {
53
- return this.answerType.submitPlaceholder
94
+ return this.extraSettings?.dateRange
95
+ ? this.answerType.submitPlaceholderRange
96
+ : this.answerType.submitPlaceholder
54
97
}
55
- return this.answerType.createPlaceholder
98
+ return this.extraSettings?.dateRange
99
+ ? this.answerType.createPlaceholderRange
100
+ : this.answerType.createPlaceholder
56
101
},
57
102
58
103
/**
@@ -68,8 +113,54 @@ export default {
68
113
},
69
114
70
115
time() {
116
+ if (this.extraSettings?.dateRange) {
117
+ return this.values
118
+ ? [this.parse(this.values[0]), this.parse(this.values[1])]
119
+ : null
120
+ }
71
121
return this.values ? this.parse(this.values[0]) : null
72
122
},
123
+
124
+ /**
125
+ * The maximum allowable date for the date input field
126
+ */
127
+ dateMax: {
128
+ get() {
129
+ return this.extraSettings?.dateMax
130
+ ? moment(this.extraSettings.dateMax, 'X').toDate()
131
+ : null
132
+ },
133
+ set(value) {
134
+ this.onExtraSettingsChange({
135
+ dateMax: parseInt(moment(value).format('X')),
136
+ })
137
+ },
138
+ },
139
+
140
+ /**
141
+ * The minimum allowable date for the date input field
142
+ */
143
+ dateMin: {
144
+ get() {
145
+ return this.extraSettings?.dateMin
146
+ ? moment(this.extraSettings.dateMin, 'X').toDate()
147
+ : null
148
+ },
149
+ set(value) {
150
+ this.onExtraSettingsChange({
151
+ dateMin: parseInt(moment(value).format('X')),
152
+ })
153
+ },
154
+ },
155
+
156
+ dateRange: {
157
+ get() {
158
+ return this.extraSettings?.dateRange ?? false
159
+ },
160
+ set(value) {
161
+ this.onExtraSettingsChange({ dateRange: value === true ?? null })
162
+ },
163
+ },
73
164
},
74
165
75
166
methods: {
@@ -99,12 +190,52 @@ export default {
99
190
/**
100
191
* Store Value
101
192
*
102
- * @param {Date} date The date to store
193
+ * @param {Date|Array<Date> } date The date or date range to store
103
194
*/
104
195
onValueChange(date) {
105
- this.$emit('update:values', [
106
- moment(date).format(this.answerType.storageFormat),
107
- ])
196
+ if (this.extraSettings?.dateRange) {
197
+ this.$emit('update:values', [
198
+ moment(date[0]).format(this.answerType.storageFormat),
199
+ moment(date[1]).format(this.answerType.storageFormat),
200
+ ])
201
+ } else {
202
+ this.$emit('update:values', [
203
+ moment(date).format(this.answerType.storageFormat),
204
+ ])
205
+ }
206
+ },
207
+
208
+ /**
209
+ * Determines if a given date should be disabled.
210
+ *
211
+ * @param {Date} date - The date to check.
212
+ * @return {boolean} - Returns true if the date should be disabled, otherwise false.
213
+ */
214
+ disabledDates(date) {
215
+ return (
216
+ (this.dateMin && date < this.dateMin) ||
217
+ (this.dateMax && date > this.dateMax)
218
+ )
219
+ },
220
+
221
+ /**
222
+ * Datepicker timestamp to string
223
+ *
224
+ * @param {Date} datetime the datepicker Date
225
+ * @return {string}
226
+ */
227
+ stringifyDate(datetime) {
228
+ return moment(datetime).format('L')
229
+ },
230
+
231
+ /**
232
+ * Form expires timestamp to Date of the datepicker
233
+ *
234
+ * @param {number} value the expires timestamp
235
+ * @return {Date}
236
+ */
237
+ parseTimestampToDate(value) {
238
+ return moment(value, 'X').toDate()
108
239
},
109
240
},
110
241
}
0 commit comments