diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -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 diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..a55e7a1 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..4d6fce5 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/orchester_dienstplan.iml b/.idea/orchester_dienstplan.iml new file mode 100644 index 0000000..c956989 --- /dev/null +++ b/.idea/orchester_dienstplan.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app.js b/app.js index 7e3c2e7..764ab3f 100644 --- a/app.js +++ b/app.js @@ -7,11 +7,11 @@ if (!String.prototype.includes) { //extend FileReader if (!FileReader.prototype.readAsBinaryString) { FileReader.prototype.readAsBinaryString = function (fileData) { - var binary = ""; - var pt = this; - var reader = new FileReader(); + var binary = ""; + var pt = this; + var reader = new FileReader(); reader.onload = function (e) { - var bytes = new Uint8Array(reader.result); + var bytes = new Uint8Array(reader.result); var length = bytes.byteLength; for (var i = 0; i < length; i++) { binary += String.fromCharCode(bytes[i]); @@ -26,21 +26,21 @@ if (!FileReader.prototype.readAsBinaryString) { //localStorage persistence var SHIFT_STORAGE_KEY = "dienstplan_chrosey"; -var RULE_STORAGE_KEY = "regeln_chrosey"; -var shiftStorage = { +var RULE_STORAGE_KEY = "regeln_chrosey"; +var shiftStorage = { fetch: function () { 'use strict'; var parsed = JSON.parse(localStorage.getItem(SHIFT_STORAGE_KEY) || '[]'), shifts = []; parsed.forEach(function (el, index) { var shift = Shift.thaw(el); - shift.id = index; + shift.id = index; shifts.push(shift); }); shiftStorage.uid = shifts.length; return shifts; }, - save: function (shifts) { + save : function (shifts) { 'use strict'; var json = JSON.stringify(shifts) localStorage.setItem(SHIFT_STORAGE_KEY, json); @@ -49,21 +49,21 @@ var shiftStorage = { return JSON.parse(localStorage.getItem(SHIFT_STORAGE_KEY) || '[]').length; } }; -var ruleStorage = { +var ruleStorage = { fetch: function () { 'use strict'; - var parsed = JSON.parse(localStorage.getItem(RULE_STORAGE_KEY)) | []; - var rules = parsed.length > 0 ? - parsed.map((e, i) => { - var r = Rule.thaw(e); - r.id = i; - return r; - }) : - Rule.defaults(); + var parsed = JSON.parse(localStorage.getItem(RULE_STORAGE_KEY)) | []; + var rules = parsed.length > 0 ? + parsed.map((e, i) => { + var r = Rule.thaw(e); + r.id = i; + return r; + }) : + Rule.defaults(); ruleStorage.uid = rules.length; return rules; }, - save: function (rules) { + save : function (rules) { 'use strict'; var json = JSON.stringify(rules); localStorage.setItem(RULE_STORAGE_KEY, json); @@ -92,7 +92,7 @@ Vue.component('ask-format-modal', { picked: null } }, - props: ["options"], + props : ["options"], methods: { submitPick() { this.$emit('picked-format', this.picked); @@ -109,7 +109,7 @@ Vue.component('chip-input', { data() { return { instance: null, - chips: [] + chips : [] } }, @@ -131,17 +131,17 @@ Vue.component('chip-input', { } }, props: { - name: String, + name : String, initData: Array }, methods: { initialize() { - this.chips = this.initData.map(e => e); - var el = $('#' + this.name)[0]; + this.chips = this.initData.map(e => e); + var el = $('#' + this.name)[0]; this.instance = M.Chips.init(el, { - data: this.chips, - onChipAdd: () => { + data : this.chips, + onChipAdd : () => { this.$emit("change", this.chipsData); }, onChipDelete: () => { @@ -157,39 +157,39 @@ Vue.component('chip-input', { }); var app = new Vue({ - el: '#app', - data: { - shifts: shiftStorage.fetch(), - rules: ruleStorage.fetch(), - icsFile: null, - blob: null, - dp_sheet: '', - deletedShift: '', - format: '', - remaining: shiftStorage.count(), - selectedShift: new Shift({}), + el : '#app', + data : { + shifts : shiftStorage.fetch(), + rules : ruleStorage.fetch(), + icsFile : null, + blob : null, + dp_sheet : '', + deletedShift : '', + format : '', + remaining : shiftStorage.count(), + selectedShift : new Shift({}), selectedShiftIndex: -1, - selectedRule: new Rule({}), - selectedRuleIndex: -1, - saveto: 'dienstplan.ics', - uploadFileName: "", - availableFormats: ["Erfurt", "Stuttgart", "X"], - stepper: null, - timepickers: null, + selectedRule : new Rule({}), + selectedRuleIndex : -1, + saveto : 'dienstplan.ics', + uploadFileName : "", + availableFormats : ["Erfurt", "Stuttgart", "X"], + stepper : null, + timepickers : null, config: { - moment: { - parse_formats: [ + moment : { + parse_formats : [ "ddd, DD/ MMM. 'YY HH:mm", "ddd, DD/ MMM. YYYY HH:mm" ], - parse_language: 'en', + parse_language : 'en', display_language: 'de' }, - stepper: { + stepper : { firstActive: 0, }, - toast: { + toast : { displayLength: 3000 }, timepicker: { @@ -203,19 +203,19 @@ var app = new Vue({ 'use strict'; shiftStorage.save(shifts); this.remaining = shifts.length; - this.icsFile = null; - this.blob = null; + this.icsFile = null; + this.blob = null; this.makeToast("Änderungen gespeichert."); }, - deep: true + deep : true }, - rules: { + rules : { handler: function (rules) { 'use strict'; ruleStorage.save(rules); this.makeToast("Änderungen gespeichert."); }, - deep: true + deep : true } }, @@ -225,7 +225,7 @@ var app = new Vue({ } }, - methods: { + methods : { updateArten(value) { this.selectedRule.Arten = value; }, @@ -235,20 +235,20 @@ var app = new Vue({ }, makeToast(message) { - var toastOptions = this.config.toast; + var toastOptions = this.config.toast; toastOptions.html = message; M.toast(toastOptions); }, openModal(elementID) { var element = document.getElementById(elementID); - var modal = M.Modal.getInstance(element); + var modal = M.Modal.getInstance(element); modal.open(); }, closeModal(elementID) { var element = document.getElementById(elementID); - var modal = M.Modal.getInstance(element); + var modal = M.Modal.getInstance(element); modal.close(); }, @@ -261,12 +261,12 @@ var app = new Vue({ }, handleInputFile: function (file) { - var reader = new FileReader(); - var vm = this; + var reader = new FileReader(); + var vm = this; reader.onload = (e) => { - var data = !e ? reader.content : e.target.result; - var workbook = XLSX.read(data, { - type: 'binary', + var data = !e ? reader.content : e.target.result; + var workbook = XLSX.read(data, { + type : 'binary', cellDates: true, }); var isErfurterDienstplan = workbook.SheetNames.indexOf("Dienstplan") > -1; @@ -287,11 +287,11 @@ var app = new Vue({ }, 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 }); this.format = "Erfurt"; - var vm = this; + var vm = this; var day; this.makeToast("Erfurter Dienstplan erkannt."); @@ -301,54 +301,86 @@ var app = new Vue({ if (element.hasOwnProperty('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')) { - let times = []; + let times = []; let art, beschreibung, name = ""; if (element.Zeit.toString().indexOf(' + ') > 0) { // in der Zeitspalte stehen mehrere Uhrzeiten. let tempTimes = element.Zeit.toString().split(' + '); - tempTimes.forEach(function(time) { + tempTimes.forEach(function (time) { let mom = moment(time, 'HH:mm'); 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 { if (element.Zeit) { let mom = moment(element.Zeit); times.push([mom.hour(), mom.minute()]); } else { - times.push([0,0]); + times.push([0, 0]); } } - 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 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(); - } + + art = element.Dienst.trim(); + if (element.hasOwnProperty('__EMPTY')) { name = element.__EMPTY.trim(); } + if (element.hasOwnProperty('Bemerkung') + && element.Bemerkung.toString().search(/\d\d:\d\d\s/) == -1) { + beschreibung = element.Bemerkung; + } + times.forEach(time => { var termin = { - datum: day.clone().hour(time[0]).minute(time[1]), - art: art, + datum : day.clone().hour(time[0]).minute(time[1]), + art : art, 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)); }); @@ -358,7 +390,7 @@ var app = new Vue({ }, changeTime: function (hours) { - let temp = this.shifts; + let temp = this.shifts; this.shifts = []; temp.forEach(shift => { shift.updateBeginn(hours); @@ -373,10 +405,10 @@ var app = new Vue({ parseForStuttgart: function (dp) { var arr = XLSX.utils.sheet_to_json(dp, { - header: "A", + header : "A", blankrows: false, }); - var vm = this; + var vm = this; var day; this.makeToast("Stuttgarter Dienstplan erkannt."); @@ -388,20 +420,20 @@ var app = new Vue({ } if (element.hasOwnProperty('D') && moment(element.D, "HH:mm").isValid()) { var termin = { - ort: element.H ? element.H.trim() : "", - art: element.E ? element.E.trim() : "", + ort : element.H ? element.H.trim() : "", + art : element.E ? element.E.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") { - time = moment(element.D); + time = moment(element.D); termin.datum = day.clone().hour(time.hour()).minute(time.minute()); } else if (element.D.indexOf("-") > -1) { - var tArray = element.D.split(" - "); - time = moment(tArray[0], "HH:mm"); + var tArray = element.D.split(" - "); + time = moment(tArray[0], "HH:mm"); 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)); @@ -411,17 +443,17 @@ var app = new Vue({ parseForX: function (dp, sheetName) { moment.locale(this.config.moment.parse_language); - var arr = XLSX.utils.sheet_to_json(dp, { - header: "A", + var arr = XLSX.utils.sheet_to_json(dp, { + header : "A", blankrows: false, }); - var vm = this; + var vm = this; var month = moment(sheetName.substr(sheetName.indexOf(" ") + 1), "MMMM YYYY", "de"); var day; arr.forEach(element => { var art, name, beschreibung = null; - var time = moment().hour(0).minute(0); + var time = moment().hour(0).minute(0); try { if (element.hasOwnProperty('A')) { day = moment(element.A, "D.", "de"); @@ -434,37 +466,37 @@ var app = new Vue({ if (element.hasOwnProperty("D") && element.hasOwnProperty("E")) { // Probe - time = moment(element.D); - art = element.E.trim(); - name = element.F ? element.F.trim() : ""; + time = moment(element.D); + art = element.E.trim(); + name = element.F ? element.F.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")) { // Vorstellung - time = moment(element.G); - art = "VS"; - name = element.H.trim(); + time = moment(element.G); + art = "VS"; + name = element.H.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")) { // Spielort/Extras beschreibung = element.I.trim(); - name = name ? name : "Spielort/Extras"; + name = name ? name : "Spielort/Extras"; } else if (element.hasOwnProperty("J")) { // Spielort/Extras Fallback 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 termin = { - ort: "", - art: art, + var termin = { + ort : "", + art : art, beschreibung: beschreibung, - name: name, - datum: moment(datumStr, "D.MM.YY HH:mm") + name : name, + datum : moment(datumStr, "D.MM.YY HH:mm") } vm.addShift(new Shift(termin)); } @@ -516,7 +548,7 @@ var app = new Vue({ vCal.add(shift.toVEvent()); }); var calString = vCal.toString(); - this.blob = new Blob([calString], { + this.blob = new Blob([calString], { type: 'text/plain' }); @@ -546,18 +578,18 @@ var app = new Vue({ this.shifts.splice(this.shifts.indexOf(this.keepShift), 1, changedShift); this.closeModal('shiftModal'); - this.keepShift = ''; + this.keepShift = ''; this.selectedShift = ''; }, discardChanges: function (changedShift) { this.closeModal('shiftModal'); - this.keepShift = ''; + this.keepShift = ''; this.selectedShift = ''; }, editRule: function (rule) { - this.selectedRule = Rule.thaw(rule); + this.selectedRule = Rule.thaw(rule); this.selectedRuleIndex = this.rules.indexOf(rule); this.openModal('ruleModal'); }, @@ -591,11 +623,11 @@ var app = new Vue({ } } }, - mounted: function () { + mounted : function () { M.AutoInit(); - var els = document.querySelectorAll('.timepicker'); + var els = document.querySelectorAll('.timepicker'); this.timepickers = M.Timepicker.init(els, this.config.timepicker); - var el = document.querySelector(".stepper"); - this.stepper = new MStepper(el, this.config.stepper); + var el = document.querySelector(".stepper"); + this.stepper = new MStepper(el, this.config.stepper); } }) diff --git a/js/shift.js b/js/shift.js index f39e555..2a7f6dd 100644 --- a/js/shift.js +++ b/js/shift.js @@ -1,16 +1,16 @@ 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"; +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 () { +Array.prototype.asChipData = function () { return this.map((e, i) => { return { tag: e, - id: i + id : i }; }) } @@ -29,19 +29,19 @@ function Rule() { 'arten': [], 'dauer': 60, 'titel': [], - 'name': "Standard" + '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; + this._arten = options.arten; + this._titel = options.titel; + this._name = options.name; } -Rule.prototype = { +Rule.prototype = { get Dauer() { return this._duration; }, @@ -71,7 +71,7 @@ Rule.prototype = { }, }; Rule.prototype.fits = function (art, title) { - var artMatch = false; + var artMatch = false; var nameMatch = false; if (this._arten.length == 0) artMatch = true; @@ -90,54 +90,54 @@ Rule.prototype.fits = function (art, title) { return artMatch && nameMatch; } -Rule.thaw = function (json) { +Rule.thaw = function (json) { return new Rule({ dauer: json._duration, - name: json._name, + name : json._name, arten: json._arten, titel: json._titel }); } -Rule.defaults = function () { +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 - } + 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)); @@ -145,7 +145,7 @@ Rule.defaults = function () { return rules; } -var DURATION_RULES = Rule.defaults(); +var DURATION_RULES = Rule.defaults(); function Shift() { var options = {}; @@ -153,22 +153,24 @@ function Shift() { if (arguments[0]) options = arguments[0]; var default_args = { - 'art': "", - 'name': "DUMMY", - 'datum': moment(), + 'art' : "", + 'name' : "DUMMY", + 'datum' : moment(), + 'end' : moment(), 'beschreibung': "", - 'ort': "", + '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.Art = options.art; + 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; + this.Name = options.name; + this.Ort = options.ort; if (typeof options.ende != "undefined") { this.Ende = options.ende; @@ -180,7 +182,7 @@ function Shift() { } -Shift.prototype = { +Shift.prototype = { get Wochentag() { return this._date.clone().locale(MOMENT_LOCALE).format(WEEKDAY_FORMAT); }, @@ -193,7 +195,7 @@ Shift.prototype = { }, set FormattedDatum(value) { var dateMoment = moment(value, DATE_LOCALE_FORMAT); - this._date = dateMoment; + this._date = dateMoment; }, get Datum() { @@ -201,7 +203,7 @@ Shift.prototype = { }, set Datum(value) { var dateMoment = moment(value).startOf('day'); - this._date = dateMoment.clone(); + this._date = dateMoment.clone(); }, get Beginn() { @@ -209,7 +211,7 @@ Shift.prototype = { }, set Beginn(value) { var dateMoment = moment(this.Datum + " " + value, DATE_INPUT_FORMAT + " " + TIME_FORMAT); - this._begin = dateMoment.clone(); + this._begin = dateMoment.clone(); }, get Ende() { 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'; 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 art = shift.Art.toLowerCase(); + var titel = shift.Name.toLowerCase(); var duration = 60; for (var rIndex in rules) { var rule = rules[rIndex]; @@ -287,31 +289,31 @@ Shift.setDurationFromRules = function (shift, rules) { } 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); return new VEvent({ startMoment: this._begin, - endMoment: end, - title: this.VEventTitle, + endMoment : end, + title : this.VEventTitle, description: this.Beschreibung, - location: this.Ort + location : this.Ort }); }; -Shift.thaw = function (jsonShift) { +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, + var begin = moment(jsonShift._begin); + var shift = new Shift({ + art : jsonShift._kind, + name : jsonShift._name, + datum : begin, beschreibung: jsonShift._description, - ort: jsonShift._ort, + ort : jsonShift._ort, }); - shift.id = jsonShift.id; + shift.id = jsonShift.id; shift.Dauer = moment.duration(jsonShift._duration); return shift; }; -Shift.prototype.updateBeginn = function(hour) { +Shift.prototype.updateBeginn = function (hour) { this._begin = this._begin.add('hours', hour); }