Merge pull request 'dev' (#3) from dev into master

Reviewed-on: #3
This commit is contained in:
Christian Seyfferth 2022-07-30 12:42:41 +02:00
commit 30467e27b1
6 changed files with 275 additions and 212 deletions

8
.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

5
.idea/codeStyles/codeStyleConfig.xml generated Normal file
View File

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>

8
.idea/modules.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/orchester_dienstplan.iml" filepath="$PROJECT_DIR$/.idea/orchester_dienstplan.iml" />
</modules>
</component>
</project>

8
.idea/orchester_dienstplan.iml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

290
app.js
View File

@ -7,11 +7,11 @@ if (!String.prototype.includes) {
//extend FileReader //extend FileReader
if (!FileReader.prototype.readAsBinaryString) { if (!FileReader.prototype.readAsBinaryString) {
FileReader.prototype.readAsBinaryString = function (fileData) { FileReader.prototype.readAsBinaryString = function (fileData) {
var binary = ""; var binary = "";
var pt = this; var pt = this;
var reader = new FileReader(); var reader = new FileReader();
reader.onload = function (e) { reader.onload = function (e) {
var bytes = new Uint8Array(reader.result); var bytes = new Uint8Array(reader.result);
var length = bytes.byteLength; var length = bytes.byteLength;
for (var i = 0; i < length; i++) { for (var i = 0; i < length; i++) {
binary += String.fromCharCode(bytes[i]); binary += String.fromCharCode(bytes[i]);
@ -26,21 +26,21 @@ if (!FileReader.prototype.readAsBinaryString) {
//localStorage persistence //localStorage persistence
var SHIFT_STORAGE_KEY = "dienstplan_chrosey"; var SHIFT_STORAGE_KEY = "dienstplan_chrosey";
var RULE_STORAGE_KEY = "regeln_chrosey"; var RULE_STORAGE_KEY = "regeln_chrosey";
var shiftStorage = { var shiftStorage = {
fetch: function () { fetch: function () {
'use strict'; 'use strict';
var parsed = JSON.parse(localStorage.getItem(SHIFT_STORAGE_KEY) || '[]'), var parsed = JSON.parse(localStorage.getItem(SHIFT_STORAGE_KEY) || '[]'),
shifts = []; shifts = [];
parsed.forEach(function (el, index) { parsed.forEach(function (el, index) {
var shift = Shift.thaw(el); var shift = Shift.thaw(el);
shift.id = index; shift.id = index;
shifts.push(shift); shifts.push(shift);
}); });
shiftStorage.uid = shifts.length; shiftStorage.uid = shifts.length;
return shifts; return shifts;
}, },
save: function (shifts) { save : function (shifts) {
'use strict'; 'use strict';
var json = JSON.stringify(shifts) var json = JSON.stringify(shifts)
localStorage.setItem(SHIFT_STORAGE_KEY, json); localStorage.setItem(SHIFT_STORAGE_KEY, json);
@ -49,21 +49,21 @@ var shiftStorage = {
return JSON.parse(localStorage.getItem(SHIFT_STORAGE_KEY) || '[]').length; return JSON.parse(localStorage.getItem(SHIFT_STORAGE_KEY) || '[]').length;
} }
}; };
var ruleStorage = { var ruleStorage = {
fetch: function () { fetch: function () {
'use strict'; 'use strict';
var parsed = JSON.parse(localStorage.getItem(RULE_STORAGE_KEY)) | []; var parsed = JSON.parse(localStorage.getItem(RULE_STORAGE_KEY)) | [];
var rules = parsed.length > 0 ? var rules = parsed.length > 0 ?
parsed.map((e, i) => { parsed.map((e, i) => {
var r = Rule.thaw(e); var r = Rule.thaw(e);
r.id = i; r.id = i;
return r; return r;
}) : }) :
Rule.defaults(); Rule.defaults();
ruleStorage.uid = rules.length; ruleStorage.uid = rules.length;
return rules; return rules;
}, },
save: function (rules) { save : function (rules) {
'use strict'; 'use strict';
var json = JSON.stringify(rules); var json = JSON.stringify(rules);
localStorage.setItem(RULE_STORAGE_KEY, json); localStorage.setItem(RULE_STORAGE_KEY, json);
@ -92,7 +92,7 @@ Vue.component('ask-format-modal', {
picked: null picked: null
} }
}, },
props: ["options"], props : ["options"],
methods: { methods: {
submitPick() { submitPick() {
this.$emit('picked-format', this.picked); this.$emit('picked-format', this.picked);
@ -109,7 +109,7 @@ Vue.component('chip-input', {
data() { data() {
return { return {
instance: null, instance: null,
chips: [] chips : []
} }
}, },
@ -131,17 +131,17 @@ Vue.component('chip-input', {
} }
}, },
props: { props: {
name: String, name : String,
initData: Array initData: Array
}, },
methods: { methods: {
initialize() { initialize() {
this.chips = this.initData.map(e => e); this.chips = this.initData.map(e => e);
var el = $('#' + this.name)[0]; var el = $('#' + this.name)[0];
this.instance = M.Chips.init(el, { this.instance = M.Chips.init(el, {
data: this.chips, data : this.chips,
onChipAdd: () => { onChipAdd : () => {
this.$emit("change", this.chipsData); this.$emit("change", this.chipsData);
}, },
onChipDelete: () => { onChipDelete: () => {
@ -157,39 +157,39 @@ Vue.component('chip-input', {
}); });
var app = new Vue({ var app = new Vue({
el: '#app', el : '#app',
data: { data : {
shifts: shiftStorage.fetch(), shifts : shiftStorage.fetch(),
rules: ruleStorage.fetch(), rules : ruleStorage.fetch(),
icsFile: null, icsFile : null,
blob: null, blob : null,
dp_sheet: '', dp_sheet : '',
deletedShift: '', deletedShift : '',
format: '', format : '',
remaining: shiftStorage.count(), remaining : shiftStorage.count(),
selectedShift: new Shift({}), selectedShift : new Shift({}),
selectedShiftIndex: -1, selectedShiftIndex: -1,
selectedRule: new Rule({}), selectedRule : new Rule({}),
selectedRuleIndex: -1, selectedRuleIndex : -1,
saveto: 'dienstplan.ics', saveto : 'dienstplan.ics',
uploadFileName: "", uploadFileName : "",
availableFormats: ["Erfurt", "Stuttgart", "X"], availableFormats : ["Erfurt", "Stuttgart", "X"],
stepper: null, stepper : null,
timepickers: null, timepickers : null,
config: { config: {
moment: { moment : {
parse_formats: [ parse_formats : [
"ddd, DD/ MMM. 'YY HH:mm", "ddd, DD/ MMM. 'YY HH:mm",
"ddd, DD/ MMM. YYYY HH:mm" "ddd, DD/ MMM. YYYY HH:mm"
], ],
parse_language: 'en', parse_language : 'en',
display_language: 'de' display_language: 'de'
}, },
stepper: { stepper : {
firstActive: 0, firstActive: 0,
}, },
toast: { toast : {
displayLength: 3000 displayLength: 3000
}, },
timepicker: { timepicker: {
@ -203,19 +203,19 @@ var app = new Vue({
'use strict'; 'use strict';
shiftStorage.save(shifts); shiftStorage.save(shifts);
this.remaining = shifts.length; this.remaining = shifts.length;
this.icsFile = null; this.icsFile = null;
this.blob = null; this.blob = null;
this.makeToast("Änderungen gespeichert."); this.makeToast("Änderungen gespeichert.");
}, },
deep: true deep : true
}, },
rules: { rules : {
handler: function (rules) { handler: function (rules) {
'use strict'; 'use strict';
ruleStorage.save(rules); ruleStorage.save(rules);
this.makeToast("Änderungen gespeichert."); this.makeToast("Änderungen gespeichert.");
}, },
deep: true deep : true
} }
}, },
@ -225,7 +225,7 @@ var app = new Vue({
} }
}, },
methods: { methods : {
updateArten(value) { updateArten(value) {
this.selectedRule.Arten = value; this.selectedRule.Arten = value;
}, },
@ -235,20 +235,20 @@ var app = new Vue({
}, },
makeToast(message) { makeToast(message) {
var toastOptions = this.config.toast; var toastOptions = this.config.toast;
toastOptions.html = message; toastOptions.html = message;
M.toast(toastOptions); M.toast(toastOptions);
}, },
openModal(elementID) { openModal(elementID) {
var element = document.getElementById(elementID); var element = document.getElementById(elementID);
var modal = M.Modal.getInstance(element); var modal = M.Modal.getInstance(element);
modal.open(); modal.open();
}, },
closeModal(elementID) { closeModal(elementID) {
var element = document.getElementById(elementID); var element = document.getElementById(elementID);
var modal = M.Modal.getInstance(element); var modal = M.Modal.getInstance(element);
modal.close(); modal.close();
}, },
@ -261,12 +261,12 @@ var app = new Vue({
}, },
handleInputFile: function (file) { handleInputFile: function (file) {
var reader = new FileReader(); var reader = new FileReader();
var vm = this; var vm = this;
reader.onload = (e) => { reader.onload = (e) => {
var data = !e ? reader.content : e.target.result; var data = !e ? reader.content : e.target.result;
var workbook = XLSX.read(data, { var workbook = XLSX.read(data, {
type: 'binary', type : 'binary',
cellDates: true, cellDates: true,
}); });
var isErfurterDienstplan = workbook.SheetNames.indexOf("Dienstplan") > -1; var isErfurterDienstplan = workbook.SheetNames.indexOf("Dienstplan") > -1;
@ -287,11 +287,11 @@ var app = new Vue({
}, },
parseForErfurt: function (dp) { parseForErfurt: function (dp) {
var arr = XLSX.utils.sheet_to_row_object_array(dp, { var arr = XLSX.utils.sheet_to_row_object_array(dp, {
range: 1 range: 1
}); });
this.format = "Erfurt"; this.format = "Erfurt";
var vm = this; var vm = this;
var day; var day;
this.makeToast("Erfurter Dienstplan erkannt."); this.makeToast("Erfurter Dienstplan erkannt.");
@ -301,54 +301,86 @@ var app = new Vue({
if (element.hasOwnProperty('Datum')) { if (element.hasOwnProperty('Datum')) {
day = moment(element.Datum); day = moment(element.Datum);
} }
if (element.hasOwnProperty('Bemerkung')) {
if (element.Bemerkung.toString().search(/\d\d:\d\d\s/) >= 0) {
// prüfe ob eine Uhrzeit drinnen steht
let sonderzeit = moment(element.Bemerkung, 'HH:mm');
let name = element.Bemerkung.toString().replace(/\d\d:\d\d\s/, '').trim();
let splittedName = name.split(' ');
let terminArt = '';
splittedName.forEach(function (item) {
vm.rules.forEach(function (rule) {
rule.Arten.forEach(function (art) {
if (art.tag == item) {
terminArt = art.tag;
name.replace(art.tag, '');
}
})
})
});
let termin = {
datum : day.clone().hour(sonderzeit.hour()).minute(sonderzeit.minute()),
art : terminArt,
beschreibung: '',
name : name.trim()
}
vm.addShift(new Shift(termin));
beschreibung = '';
}
}
if (element.hasOwnProperty('Dienst')) { if (element.hasOwnProperty('Dienst')) {
let times = []; let times = [];
let art, beschreibung, name = ""; let art, beschreibung, name = "";
if (element.Zeit.toString().indexOf(' + ') > 0) { if (element.Zeit.toString().indexOf(' + ') > 0) {
// in der Zeitspalte stehen mehrere Uhrzeiten. // in der Zeitspalte stehen mehrere Uhrzeiten.
let tempTimes = element.Zeit.toString().split(' + '); let tempTimes = element.Zeit.toString().split(' + ');
tempTimes.forEach(function(time) { tempTimes.forEach(function (time) {
let mom = moment(time, 'HH:mm'); let mom = moment(time, 'HH:mm');
times.push([mom.hour(), mom.minute()]); times.push([mom.hour(), mom.minute()]);
}) })
} else if (element.Zeit.toString().indexOf(' - ') > 0) {
// in der Zeitspalte stehen mehrere Uhrzeiten als Zeitspanne
let tempTimes = element.Zeit.toString().split(' - ');
let mom = moment(tempTimes[0], 'HH:mm');
let momEnd = moment(tempTimes[1], 'HH:mm');
times.push([mom.hour(), mom.minute(), momEnd.hour(), momEnd.minute()]);
} else { } else {
if (element.Zeit) { if (element.Zeit) {
let mom = moment(element.Zeit); let mom = moment(element.Zeit);
times.push([mom.hour(), mom.minute()]); times.push([mom.hour(), mom.minute()]);
} else { } else {
times.push([0,0]); times.push([0, 0]);
} }
} }
if (element.hasOwnProperty('Bemerkung')) {
if (element.Bemerkung.toString().search(/\d\d:\d\d\s/) >= 0) { art = element.Dienst.trim();
// prüfe ob eine Uhrzeit drinnen steht
let sonderzeit = moment(element.Bemerkung, 'HH:mm');
let termin = {
datum: day.clone().hour(sonderzeit.hour()).minute(sonderzeit.minute()),
art: '',
beschreibung: '',
name: element.Bemerkung.toString().replace(/\d\d:\d\d\s/, '').trim()
}
vm.addShift(new Shift(termin));
beschreibung = '';
} else {
beschreibung = element.Bemerkung;
}
}
if (element.hasOwnProperty('Dienst')) {
art = element.Dienst.trim();
}
if (element.hasOwnProperty('__EMPTY')) { if (element.hasOwnProperty('__EMPTY')) {
name = element.__EMPTY.trim(); name = element.__EMPTY.trim();
} }
if (element.hasOwnProperty('Bemerkung')
&& element.Bemerkung.toString().search(/\d\d:\d\d\s/) == -1) {
beschreibung = element.Bemerkung;
}
times.forEach(time => { times.forEach(time => {
var termin = { var termin = {
datum: day.clone().hour(time[0]).minute(time[1]), datum : day.clone().hour(time[0]).minute(time[1]),
art: art, art : art,
beschreibung: beschreibung, beschreibung: beschreibung,
name: name name : name
}
if (time.length === 4) {
// Wenn die Zeit mehr Werte hat, dann behandle die nächsten 2 als ende
termin.end = day.clone().hour(time[2]).minute(time[3]);
termin.dontSetDurationFromRules = true;
} }
vm.addShift(new Shift(termin)); vm.addShift(new Shift(termin));
}); });
@ -358,7 +390,7 @@ var app = new Vue({
}, },
changeTime: function (hours) { changeTime: function (hours) {
let temp = this.shifts; let temp = this.shifts;
this.shifts = []; this.shifts = [];
temp.forEach(shift => { temp.forEach(shift => {
shift.updateBeginn(hours); shift.updateBeginn(hours);
@ -373,10 +405,10 @@ var app = new Vue({
parseForStuttgart: function (dp) { parseForStuttgart: function (dp) {
var arr = XLSX.utils.sheet_to_json(dp, { var arr = XLSX.utils.sheet_to_json(dp, {
header: "A", header : "A",
blankrows: false, blankrows: false,
}); });
var vm = this; var vm = this;
var day; var day;
this.makeToast("Stuttgarter Dienstplan erkannt."); this.makeToast("Stuttgarter Dienstplan erkannt.");
@ -388,20 +420,20 @@ var app = new Vue({
} }
if (element.hasOwnProperty('D') && moment(element.D, "HH:mm").isValid()) { if (element.hasOwnProperty('D') && moment(element.D, "HH:mm").isValid()) {
var termin = { var termin = {
ort: element.H ? element.H.trim() : "", ort : element.H ? element.H.trim() : "",
art: element.E ? element.E.trim() : "", art : element.E ? element.E.trim() : "",
beschreibung: element.H ? element.H.trim() : "", beschreibung: element.H ? element.H.trim() : "",
name: element.F ? element.F.trim() : "" name : element.F ? element.F.trim() : ""
} }
var time = day.clone(); var time = day.clone();
if (typeof (element.D) === "object") { if (typeof (element.D) === "object") {
time = moment(element.D); time = moment(element.D);
termin.datum = day.clone().hour(time.hour()).minute(time.minute()); termin.datum = day.clone().hour(time.hour()).minute(time.minute());
} else if (element.D.indexOf("-") > -1) { } else if (element.D.indexOf("-") > -1) {
var tArray = element.D.split(" - "); var tArray = element.D.split(" - ");
time = moment(tArray[0], "HH:mm"); time = moment(tArray[0], "HH:mm");
termin.datum = day.clone().hour(time.hour()).minute(time.minute()); termin.datum = day.clone().hour(time.hour()).minute(time.minute());
termin.ende = moment(tArray[1], "HH:mm").format("HH:mm"); termin.ende = moment(tArray[1], "HH:mm").format("HH:mm");
} }
vm.addShift(new Shift(termin)); vm.addShift(new Shift(termin));
@ -411,17 +443,17 @@ var app = new Vue({
parseForX: function (dp, sheetName) { parseForX: function (dp, sheetName) {
moment.locale(this.config.moment.parse_language); moment.locale(this.config.moment.parse_language);
var arr = XLSX.utils.sheet_to_json(dp, { var arr = XLSX.utils.sheet_to_json(dp, {
header: "A", header : "A",
blankrows: false, blankrows: false,
}); });
var vm = this; var vm = this;
var month = moment(sheetName.substr(sheetName.indexOf(" ") + 1), "MMMM YYYY", "de"); var month = moment(sheetName.substr(sheetName.indexOf(" ") + 1), "MMMM YYYY", "de");
var day; var day;
arr.forEach(element => { arr.forEach(element => {
var art, name, beschreibung = null; var art, name, beschreibung = null;
var time = moment().hour(0).minute(0); var time = moment().hour(0).minute(0);
try { try {
if (element.hasOwnProperty('A')) { if (element.hasOwnProperty('A')) {
day = moment(element.A, "D.", "de"); day = moment(element.A, "D.", "de");
@ -434,37 +466,37 @@ var app = new Vue({
if (element.hasOwnProperty("D") && element.hasOwnProperty("E")) { if (element.hasOwnProperty("D") && element.hasOwnProperty("E")) {
// Probe // Probe
time = moment(element.D); time = moment(element.D);
art = element.E.trim(); art = element.E.trim();
name = element.F ? element.F.trim() : ""; name = element.F ? element.F.trim() : "";
beschreibung = typeof (element.I) != 'undefined' ? element.I.trim() : beschreibung = typeof (element.I) != 'undefined' ? element.I.trim() :
typeof (element.J) != 'undefined' ? element.J.trim() : typeof (element.J) != 'undefined' ? element.J.trim() :
""; "";
} else if (element.hasOwnProperty("G") && element.hasOwnProperty("H")) { } else if (element.hasOwnProperty("G") && element.hasOwnProperty("H")) {
// Vorstellung // Vorstellung
time = moment(element.G); time = moment(element.G);
art = "VS"; art = "VS";
name = element.H.trim(); name = element.H.trim();
beschreibung = typeof (element.I) != 'undefined' ? element.I.trim() : beschreibung = typeof (element.I) != 'undefined' ? element.I.trim() :
typeof (element.J) != 'undefined' ? element.J.trim() : typeof (element.J) != 'undefined' ? element.J.trim() :
""; "";
} else if (element.hasOwnProperty("I")) { } else if (element.hasOwnProperty("I")) {
// Spielort/Extras // Spielort/Extras
beschreibung = element.I.trim(); beschreibung = element.I.trim();
name = name ? name : "Spielort/Extras"; name = name ? name : "Spielort/Extras";
} else if (element.hasOwnProperty("J")) { } else if (element.hasOwnProperty("J")) {
// Spielort/Extras Fallback // Spielort/Extras Fallback
beschreibung = element.J.trim(); beschreibung = element.J.trim();
name = name ? name : "Spielort/Extras"; name = name ? name : "Spielort/Extras";
} }
var datumStr = day + '.' + month.clone().format("MM.YY") + time.format(" HH:mm"); var datumStr = day + '.' + month.clone().format("MM.YY") + time.format(" HH:mm");
var termin = { var termin = {
ort: "", ort : "",
art: art, art : art,
beschreibung: beschreibung, beschreibung: beschreibung,
name: name, name : name,
datum: moment(datumStr, "D.MM.YY HH:mm") datum : moment(datumStr, "D.MM.YY HH:mm")
} }
vm.addShift(new Shift(termin)); vm.addShift(new Shift(termin));
} }
@ -516,7 +548,7 @@ var app = new Vue({
vCal.add(shift.toVEvent()); vCal.add(shift.toVEvent());
}); });
var calString = vCal.toString(); var calString = vCal.toString();
this.blob = new Blob([calString], { this.blob = new Blob([calString], {
type: 'text/plain' type: 'text/plain'
}); });
@ -546,18 +578,18 @@ var app = new Vue({
this.shifts.splice(this.shifts.indexOf(this.keepShift), 1, changedShift); this.shifts.splice(this.shifts.indexOf(this.keepShift), 1, changedShift);
this.closeModal('shiftModal'); this.closeModal('shiftModal');
this.keepShift = ''; this.keepShift = '';
this.selectedShift = ''; this.selectedShift = '';
}, },
discardChanges: function (changedShift) { discardChanges: function (changedShift) {
this.closeModal('shiftModal'); this.closeModal('shiftModal');
this.keepShift = ''; this.keepShift = '';
this.selectedShift = ''; this.selectedShift = '';
}, },
editRule: function (rule) { editRule: function (rule) {
this.selectedRule = Rule.thaw(rule); this.selectedRule = Rule.thaw(rule);
this.selectedRuleIndex = this.rules.indexOf(rule); this.selectedRuleIndex = this.rules.indexOf(rule);
this.openModal('ruleModal'); this.openModal('ruleModal');
}, },
@ -591,11 +623,11 @@ var app = new Vue({
} }
} }
}, },
mounted: function () { mounted : function () {
M.AutoInit(); M.AutoInit();
var els = document.querySelectorAll('.timepicker'); var els = document.querySelectorAll('.timepicker');
this.timepickers = M.Timepicker.init(els, this.config.timepicker); this.timepickers = M.Timepicker.init(els, this.config.timepicker);
var el = document.querySelector(".stepper"); var el = document.querySelector(".stepper");
this.stepper = new MStepper(el, this.config.stepper); this.stepper = new MStepper(el, this.config.stepper);
} }
}) })

View File

@ -1,16 +1,16 @@
var DATE_LOCALE_FORMAT = "D.M.YY"; //10.2.16 var DATE_LOCALE_FORMAT = "D.M.YY"; //10.2.16
var DATE_INPUT_FORMAT = "YYYY-MM-DD"; //2016-02-10 var DATE_INPUT_FORMAT = "YYYY-MM-DD"; //2016-02-10
var TIME_FORMAT = "HH:mm"; // 17:30 var TIME_FORMAT = "HH:mm"; // 17:30
var WEEKDAY_FORMAT = "dddd"; //Monday var WEEKDAY_FORMAT = "dddd"; //Monday
var MOMENT_LOCALE = "de"; var MOMENT_LOCALE = "de";
var TIMEZONE_NAME = "Europe/Berlin"; var TIMEZONE_NAME = "Europe/Berlin";
//requires moment.js //requires moment.js
Array.prototype.asChipData = function () { Array.prototype.asChipData = function () {
return this.map((e, i) => { return this.map((e, i) => {
return { return {
tag: e, tag: e,
id: i id : i
}; };
}) })
} }
@ -29,19 +29,19 @@ function Rule() {
'arten': [], 'arten': [],
'dauer': 60, 'dauer': 60,
'titel': [], 'titel': [],
'name': "Standard" 'name' : "Standard"
} }
for (var index in default_args) { for (var index in default_args) {
if (typeof options[index] == "undefined") options[index] = default_args[index]; if (typeof options[index] == "undefined") options[index] = default_args[index];
} }
this._duration = options.dauer; this._duration = options.dauer;
this._arten = options.arten; this._arten = options.arten;
this._titel = options.titel; this._titel = options.titel;
this._name = options.name; this._name = options.name;
} }
Rule.prototype = { Rule.prototype = {
get Dauer() { get Dauer() {
return this._duration; return this._duration;
}, },
@ -71,7 +71,7 @@ Rule.prototype = {
}, },
}; };
Rule.prototype.fits = function (art, title) { Rule.prototype.fits = function (art, title) {
var artMatch = false; var artMatch = false;
var nameMatch = false; var nameMatch = false;
if (this._arten.length == 0) artMatch = true; if (this._arten.length == 0) artMatch = true;
@ -90,54 +90,54 @@ Rule.prototype.fits = function (art, title) {
return artMatch && nameMatch; return artMatch && nameMatch;
} }
Rule.thaw = function (json) { Rule.thaw = function (json) {
return new Rule({ return new Rule({
dauer: json._duration, dauer: json._duration,
name: json._name, name : json._name,
arten: json._arten, arten: json._arten,
titel: json._titel titel: json._titel
}); });
} }
Rule.defaults = function () { Rule.defaults = function () {
var rules = []; var rules = [];
var input = [{ var input = [{
name: "EF #01", name : "EF #01",
dauer: 60, dauer: 60,
arten: ['VS'], arten: ['VS'],
titel: ['Kinderkonzert'] titel: ['Kinderkonzert']
}, },
{ {
name: "EF #02", name : "EF #02",
dauer: 120, dauer: 120,
arten: ['VS'], arten: ['VS'],
titel: ["Expeditionskonzert", "Sinfoniekonzert"] titel: ["Expeditionskonzert", "Sinfoniekonzert"]
}, },
{ {
name: "EF #03", name : "EF #03",
dauer: 150, dauer: 150,
arten: ['Oa', 'GP'], arten: ['Oa', 'GP'],
titel: ['Expeditionskonzert'] titel: ['Expeditionskonzert']
}, },
{ {
name: "EF #04", name : "EF #04",
dauer: 60, dauer: 60,
arten: ['Oa', 'GP'], arten: ['Oa', 'GP'],
titel: ['Expeditionskonzert'] titel: ['Expeditionskonzert']
}, },
{ {
name: "EF #05", name : "EF #05",
dauer: 150, dauer: 150,
arten: ['Oa', 'OSP'] arten: ['Oa', 'OSP']
}, },
{ {
name: "EF #06", name : "EF #06",
dauer: 180, dauer: 180,
arten: ["VS", "BO", "OHP", "HP", "GP", "Prem", "WA"] arten: ["VS", "BO", "OHP", "HP", "GP", "Prem", "WA"]
}, },
{ {
name: "Standard", name : "Standard",
dauer: 60 dauer: 60
} }
]; ];
input.forEach(e => { input.forEach(e => {
rules.push(new Rule(e)); rules.push(new Rule(e));
@ -145,7 +145,7 @@ Rule.defaults = function () {
return rules; return rules;
} }
var DURATION_RULES = Rule.defaults(); var DURATION_RULES = Rule.defaults();
function Shift() { function Shift() {
var options = {}; var options = {};
@ -153,22 +153,24 @@ function Shift() {
if (arguments[0]) options = arguments[0]; if (arguments[0]) options = arguments[0];
var default_args = { var default_args = {
'art': "", 'art' : "",
'name': "DUMMY", 'name' : "DUMMY",
'datum': moment(), 'datum' : moment(),
'end' : moment(),
'beschreibung': "", 'beschreibung': "",
'ort': "", 'ort' : "",
} }
for (var index in default_args) { for (var index in default_args) {
if (typeof options[index] == "undefined") options[index] = default_args[index]; if (typeof options[index] == "undefined") options[index] = default_args[index];
} }
this.Datum = options.datum.format(DATE_INPUT_FORMAT); this.Datum = options.datum.format(DATE_INPUT_FORMAT);
this.Beginn = options.datum.format(TIME_FORMAT); this.Beginn = options.datum.format(TIME_FORMAT);
this.Art = options.art; this.Ende = options.end.format(TIME_FORMAT);
this.Art = options.art;
this.Beschreibung = options.beschreibung; this.Beschreibung = options.beschreibung;
this.Name = options.name; this.Name = options.name;
this.Ort = options.ort; this.Ort = options.ort;
if (typeof options.ende != "undefined") { if (typeof options.ende != "undefined") {
this.Ende = options.ende; this.Ende = options.ende;
@ -180,7 +182,7 @@ function Shift() {
} }
Shift.prototype = { Shift.prototype = {
get Wochentag() { get Wochentag() {
return this._date.clone().locale(MOMENT_LOCALE).format(WEEKDAY_FORMAT); return this._date.clone().locale(MOMENT_LOCALE).format(WEEKDAY_FORMAT);
}, },
@ -193,7 +195,7 @@ Shift.prototype = {
}, },
set FormattedDatum(value) { set FormattedDatum(value) {
var dateMoment = moment(value, DATE_LOCALE_FORMAT); var dateMoment = moment(value, DATE_LOCALE_FORMAT);
this._date = dateMoment; this._date = dateMoment;
}, },
get Datum() { get Datum() {
@ -201,7 +203,7 @@ Shift.prototype = {
}, },
set Datum(value) { set Datum(value) {
var dateMoment = moment(value).startOf('day'); var dateMoment = moment(value).startOf('day');
this._date = dateMoment.clone(); this._date = dateMoment.clone();
}, },
get Beginn() { get Beginn() {
@ -209,7 +211,7 @@ Shift.prototype = {
}, },
set Beginn(value) { set Beginn(value) {
var dateMoment = moment(this.Datum + " " + value, DATE_INPUT_FORMAT + " " + TIME_FORMAT); var dateMoment = moment(this.Datum + " " + value, DATE_INPUT_FORMAT + " " + TIME_FORMAT);
this._begin = dateMoment.clone(); this._begin = dateMoment.clone();
}, },
get Ende() { get Ende() {
var ende = this._begin.clone().add(this._duration).format(TIME_FORMAT); var ende = this._begin.clone().add(this._duration).format(TIME_FORMAT);
@ -267,15 +269,15 @@ Shift.prototype = {
} }
} }
Shift.setDurationFromRules = function (shift, rules) { Shift.setDurationFromRules = function (shift, rules) {
'use strict'; 'use strict';
var isAllDayEvent = shift.Beginn == "00:00"; var isAllDayEvent = shift.Beginn == "00:00";
if (isAllDayEvent) { if (isAllDayEvent) {
shift.Dauer = moment.duration(24, 'h').locale(MOMENT_LOCALE); shift.Dauer = moment.duration(24, 'h').locale(MOMENT_LOCALE);
return; return;
} }
var art = shift.Art.toLowerCase(); var art = shift.Art.toLowerCase();
var titel = shift.Name.toLowerCase(); var titel = shift.Name.toLowerCase();
var duration = 60; var duration = 60;
for (var rIndex in rules) { for (var rIndex in rules) {
var rule = rules[rIndex]; var rule = rules[rIndex];
@ -287,31 +289,31 @@ Shift.setDurationFromRules = function (shift, rules) {
} }
shift.Dauer = moment.duration(duration, 'm').locale(MOMENT_LOCALE); shift.Dauer = moment.duration(duration, 'm').locale(MOMENT_LOCALE);
} }
Shift.prototype.toVEvent = function () { Shift.prototype.toVEvent = function () {
var end = this._begin.clone().add(this._duration); var end = this._begin.clone().add(this._duration);
return new VEvent({ return new VEvent({
startMoment: this._begin, startMoment: this._begin,
endMoment: end, endMoment : end,
title: this.VEventTitle, title : this.VEventTitle,
description: this.Beschreibung, description: this.Beschreibung,
location: this.Ort location : this.Ort
}); });
}; };
Shift.thaw = function (jsonShift) { Shift.thaw = function (jsonShift) {
moment.locale(MOMENT_LOCALE); moment.locale(MOMENT_LOCALE);
var begin = moment(jsonShift._begin); var begin = moment(jsonShift._begin);
var shift = new Shift({ var shift = new Shift({
art: jsonShift._kind, art : jsonShift._kind,
name: jsonShift._name, name : jsonShift._name,
datum: begin, datum : begin,
beschreibung: jsonShift._description, beschreibung: jsonShift._description,
ort: jsonShift._ort, ort : jsonShift._ort,
}); });
shift.id = jsonShift.id; shift.id = jsonShift.id;
shift.Dauer = moment.duration(jsonShift._duration); shift.Dauer = moment.duration(jsonShift._duration);
return shift; return shift;
}; };
Shift.prototype.updateBeginn = function(hour) { Shift.prototype.updateBeginn = function (hour) {
this._begin = this._begin.add('hours', hour); this._begin = this._begin.add('hours', hour);
} }