Skip to content
Snippets Groups Projects
Commit adc3d45a authored by Jan-Hendrik Willms's avatar Jan-Hendrik Willms
Browse files

refine creation of single consultation dates, re #1871

Merge request studip/studip!3257
parent 7c7fc4b3
No related branches found
No related tags found
No related merge requests found
...@@ -199,22 +199,27 @@ class Consultation_AdminController extends ConsultationController ...@@ -199,22 +199,27 @@ class Consultation_AdminController extends ConsultationController
try { try {
$interval = Request::int('interval'); $interval = Request::int('interval');
$start = $this->getDateAndTime('start'); $start = $this->getDateAndTime('start');
$end = $this->getDateAndTime($interval === 0 ? 'start' : 'end', 'end'); $end = $this->getDateAndTime($interval <= 0 ? 'start' : 'end', 'end');
if (date('Hi', $end) <= date('Hi', $start)) { if (date('Hi', $end) <= date('Hi', $start)) {
throw new InvalidArgumentException(_('Die Endzeit liegt vor der Startzeit!')); throw new InvalidArgumentException(_('Die Endzeit liegt vor der Startzeit!'));
} }
$dow = Request::int('day-of-week'); $dow = Request::int('day-of-week');
if ($interval === 0) { if ($interval <= 0) {
$dow = date('w', $start); $dow = date('w', $start);
} }
// Determine duration of a slot and pause times // Determine duration of a slot and pause times
$duration = Request::int('duration'); $duration = Request::int('duration');
if ($duration === null && $interval === -1) {
$duration = (int) (($end - $start) / 60);
}
$pause_time = Request::bool('pause') ? Request::int('pause_time') : null; $pause_time = Request::bool('pause') ? Request::int('pause_time') : null;
$pause_duration = Request::bool('pause') ? Request::int('pause_duration') : null; $pause_duration = Request::bool('pause') ? Request::int('pause_duration') : null;
if ($pause_time && $pause_time < $duration) { if ($interval >= 0 && $pause_time && $pause_time < $duration) {
throw new InvalidArgumentException(_('Die definierte Zeit bis zur Pause ist kleiner als die Dauer eines Termins.')); throw new InvalidArgumentException(_('Die definierte Zeit bis zur Pause ist kleiner als die Dauer eines Termins.'));
} }
...@@ -231,6 +236,7 @@ class Consultation_AdminController extends ConsultationController ...@@ -231,6 +236,7 @@ class Consultation_AdminController extends ConsultationController
$pause_time, $pause_time,
$pause_duration $pause_duration
); );
if ($slot_count >= self::SLOT_COUNT_THRESHOLD && !Request::int('confirmed')) { if ($slot_count >= self::SLOT_COUNT_THRESHOLD && !Request::int('confirmed')) {
$this->flash['confirm-many'] = $slot_count; $this->flash['confirm-many'] = $slot_count;
throw new Exception('', -1); throw new Exception('', -1);
...@@ -257,7 +263,7 @@ class Consultation_AdminController extends ConsultationController ...@@ -257,7 +263,7 @@ class Consultation_AdminController extends ConsultationController
$block->lock_time = Request::int('lock_time'); $block->lock_time = Request::int('lock_time');
$block->consecutive = Request::bool('consecutive', false); $block->consecutive = Request::bool('consecutive', false);
$slots = $block->createSlots(Request::int('duration'), $pause_time, $pause_duration); $slots = $block->createSlots($duration, $pause_time, $pause_duration);
if (count($slots) === 0) { if (count($slots) === 0) {
continue; continue;
} }
......
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
<? endif; ?> <? endif; ?>
<label> <label>
<?= _('Maximale Teilnehmerzahl') ?> <?= _('Maximale Teilnehmendenzahl') ?>
<?= tooltipIcon(_('Falls Sie mehrere Personen zulassen wollen (wie z.B. zu einer Klausureinsicht), so geben Sie hier die maximale Anzahl an Personen an, die sich anmelden dürfen.')) ?> <?= tooltipIcon(_('Falls Sie mehrere Personen zulassen wollen (wie z.B. zu einer Klausureinsicht), so geben Sie hier die maximale Anzahl an Personen an, die sich anmelden dürfen.')) ?>
<input required type="text" name="size" id="size" <input required type="text" name="size" id="size"
min="1" max="50" value="<?= $block->size ?>"> min="1" max="50" value="<?= $block->size ?>">
......
...@@ -212,7 +212,7 @@ class ConsultationBlock extends SimpleORMap implements PrivacyObject ...@@ -212,7 +212,7 @@ class ConsultationBlock extends SimpleORMap implements PrivacyObject
); );
} }
if (!$interval) { if ($interval <= 0) {
break; break;
} }
......
...@@ -637,7 +637,10 @@ form.inline { ...@@ -637,7 +637,10 @@ form.inline {
> :not(footer[data-dialog-button]) { > :not(footer[data-dialog-button]) {
flex: 0; flex: 0;
margin-bottom: auto;
&:last-of-type {
margin-bottom: auto;
}
} }
footer[data-dialog-button] { footer[data-dialog-button] {
......
...@@ -31,8 +31,8 @@ ...@@ -31,8 +31,8 @@
<label :class="{'col-3': !isSingleDay}"> <label :class="{'col-3': !isSingleDay}">
<span class="required">{{ $gettext('Intervall') }}</span> <span class="required">{{ $gettext('Intervall') }}</span>
<select required name="interval" v-model.number="interval"> <select required name="interval" v-model.number="interval">
<option v-for="(label, value) in intervals" :key="value" :value="value"> <option v-for="item in intervals" :key="item.key" :value="item.key">
{{ label }} {{ item.label }}
</option> </option>
</select> </select>
</label> </label>
...@@ -71,7 +71,7 @@ ...@@ -71,7 +71,7 @@
></Datepicker> ></Datepicker>
</label> </label>
<label for="start-time" class="col-3"> <label for="start-time" :class="{'col-3': !isSingleDate}">
<span class="required">{{ $gettext('Von') }}</span> <span class="required">{{ $gettext('Von') }}</span>
<Timepicker name="start-time" <Timepicker name="start-time"
...@@ -80,7 +80,7 @@ ...@@ -80,7 +80,7 @@
></Timepicker> ></Timepicker>
</label> </label>
<label for="ende_hour" class="col-3"> <label for="ende_hour" :class="{'col-3': !isSingleDate}">
<span class="required">{{ $gettext('Bis') }}</span> <span class="required">{{ $gettext('Bis') }}</span>
<Timepicker name="end-time" <Timepicker name="end-time"
...@@ -89,26 +89,26 @@ ...@@ -89,26 +89,26 @@
></Timepicker> ></Timepicker>
</label> </label>
<label class="col-3"> <label class="col-3" v-if="!isSingleDate">
<span class="required">{{ $gettext('Dauer eines Termins in Minuten') }}</span> <span class="required">{{ $gettext('Dauer eines Termins in Minuten') }}</span>
<input required type="number" name="duration" min="1" <input required type="number" name="duration" min="1"
v-model="duration"> v-model="duration">
</label> </label>
<label class="col-3"> <label :class="{'col-3': !isSingleDate}">
{{ $gettext('Maximale Teilnehmerzahl') }} {{ $gettext('Maximale Teilnehmendenzahl') }}
<StudipTooltipIcon :text="$gettext('Falls Sie mehrere Personen zulassen wollen (wie z.B. zu einer Klausureinsicht), so geben Sie hier die maximale Anzahl an Personen an, die sich anmelden dürfen.')"></StudipTooltipIcon> <StudipTooltipIcon :text="$gettext('Falls Sie mehrere Personen zulassen wollen (wie z.B. zu einer Klausureinsicht), so geben Sie hier die maximale Anzahl an Personen an, die sich anmelden dürfen.')"></StudipTooltipIcon>
<input required type="text" name="size" id="size" min="1" max="50" <input required type="text" name="size" id="size" min="1" max="50"
v-model="size"> v-model="size">
</label> </label>
<label> <label v-if="!isSingleDate">
<input type="checkbox" name="pause" value="1" <input type="checkbox" name="pause" value="1"
v-model="pause"> v-model="pause">
{{ $gettext('Pausen zwischen den Terminen einfügen?') }} {{ $gettext('Pausen zwischen den Terminen einfügen?') }}
</label> </label>
<label class="col-3" v-if="pause"> <label class="col-3" v-if="!isSingleDate && pause">
{{ $gettext('Eine Pause nach wie vielen Minuten einfügen?') }} {{ $gettext('Eine Pause nach wie vielen Minuten einfügen?') }}
<input type="number" name="pause_time" min="1" <input type="number" name="pause_time" min="1"
v-model="pauseTime"> v-model="pauseTime">
...@@ -123,16 +123,16 @@ ...@@ -123,16 +123,16 @@
<label> <label>
<input type="checkbox" name="lock" value="1" <input type="checkbox" name="lock" value="1"
v-model="lock"> v-model="lock">
{{ $gettext('Termine für Buchungen sperren?') }} {{ isSingleDate ? $gettext('Termin für Buchungen sperren?') : $gettext('Termin für Buchungen sperren?') }}
</label> </label>
<label v-if="lock"> <label v-if="lock">
{{ $gettext('Wieviele Stunden vor Beginn des Blocks sollen die Termine für Buchungen gesperrt werden?') }} {{ isSingleDate ? $gettext('Wieviele Stunden vor Beginn des Blocks soll der Termin für Buchungen gesperrt werden?') : $gettext('Wieviele Stunden vor Beginn des Blocks sollen die Termine für Buchungen gesperrt werden?') }}
<input type="number" name="lock_time" min="1" <input type="number" name="lock_time" min="1"
v-model="lockTime"> v-model="lockTime">
</label> </label>
<label> <label v-if="!isSingleDate">
<input type="checkbox" name="consecutive" value="1" <input type="checkbox" name="consecutive" value="1"
v-model="consecutive"> v-model="consecutive">
{{ $gettext('Termine innerhalb der Blöcke nur fortlaufend vergeben') }} {{ $gettext('Termine innerhalb der Blöcke nur fortlaufend vergeben') }}
...@@ -204,14 +204,14 @@ ...@@ -204,14 +204,14 @@
<legend>{{ $gettext('Weitere Einstellungen') }}</legend> <legend>{{ $gettext('Weitere Einstellungen') }}</legend>
<label> <label>
{{ $gettext('Information zu den Terminen in diesem Block') }} {{ isSingleDate ? $gettext('Information zu diesem Termin') : $gettext('Information zu den Terminen in diesem Block') }}
<textarea name="note" v-model="note"></textarea> <textarea name="note" v-model="note"></textarea>
</label> </label>
<label> <label>
<input type="checkbox" name="calender-events" value="1" <input type="checkbox" name="calender-events" value="1"
v-model="calendarEvents"> v-model="calendarEvents">
{{ $gettext('Die freien Termine auch im Kalender markieren') }} {{ isSingleDate ? $gettext('Den freien Termin auch im Kalender markieren') : $gettext('Die freien Termine auch im Kalender markieren') }}
</label> </label>
<label v-if="isCourse"> <label v-if="isCourse">
...@@ -370,13 +370,14 @@ export default { ...@@ -370,13 +370,14 @@ export default {
]; ];
}, },
intervals() { intervals() {
return { return [
0: this.$gettext('einmalig (ohne Wiederholung)'), {key: -1, label: this.$gettext('Einzeltermin')},
1: this.$gettext('wöchentlich'), {key: 0, label: this.$gettext('einmalig (ohne Wiederholung)')},
2: this.$gettext('zweiwöchentlich'), {key: 1, label: this.$gettext('wöchentlich')},
3: this.$gettext('dreiwöchentlich'), {key: 2, label: this.$gettext('zweiwöchentlich')},
4: this.$gettext('monatlich'), {key: 3, label: this.$gettext('dreiwöchentlich')},
}; {key: 4, label: this.$gettext('monatlich')},
];
}, },
isCourse() { isCourse() {
return this.rangeType === 'Course'; return this.rangeType === 'Course';
...@@ -385,7 +386,11 @@ export default { ...@@ -385,7 +386,11 @@ export default {
return this.rangeType === 'Institute'; return this.rangeType === 'Institute';
}, },
isSingleDay() { isSingleDay() {
return this.interval === 0; return this.interval === 0
|| this.interval === -1;
},
isSingleDate() {
return this.interval === -1;
}, },
needsConfirmation() { needsConfirmation() {
return this.slotCount > this.slotCountThreshold; return this.slotCount > this.slotCountThreshold;
...@@ -438,11 +443,11 @@ export default { ...@@ -438,11 +443,11 @@ export default {
errors.push(this.$gettext('Die Endzeit liegt vor der Startzeit!')); errors.push(this.$gettext('Die Endzeit liegt vor der Startzeit!'));
} }
if (this.interval > 0 && this.compareDates(this.startDate, this.endDate, '>')) { if (!this.isSingleDay && this.compareDates(this.startDate, this.endDate, '>')) {
errors.push(this.$gettext('Das Enddatum liegt vor dem Startdatum!')); errors.push(this.$gettext('Das Enddatum liegt vor dem Startdatum!'));
} }
if (this.pauseTime && this.pauseTime < this.duration) { if (!this.isSingleDate && this.pauseTime && this.pauseTime < this.duration) {
errors.push(this.$gettext('Die definierte Zeit bis zur Pause ist kleiner als die Dauer eines Termins.')); errors.push(this.$gettext('Die definierte Zeit bis zur Pause ist kleiner als die Dauer eines Termins.'));
} }
...@@ -475,10 +480,20 @@ export default { ...@@ -475,10 +480,20 @@ export default {
} }
}, },
watch: { watch: {
interval(current) { interval(current, previous) {
if (current === 0) { if (current === 0 || current === -1) {
this.endDate = new Date(this.startDate); this.endDate = new Date(this.startDate);
} }
if (current === -1) {
const start = this.combineDateAndTime(this.startDate, this.startTime);
const end = this.combineDateAndTime(this.endDate, this.endTime);
this.duration = Math.floor((end - start) / 1000 / 60);
}
if (current !== -1 && previous === -1) {
this.duration = 15;
}
}, },
recalculationProperty: { recalculationProperty: {
handler() { handler() {
......
...@@ -35,3 +35,8 @@ export default { ...@@ -35,3 +35,8 @@ export default {
} }
} }
</script> </script>
<style scoped>
input[type="time"]::-webkit-calendar-picker-indicator {
display: none;
}
</style>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment