commit
30467e27b1
8
.idea/.gitignore
generated
vendored
Normal file
8
.idea/.gitignore
generated
vendored
Normal 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
5
.idea/codeStyles/codeStyleConfig.xml
generated
Normal 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
8
.idea/modules.xml
generated
Normal 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
8
.idea/orchester_dienstplan.iml
generated
Normal 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
290
app.js
@ -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);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
168
js/shift.js
168
js/shift.js
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user