Subevent bulk creation: Allow to auto-generate time slots

This commit is contained in:
Raphael Michel
2021-01-20 17:13:15 +01:00
parent f3de5d5c96
commit 6ea4315beb
4 changed files with 96 additions and 2 deletions

View File

@@ -332,9 +332,51 @@
</div> </div>
{% endescapescript %} {% endescapescript %}
</script> </script>
<div class="panel panel-default hidden" id="subevent_add_many_slots">
<div class="panel-body row">
<div class="col-md-2 col-sm-12">
<label for="subevent_add_many_slots_first">
<strong>{% trans "Start of first slot" %}</strong>
</label>
<input class="form-control timepickerfield" id="subevent_add_many_slots_first" value="{{ time_begin_sample }}">
</div>
<div class="col-md-2 col-sm-12">
<label for="subevent_add_many_slots_end">
<strong>{% trans "End of time slots" %}</strong>
</label>
<input class="form-control timepickerfield" id="subevent_add_many_slots_end" value="{{ time_end_sample }}">
</div>
<div class="col-md-3 col-sm-12">
<label for="subevent_add_many_slots_length">
<strong>{% trans "Length of slots" %}</strong>
</label>
<div class="input-group">
<input type="text" class="form-control" id="subevent_add_many_slots_length" value="15">
<span class="input-group-addon">{% trans "minutes" %}</span>
</div>
</div>
<div class="col-md-3 col-sm-12">
<label for="subevent_add_many_slots_break">
<strong>{% trans "Break between slots" %}</strong>
</label>
<div class="input-group">
<input type="number" class="form-control" id="subevent_add_many_slots_break" value="0">
<span class="input-group-addon">{% trans "minutes" %}</span>
</div>
</div>
<div class="col-md-2 col-sm-12">
<label>&nbsp;</label>
<button class="btn-block btn btn-primary" id="subevent_add_many_slots_go" type="button">
<span class="fa fa-check"></span> {% trans "Create" %}
</button>
</div>
</div>
</div>
<p> <p>
<button type="button" class="btn btn-default" data-formset-add> <button type="button" class="btn btn-default" data-formset-add>
<i class="fa fa-plus"></i> {% trans "Add a new time slot" %}</button> <i class="fa fa-plus"></i> {% trans "Add a single time slot" %}</button>
<button type="button" class="btn btn-default" id="subevent_add_many_slots_start">
<i class="fa fa-calendar"></i> {% trans "Add many time slots" %}</button>
</p> </p>
</div> </div>
</fieldset> </fieldset>

View File

@@ -1,5 +1,5 @@
import copy import copy
from datetime import datetime, timedelta from datetime import datetime, timedelta, time
from dateutil.rrule import DAILY, MONTHLY, WEEKLY, YEARLY, rrule, rruleset from dateutil.rrule import DAILY, MONTHLY, WEEKLY, YEARLY, rrule, rruleset
from django.contrib import messages from django.contrib import messages
@@ -11,6 +11,7 @@ from django.forms import inlineformset_factory
from django.http import Http404, HttpResponseRedirect from django.http import Http404, HttpResponseRedirect
from django.shortcuts import redirect, render from django.shortcuts import redirect, render
from django.urls import reverse from django.urls import reverse
from django.utils.formats import get_format
from django.utils.functional import cached_property from django.utils.functional import cached_property
from django.utils.timezone import make_aware from django.utils.timezone import make_aware
from django.utils.translation import gettext_lazy as _, pgettext_lazy from django.utils.translation import gettext_lazy as _, pgettext_lazy
@@ -622,6 +623,10 @@ class SubEventBulkCreate(SubEventEditorMixin, EventPermissionRequiredMixin, Crea
ctx = super().get_context_data(**kwargs) ctx = super().get_context_data(**kwargs)
ctx['rrule_formset'] = self.rrule_formset ctx['rrule_formset'] = self.rrule_formset
ctx['time_formset'] = self.time_formset ctx['time_formset'] = self.time_formset
tf = get_format('TIME_INPUT_FORMATS')[0]
ctx['time_begin_sample'] = time(9, 0, 0).strftime(tf)
ctx['time_end_sample'] = time(18, 0, 0).strftime(tf)
return ctx return ctx
@cached_property @cached_property

View File

@@ -101,6 +101,7 @@ var form_handlers = function (el) {
locale: $("body").attr("data-datetimelocale"), locale: $("body").attr("data-datetimelocale"),
useCurrent: false, useCurrent: false,
showClear: !$(this).prop("required"), showClear: !$(this).prop("required"),
viewMode: 'years',
icons: { icons: {
time: 'fa fa-clock-o', time: 'fa fa-clock-o',
date: 'fa fa-calendar', date: 'fa fa-calendar',
@@ -563,6 +564,7 @@ $(function () {
} }
); );
$("[data-formset]").on("formAdded", "div", function (event) { $("[data-formset]").on("formAdded", "div", function (event) {
console.log("formAdded")
form_handlers($(event.target)); form_handlers($(event.target));
}); });
$(document).on("click", ".variations .variations-select-all", function (e) { $(document).on("click", ".variations .variations-select-all", function (e) {

View File

@@ -136,6 +136,51 @@ $(function () {
rrule_form_toggles($form); rrule_form_toggles($form);
} }
$("#subevent_add_many_slots_go").on("click", function () {
$("#time-formset [data-formset-form]").each(function () {
var tf = $(this).find("[name$=time_from]").val()
if (!tf) {
$(this).remove();
}
})
var first = $("#subevent_add_many_slots_first").data('DateTimePicker').date();
var end = $("#subevent_add_many_slots_end").data('DateTimePicker').date();
var length_m = parseFloat($("#subevent_add_many_slots_length").val()) || 0;
var break_m = parseFloat($("#subevent_add_many_slots_break").val()) || 0;
if (!first || !end || !length_m) {
console.log("invalid", first, end, length_m)
return
}
function closure($form, time) {
return function () {
console.log("setting value", time)
$form.find("[name$=time_from]").data('DateTimePicker').date(time);
time.add(length_m, 'minutes');
$form.find("[name$=time_to]").data('DateTimePicker').date(time);
}
}
var pointer = first.clone();
while (pointer.isBefore(end)) {
var $form = $("#time-formset").formset("getOrCreate").addForm();
$form.attr("data-formset-created-at-runtime", "false"); // prevents animation
var time = pointer.clone();
window.setTimeout(closure($form, time), 1);
// jquery.formset.js only calls trigger("formAdded") after a setTimeout of 0,
// but we need to run after that to make sure the date pickers are initialized
pointer.add(break_m + length_m, 'minutes');
}
$("#subevent_add_many_slots").addClass("hidden");
$("#subevent_add_many_slots_start").removeClass("hidden");
});
$("#subevent_add_many_slots_start").on("click", function () {
$("#subevent_add_many_slots").removeClass("hidden");
$(this).addClass("hidden");
});
$("#rrule-formset").on("change keydown keyup keypress dp.change", "input, select", function () { $("#rrule-formset").on("change keydown keyup keypress dp.change", "input, select", function () {
rrule_preview(); rrule_preview();
}); });