updated handling of entries in comment
This commit is contained in:
+319
@@ -0,0 +1,319 @@
|
||||
var DATE_LOCALE_FORMAT = "D.M.YY"; //10.2.16
|
||||
var DATE_INPUT_FORMAT = "YYYY-MM-DD"; //2016-02-10
|
||||
var TIME_FORMAT = "HH:mm"; // 17:30
|
||||
var WEEKDAY_FORMAT = "dddd"; //Monday
|
||||
var MOMENT_LOCALE = "de";
|
||||
var TIMEZONE_NAME = "Europe/Berlin";
|
||||
//requires moment.js
|
||||
|
||||
Array.prototype.asChipData = function () {
|
||||
return this.map((e, i) => {
|
||||
return {
|
||||
tag: e,
|
||||
id : i
|
||||
};
|
||||
})
|
||||
}
|
||||
Array.prototype.fromChipData = function () {
|
||||
return this.map(e => {
|
||||
return e.tag;
|
||||
})
|
||||
}
|
||||
|
||||
function Rule() {
|
||||
var options = {};
|
||||
|
||||
if (arguments[0]) options = arguments[0];
|
||||
|
||||
var default_args = {
|
||||
'arten': [],
|
||||
'dauer': 60,
|
||||
'titel': [],
|
||||
'name' : "Standard"
|
||||
}
|
||||
for (var index in default_args) {
|
||||
if (typeof options[index] == "undefined") options[index] = default_args[index];
|
||||
}
|
||||
|
||||
this._duration = options.dauer;
|
||||
this._arten = options.arten;
|
||||
this._titel = options.titel;
|
||||
this._name = options.name;
|
||||
}
|
||||
|
||||
Rule.prototype = {
|
||||
get Dauer() {
|
||||
return this._duration;
|
||||
},
|
||||
set Dauer(value) {
|
||||
this._duration = value;
|
||||
},
|
||||
|
||||
get Arten() {
|
||||
return this._arten.asChipData();
|
||||
},
|
||||
set Arten(value) {
|
||||
this._arten = value.fromChipData();
|
||||
},
|
||||
|
||||
get Titel() {
|
||||
return this._titel.asChipData();
|
||||
},
|
||||
set Titel(value) {
|
||||
this._titel = value.fromChipData();
|
||||
},
|
||||
|
||||
get Name() {
|
||||
return this._name;
|
||||
},
|
||||
set Name(value) {
|
||||
this._name = value;
|
||||
},
|
||||
};
|
||||
Rule.prototype.fits = function (art, title) {
|
||||
var artMatch = false;
|
||||
var nameMatch = false;
|
||||
|
||||
if (this._arten.length == 0) artMatch = true;
|
||||
else {
|
||||
this._arten.forEach(function (el, i) {
|
||||
if (art.includes(el.toLowerCase())) artMatch = true;
|
||||
});
|
||||
}
|
||||
|
||||
if (this._titel.length == 0) nameMatch = true;
|
||||
else {
|
||||
this._titel.forEach(function (el, i) {
|
||||
if (name.includes(el.toLowerCase())) nameMatch = true;
|
||||
});
|
||||
}
|
||||
|
||||
return artMatch && nameMatch;
|
||||
}
|
||||
Rule.thaw = function (json) {
|
||||
return new Rule({
|
||||
dauer: json._duration,
|
||||
name : json._name,
|
||||
arten: json._arten,
|
||||
titel: json._titel
|
||||
});
|
||||
}
|
||||
Rule.defaults = function () {
|
||||
var rules = [];
|
||||
var input = [{
|
||||
name : "EF #01",
|
||||
dauer: 60,
|
||||
arten: ['VS'],
|
||||
titel: ['Kinderkonzert']
|
||||
},
|
||||
{
|
||||
name : "EF #02",
|
||||
dauer: 120,
|
||||
arten: ['VS'],
|
||||
titel: ["Expeditionskonzert", "Sinfoniekonzert"]
|
||||
},
|
||||
{
|
||||
name : "EF #03",
|
||||
dauer: 150,
|
||||
arten: ['Oa', 'GP'],
|
||||
titel: ['Expeditionskonzert']
|
||||
},
|
||||
{
|
||||
name : "EF #04",
|
||||
dauer: 60,
|
||||
arten: ['Oa', 'GP'],
|
||||
titel: ['Expeditionskonzert']
|
||||
},
|
||||
{
|
||||
name : "EF #05",
|
||||
dauer: 150,
|
||||
arten: ['Oa', 'OSP']
|
||||
},
|
||||
{
|
||||
name : "EF #06",
|
||||
dauer: 180,
|
||||
arten: ["VS", "BO", "OHP", "HP", "GP", "Prem", "WA"]
|
||||
},
|
||||
{
|
||||
name : "Standard",
|
||||
dauer: 60
|
||||
}
|
||||
];
|
||||
input.forEach(e => {
|
||||
rules.push(new Rule(e));
|
||||
});
|
||||
|
||||
return rules;
|
||||
}
|
||||
var DURATION_RULES = Rule.defaults();
|
||||
|
||||
function Shift() {
|
||||
var options = {};
|
||||
|
||||
if (arguments[0]) options = arguments[0];
|
||||
|
||||
var default_args = {
|
||||
'art' : "",
|
||||
'name' : "DUMMY",
|
||||
'datum' : moment(),
|
||||
'end' : moment(),
|
||||
'beschreibung': "",
|
||||
'ort' : "",
|
||||
}
|
||||
for (var index in default_args) {
|
||||
if (typeof options[index] == "undefined") options[index] = default_args[index];
|
||||
}
|
||||
|
||||
this.Datum = options.datum.format(DATE_INPUT_FORMAT);
|
||||
this.Beginn = options.datum.format(TIME_FORMAT);
|
||||
this.Ende = options.end.format(TIME_FORMAT);
|
||||
this.Art = options.art;
|
||||
this.Beschreibung = options.beschreibung;
|
||||
this.Name = options.name;
|
||||
this.Ort = options.ort;
|
||||
|
||||
if (typeof options.ende != "undefined") {
|
||||
this.Ende = options.ende;
|
||||
} else {
|
||||
if (!options.dontSetDurationFromRules) {
|
||||
Shift.setDurationFromRules(this, DURATION_RULES);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Shift.prototype = {
|
||||
get Wochentag() {
|
||||
return this._date.clone().locale(MOMENT_LOCALE).format(WEEKDAY_FORMAT);
|
||||
},
|
||||
set Wochentag(value) {
|
||||
throw "kann nicht gesetzt werden.";
|
||||
},
|
||||
|
||||
get FormattedDatum() {
|
||||
return this._date.clone().format(DATE_LOCALE_FORMAT);
|
||||
},
|
||||
set FormattedDatum(value) {
|
||||
var dateMoment = moment(value, DATE_LOCALE_FORMAT);
|
||||
this._date = dateMoment;
|
||||
},
|
||||
|
||||
get Datum() {
|
||||
return this._date.clone().format(DATE_INPUT_FORMAT);
|
||||
},
|
||||
set Datum(value) {
|
||||
var dateMoment = moment(value).startOf('day');
|
||||
this._date = dateMoment.clone();
|
||||
},
|
||||
|
||||
get Beginn() {
|
||||
return this._begin.clone().format(TIME_FORMAT);
|
||||
},
|
||||
set Beginn(value) {
|
||||
var dateMoment = moment(this.Datum + " " + value, DATE_INPUT_FORMAT + " " + TIME_FORMAT);
|
||||
this._begin = dateMoment.clone();
|
||||
},
|
||||
get Ende() {
|
||||
var ende = this._begin.clone().add(this._duration).format(TIME_FORMAT);
|
||||
return ende;
|
||||
},
|
||||
set Ende(value) {
|
||||
var dateMoment = moment(this.Datum + " " + value, DATE_INPUT_FORMAT + " " + TIME_FORMAT);
|
||||
if (this._begin > dateMoment) {
|
||||
dateMoment.add(1, 'd');
|
||||
}
|
||||
this._duration = moment.duration(dateMoment.diff(this._begin));
|
||||
},
|
||||
|
||||
get Dauer() {
|
||||
return this._duration;
|
||||
},
|
||||
set Dauer(duration) {
|
||||
this._duration = duration;
|
||||
},
|
||||
|
||||
get Name() {
|
||||
return this._name;
|
||||
},
|
||||
set Name(value) {
|
||||
this._name = value ? value.trim() : "";
|
||||
},
|
||||
|
||||
get Ort() {
|
||||
return this._ort;
|
||||
},
|
||||
set Ort(value) {
|
||||
this._ort = value ? value.trim() : "";
|
||||
},
|
||||
|
||||
get VEventTitle() {
|
||||
return this.Name + " " + this.Art;
|
||||
},
|
||||
set VEventTitle(value) {
|
||||
throw "kann nicht gesetzt werden.";
|
||||
},
|
||||
|
||||
get Art() {
|
||||
return this._kind;
|
||||
},
|
||||
set Art(value) {
|
||||
|
||||
this._kind = value ? value.trim() : "";
|
||||
},
|
||||
|
||||
get Beschreibung() {
|
||||
return this._description;
|
||||
},
|
||||
set Beschreibung(value) {
|
||||
this._description = value ? value.trim() : "";
|
||||
}
|
||||
|
||||
}
|
||||
Shift.setDurationFromRules = function (shift, rules) {
|
||||
'use strict';
|
||||
var isAllDayEvent = shift.Beginn == "00:00";
|
||||
if (isAllDayEvent) {
|
||||
shift.Dauer = moment.duration(24, 'h').locale(MOMENT_LOCALE);
|
||||
return;
|
||||
}
|
||||
var art = shift.Art.toLowerCase();
|
||||
var titel = shift.Name.toLowerCase();
|
||||
var duration = 60;
|
||||
for (var rIndex in rules) {
|
||||
var rule = rules[rIndex];
|
||||
|
||||
if (rule.fits(art, titel)) {
|
||||
duration = rule.Dauer;
|
||||
break;
|
||||
}
|
||||
}
|
||||
shift.Dauer = moment.duration(duration, 'm').locale(MOMENT_LOCALE);
|
||||
}
|
||||
Shift.prototype.toVEvent = function () {
|
||||
var end = this._begin.clone().add(this._duration);
|
||||
return new VEvent({
|
||||
startMoment: this._begin,
|
||||
endMoment : end,
|
||||
title : this.VEventTitle,
|
||||
description: this.Beschreibung,
|
||||
location : this.Ort
|
||||
});
|
||||
};
|
||||
Shift.thaw = function (jsonShift) {
|
||||
moment.locale(MOMENT_LOCALE);
|
||||
var begin = moment(jsonShift._begin);
|
||||
var shift = new Shift({
|
||||
art : jsonShift._kind,
|
||||
name : jsonShift._name,
|
||||
datum : begin,
|
||||
beschreibung: jsonShift._description,
|
||||
ort : jsonShift._ort,
|
||||
|
||||
});
|
||||
shift.id = jsonShift.id;
|
||||
shift.Dauer = moment.duration(jsonShift._duration);
|
||||
return shift;
|
||||
};
|
||||
Shift.prototype.updateBeginn = function (hour) {
|
||||
this._begin = this._begin.add('hours', hour);
|
||||
}
|
||||
+154
@@ -0,0 +1,154 @@
|
||||
var VCAL_DATETIME_FORMAT = "YMMDD[T]HHmmss"; //20160216T130500
|
||||
var UID_FORMAT = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';
|
||||
var NEW_LINE = "\r\n";
|
||||
var productID = window.title;
|
||||
|
||||
function VMeta() {
|
||||
this.properties = new Map();
|
||||
this.children = [];
|
||||
this.tag = "VMETA";
|
||||
}
|
||||
VMeta.formatDate = function (aMoment) {
|
||||
'use strict';
|
||||
return aMoment.format(VCAL_DATETIME_FORMAT);
|
||||
};
|
||||
VMeta.generateUID = function () {
|
||||
'use strict';
|
||||
return UID_FORMAT.replace(/[xy]/g, function (c) {
|
||||
var r = Math.random() * 16 | 0,
|
||||
v = c == 'x' ? r : (r & 0x3 | 0x8);
|
||||
return v.toString(16);
|
||||
});
|
||||
};
|
||||
VMeta.prototype.set = function (key, value) {
|
||||
'use strict';
|
||||
this.properties.set(key, value);
|
||||
};
|
||||
VMeta.prototype.get = function (key) {
|
||||
'use strict';
|
||||
this.properties.get(key);
|
||||
};
|
||||
VMeta.prototype.add = function (child) {
|
||||
'use strict';
|
||||
this.children.push(child);
|
||||
};
|
||||
VMeta.prototype.mapToString = function () {
|
||||
'use strict';
|
||||
var output = "";
|
||||
this.properties.forEach(function (value, key, map) {
|
||||
output += (NEW_LINE + key + ":" + value);
|
||||
});
|
||||
return output;
|
||||
};
|
||||
VMeta.prototype.childrenToString = function () {
|
||||
'use strict';
|
||||
var output = "";
|
||||
this.children.forEach(function (child) {
|
||||
output += (NEW_LINE + child.toString());
|
||||
});
|
||||
return output;
|
||||
};
|
||||
VMeta.prototype.toString = function () {
|
||||
'use strict';
|
||||
var output = "BEGIN:" + this.tag;
|
||||
output += this.mapToString();
|
||||
output += this.childrenToString();
|
||||
output += (NEW_LINE + "END:" + this.tag);
|
||||
return output;
|
||||
};
|
||||
|
||||
function VCalendar(calendarName) {
|
||||
'use strict';
|
||||
VMeta.call(this);
|
||||
this.add(VTimeZone.Berlin());
|
||||
this.tag = "VCALENDAR";
|
||||
this.set('X-WR-CALNAME', calendarName);
|
||||
this.set('VERSION', '2.0');
|
||||
this.set('PRODID', productID);
|
||||
this.set('METHOD', "PUBLISH");
|
||||
this.set('X-WR-TIMEZONE', "Europe/Berlin");
|
||||
this.set('CALSCALE', "GREGORIAN");
|
||||
};
|
||||
VCalendar.prototype = Object.create(VMeta.prototype);
|
||||
VCalendar.prototype.constructor = VCalendar;
|
||||
|
||||
function VEvent() {
|
||||
var evt = window.event || arguments[1] || arguments.callee.caller.arguments[0];
|
||||
var target = evt.target || evt.srcElement;
|
||||
|
||||
var options = {};
|
||||
|
||||
if (arguments[0]) options = arguments[0];
|
||||
|
||||
var default_args = {
|
||||
'tzName' : "Europe/Berlin",
|
||||
'startMoment' : moment(),
|
||||
'endMoment' : moment(),
|
||||
'uid' : VMeta.generateUID(),
|
||||
'dtStamp' : VMeta.formatDate(moment()) + "Z",
|
||||
'title' : "",
|
||||
'description' : "",
|
||||
'location' : "",
|
||||
'organizer' : "",
|
||||
|
||||
}
|
||||
for (var index in default_args) {
|
||||
if (typeof options[index] == "undefined") options[index] = default_args[index];
|
||||
}
|
||||
|
||||
VMeta.call(this);
|
||||
this.tag = "VEVENT";
|
||||
|
||||
this.set('DTSTART;TZID=' + options.tzName, VMeta.formatDate(options.startMoment));
|
||||
this.set('DTEND;TZID=' + options.tzName, VMeta.formatDate(options.endMoment));
|
||||
this.set('DTSTAMP', options.dtStamp);
|
||||
this.set('UID', options.uid);
|
||||
this.set('SUMMARY', options.title);
|
||||
this.set('DESCRIPTION', options.description);
|
||||
this.set('LOCATION', options.location)
|
||||
this.set('CLASS', "PUBLIC");
|
||||
this.set('TRANSP', "OPAQUE");
|
||||
this.set('STATUS', "CONFIRMED");
|
||||
this.set('ORGANIZER', options.organizer);
|
||||
}
|
||||
|
||||
VEvent.prototype = Object.create(VMeta.prototype);
|
||||
VEvent.prototype.constructor = VEvent;
|
||||
|
||||
function VTimeZone() {
|
||||
VMeta.call(this);
|
||||
this.tag = "VTIMEZONE";
|
||||
}
|
||||
VTimeZone.prototype = Object.create(VMeta.prototype);
|
||||
VTimeZone.prototype.constructor = VTimeZone;
|
||||
VTimeZone.Berlin = function () {
|
||||
var tz = new VTimeZone();
|
||||
tz.children = [VTimeDef.MESZ(), VTimeDef.MEZ()];
|
||||
tz.set("TZID", "Europe/Berlin");
|
||||
return tz;
|
||||
}
|
||||
|
||||
function VTimeDef(name) {
|
||||
VMeta.call(this);
|
||||
this.tag = name;
|
||||
}
|
||||
VTimeDef.prototype = Object.create(VMeta.prototype);
|
||||
VTimeDef.prototype.constructor = VTimeDef;
|
||||
VTimeDef.MESZ = function () {
|
||||
var timedef = new VTimeDef("DAYLIGHT");
|
||||
timedef.set("TZOFFSETFROM", "+0100");
|
||||
timedef.set("RRULE", "FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU");
|
||||
timedef.set("DTSTART", "19819329T020000");
|
||||
timedef.set("TZNAME", "MESZ");
|
||||
timedef.set("TZOFFSETTO", "+0200");
|
||||
return timedef;
|
||||
}
|
||||
VTimeDef.MEZ = function () {
|
||||
var timedef = new VTimeDef("STANDARD");
|
||||
timedef.set("TZOFFSETFROM", "+0200");
|
||||
timedef.set("RRULE", "FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU");
|
||||
timedef.set("DTSTART", "19961027T030000");
|
||||
timedef.set("TZNAME", "MEZ");
|
||||
timedef.set("TZOFFSETTO", "+0100");
|
||||
return timedef;
|
||||
}
|
||||
Reference in New Issue
Block a user