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:
Raphael Michel
2018-04-03 18:21:27 +02:00
committed by GitHub
parent 8564f93706
commit 7939503a11
15 changed files with 3820 additions and 21 deletions

View File

@@ -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 () {

View File

@@ -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;
}
}