mirror of
https://github.com/pretix/pretix.git
synced 2026-05-05 15:14:04 +00:00
Bulk creation for event series dates (#848)
* copy-from things * Some frontend * rrule UI * . * Fixes * UI improvements * First test * Tests
This commit is contained in:
@@ -1,9 +1,146 @@
|
||||
/*globals $, Morris, gettext*/
|
||||
/*globals $, Morris, gettext, RRule, RRuleSet*/
|
||||
|
||||
$(function () {
|
||||
if (!$("div[data-formset-prefix=checkinlist_set]").length) {
|
||||
return;
|
||||
}
|
||||
|
||||
function parse_weekday(wd) {
|
||||
map = {
|
||||
'MO': 0,
|
||||
'TU': 1,
|
||||
'WE': 2,
|
||||
'TH': 3,
|
||||
'FR': 4,
|
||||
'SA': 5,
|
||||
'SU': 6
|
||||
}
|
||||
if (wd.indexOf(",") > 0) {
|
||||
var wds = [];
|
||||
$.each(wd.split(","), function (k, v) {
|
||||
wds.push(map[v]);
|
||||
});
|
||||
return wds;
|
||||
} else {
|
||||
return map[wd];
|
||||
}
|
||||
}
|
||||
|
||||
function rrule_preview() {
|
||||
var ruleset = new RRuleSet();
|
||||
|
||||
$(".rrule-form").each(function () {
|
||||
if ($(this).find("input[name$=DELETE]").prop("checked")) {
|
||||
return;
|
||||
}
|
||||
|
||||
var rule_args = {};
|
||||
var $form = $(this);
|
||||
var freq = $form.find("select[name*=freq]").val();
|
||||
if (!$form.find("input[name*=dtstart]").data("DateTimePicker")) {
|
||||
// uninitialized
|
||||
return;
|
||||
}
|
||||
var dtstart = $form.find("input[name*=dtstart]").data("DateTimePicker").date();
|
||||
dtstart = dtstart.add(dtstart.utcOffset(), 'm').add(12, 'h').utcOffset(0);
|
||||
rule_args.dtstart = dtstart.toDate();
|
||||
rule_args.interval = parseInt($form.find("input[name*=interval]").val()) || 1;
|
||||
|
||||
if (freq === 'yearly') {
|
||||
rule_args.freq = RRule.YEARLY;
|
||||
|
||||
var same = $form.find("input[name*=yearly_same]:checked").val();
|
||||
if (same === "off") {
|
||||
rule_args.bysetpos = parseInt($form.find("select[name*=yearly_bysetpos]").val());
|
||||
rule_args.byweekday = parse_weekday($form.find("select[name*=yearly_byweekday]").val());
|
||||
rule_args.bymonth = parseInt($form.find("select[name*=yearly_bymonth]").val());
|
||||
}
|
||||
} else if (freq === 'monthly') {
|
||||
rule_args.freq = RRule.MONTHLY;
|
||||
|
||||
var same = $form.find("input[name*=monthly_same]:checked").val();
|
||||
if (same === "off") {
|
||||
rule_args.bysetpos = parseInt($form.find("select[name*=monthly_bysetpos]").val());
|
||||
rule_args.byweekday = parse_weekday($form.find("select[name*=monthly_byweekday]").val());
|
||||
}
|
||||
} else if (freq === 'weekly') {
|
||||
rule_args.freq = RRule.WEEKLY;
|
||||
|
||||
var days = [];
|
||||
$form.find("input[name*=weekly_byweekday]:checked").each(function () {
|
||||
days.push(parse_weekday($(this).val()));
|
||||
});
|
||||
if (days.length !== 0) {
|
||||
rule_args.byweekday = days;
|
||||
}
|
||||
} else if (freq === 'daily') {
|
||||
rule_args.freq = RRule.DAILY;
|
||||
}
|
||||
|
||||
var end = $form.find("input[name*=end]:checked").val();
|
||||
if (end === "count") {
|
||||
rule_args.count = parseInt($form.find("input[name*=count]").val()) || 1;
|
||||
} else {
|
||||
var date = $form.find("input[name*=until]").data("DateTimePicker").date();
|
||||
if (date !== null) {
|
||||
rule_args.until = date.toDate();
|
||||
}
|
||||
}
|
||||
|
||||
if ($form.find("input[name*=exclude]").prop("checked")) {
|
||||
ruleset.exrule(new RRule(rule_args));
|
||||
$form.closest(".panel").addClass("panel-danger").removeClass("panel-default");
|
||||
} else {
|
||||
ruleset.rrule(new RRule(rule_args));
|
||||
$form.closest(".panel").addClass("panel-default").removeClass("panel-danger");
|
||||
}
|
||||
});
|
||||
|
||||
var all_dates = ruleset.all();
|
||||
var format = $("body").attr("data-longdateformat") + " (dddd)";
|
||||
$("#rrule-preview").html("");
|
||||
if (all_dates.length > 20) {
|
||||
$("#rrule-preview").html("");
|
||||
all_dates.slice(0, 10).forEach(function(element) {
|
||||
$("#rrule-preview").append($("<li>").text(moment(element).utc().format(format)));
|
||||
});
|
||||
$("#rrule-preview").append($("<li>").text(ngettext(
|
||||
"(one more date)",
|
||||
"({num} more dates)",
|
||||
all_dates.length - 20
|
||||
).replace(/\{num\}/g, all_dates.length - 20)));
|
||||
all_dates.slice(-10).forEach(function(element) {
|
||||
$("#rrule-preview").append($("<li>").text(moment(element).utc().format(format)));
|
||||
});
|
||||
} else {
|
||||
all_dates.forEach(function(element) {
|
||||
$("#rrule-preview").append($("<li>").text(moment(element).utc().format(format)));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function rrule_form_toggles($form) {
|
||||
var freq = $form.find("select[name*=freq]").val();
|
||||
$form.find(".repeat-yearly").toggle(freq === "yearly");
|
||||
$form.find(".repeat-monthly").toggle(freq === "monthly");
|
||||
$form.find(".repeat-weekly").toggle(freq === "weekly");
|
||||
}
|
||||
|
||||
function rrule_bind_form($form) {
|
||||
$form.find("select[name*=freq]").change(function () {
|
||||
rrule_form_toggles($form);
|
||||
});
|
||||
rrule_form_toggles($form);
|
||||
}
|
||||
|
||||
$("#rrule-formset").on("change keydown keyup keypress dp.change", "input, select", function () {
|
||||
rrule_preview();
|
||||
});
|
||||
rrule_preview();
|
||||
|
||||
$(".rrule-form").each(function () { rrule_bind_form($(this)); });
|
||||
$("#rrule-formset").on("formAdded", "div", function (event) { rrule_bind_form($(event.target)); });
|
||||
|
||||
var $namef = $("input[id^=id_name]").first();
|
||||
var lastValue = $namef.val();
|
||||
$namef.change(function () {
|
||||
|
||||
@@ -296,3 +296,44 @@ table td > .checkbox input[type="checkbox"] {
|
||||
width: 100px;
|
||||
display: inline;
|
||||
}
|
||||
.form-horizontal [data-formset] .rrule-form .form-group {
|
||||
margin: 0;
|
||||
width: auto;
|
||||
}
|
||||
.rrule-form {
|
||||
.form-control {
|
||||
display: inline;
|
||||
}
|
||||
input[type=number] {
|
||||
width: 100px;
|
||||
}
|
||||
.repeat-yearly, .repeat-monthly, .repeat-weekly {
|
||||
line-height: 35px;
|
||||
padding: 0 0 15px 0;
|
||||
margin: 10px 0;
|
||||
border-top: 1px solid $panel-default-border;
|
||||
border-bottom: 1px solid $panel-default-border;
|
||||
|
||||
input[type="radio"], input[type="checkbox"] {
|
||||
top: 2px;
|
||||
}
|
||||
}
|
||||
.repeat-weekly > div.form-group {
|
||||
display: block;
|
||||
line-height: 1;
|
||||
padding-top: 5px;
|
||||
|
||||
& > div {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
align-content: space-between;
|
||||
div.checkbox {
|
||||
flex-grow: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
.repeat-until {
|
||||
line-height: 40px;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user