@@ -131,10 +119,10 @@ Vue.component('chip-input', {
}
},
- watch:{
- initData:{
+ watch: {
+ initData: {
deep: true,
- handler(n,o) {
+ handler(n, o) {
if (n !== o) {
this.initialize();
this.$emit('init');
@@ -150,14 +138,14 @@ Vue.component('chip-input', {
methods: {
initialize() {
this.chips = this.initData.map(e => e);
- var el = $('#'+this.name)[0];
+ var el = $('#' + this.name)[0];
this.instance = M.Chips.init(el, {
data: this.chips,
onChipAdd: () => {
- this.$emit("change",this.chipsData);
+ this.$emit("change", this.chipsData);
},
onChipDelete: () => {
- this.$emit("change",this.chipsData);
+ this.$emit("change", this.chipsData);
}
});
}
@@ -177,6 +165,7 @@ var app = new Vue({
blob: null,
dp_sheet: '',
deletedShift: '',
+ format: '',
remaining: shiftStorage.count(),
selectedShift: new Shift({}),
selectedShiftIndex: -1,
@@ -184,7 +173,10 @@ var app = new Vue({
selectedRuleIndex: -1,
saveto: 'dienstplan.ics',
uploadFileName: "",
- availableFormats: ["Erfurt","Stuttgart","X"],
+ availableFormats: ["Erfurt", "Stuttgart", "X"],
+ stepper: null,
+ timepickers: null,
+
config: {
moment: {
parse_formats: [
@@ -194,8 +186,14 @@ var app = new Vue({
parse_language: 'en',
display_language: 'de'
},
+ stepper: {
+ firstActive: 0,
+ },
toast: {
displayLength: 3000
+ },
+ timepicker: {
+ twelveHour: false,
}
},
workbook: null,
@@ -219,19 +217,19 @@ var app = new Vue({
deep: true
}
},
-
+
computed: {
groupedTermine() {
- return _.groupBy(this.shifts, e => e.Datum);
+ return _.chain(this.shifts).sortBy(e => e.Datum).groupBy(e => e.Datum).value();
}
},
methods: {
- updateArten(value){
+ updateArten(value) {
this.selectedRule.Arten = value;
},
- updateTitel(value){
+ updateTitel(value) {
this.selectedRule.Titel = value;
},
@@ -241,6 +239,19 @@ var app = new Vue({
M.toast(toastOptions);
},
+ openModal(elementID) {
+ var element = document.getElementById(elementID);
+ var modal = M.Modal.getInstance(element);
+ modal.open();
+ },
+
+ closeModal(elementID) {
+ var element = document.getElementById(elementID);
+ var modal = M.Modal.getInstance(element);
+ modal.close();
+ },
+
+
onFileChange: function (event) {
var files = event.target.files || event.dataTransfer.files;
this.handleInputFile(files[0]);
@@ -258,8 +269,8 @@ var app = new Vue({
cellDates: true,
});
var isErfurterDienstplan = workbook.SheetNames.indexOf("Dienstplan") > -1;
-
- if(isErfurterDienstplan){
+
+ if (isErfurterDienstplan) {
vm.parseForErfurt(workbook.Sheets["Dienstplan"]);
} else {
this.workbook = workbook;
@@ -268,19 +279,20 @@ var app = new Vue({
};
reader.readAsBinaryString(file);
},
-
- askForDienstplanFormat: function() {
+
+ askForDienstplanFormat: function () {
this.makeToast("Dienstplanformat nicht erkannt.");
- $('#ask-format-modal').modal("open");
+ this.openModal('ask-format-modal');
},
parseForErfurt: function (dp) {
var arr = XLSX.utils.sheet_to_row_object_array(dp, {
- range: 1
- });
+ range: 1
+ });
+ this.format = "Erfurt";
var vm = this;
var day;
-
+
this.makeToast("Erfurter Dienstplan erkannt.");
arr.forEach(element => {
@@ -289,23 +301,67 @@ var app = new Vue({
day = moment(element.Datum);
}
if (element.hasOwnProperty('Dienst')) {
- var time = element.Zeit ? moment(element.Zeit) : day;
- var termin = {
- datum: day.clone().hour(time.hour()).minute(time.minute()),
- art: element.Dienst ? element.Dienst.trim() : "",
- beschreibung: element.Bemerkung ? element.Bemerkung.trim(): "",
- name: element.__EMPTY ? element.__EMPTY.trim() : ""
+
+ 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) {
+ times.push(moment(time, 'HH:mm'));
+ })
+ } else {
+ // übrliches Format
+ times.push(element.Zeit ? moment(element.Zeit) : day);
}
- vm.addShift(new Shift(termin));
+ if (element.hasOwnProperty('Bemerkung')) {
+ if (element.Bemerkung.toString().indexOf(/\d\d:\d\d\s/)) {
+ // 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()
+ }
+ if (!termin.datum.isDST()) {
+ termin.datum.add(1, 'hours')
+ }
+ vm.addShift(new Shift(termin));
+ beschreibung = '';
+ } else {
+ beschreibung = element.Bemerkung;
+ }
+ }
+ if (element.hasOwnProperty('Dienst')) {
+ art = element.Dienst.trim();
+ }
+ if (element.hasOwnProperty('__EMPTY')) {
+ name = element.__EMPTY.trim();
+ }
+
+ times.forEach(time => {
+ var termin = {
+ datum: day.clone().hour(time.hour()).minute(time.minute()),
+ art: art,
+ beschreibung: beschreibung,
+ name: name
+ }
+ if (!termin.datum.isDST()) {
+ termin.datum.add(1, 'hours')
+ }
+ vm.addShift(new Shift(termin));
+ });
+
}
});
},
parseForStuttgart: function (dp) {
var arr = XLSX.utils.sheet_to_json(dp, {
- header: "A",
- blankrows: false,
- });
+ header: "A",
+ blankrows: false,
+ });
var vm = this;
var day;
@@ -320,21 +376,21 @@ var app = new Vue({
var termin = {
ort: element.H ? element.H.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() : ""
}
var time = day.clone();
- if (typeof(element.D) === "object") {
+ if (typeof (element.D) === "object") {
time = moment(element.D);
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(" - ");
- time = moment(tArray[0],"HH:mm");
+ 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");
}
vm.addShift(new Shift(termin));
-
+
}
});
},
@@ -342,11 +398,11 @@ 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",
- blankrows: false,
- });
+ header: "A",
+ blankrows: false,
+ });
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;
arr.forEach(element => {
@@ -354,46 +410,40 @@ var app = new Vue({
var time = moment().hour(0).minute(0);
try {
if (element.hasOwnProperty('A')) {
- day = moment(element.A, "D.","de");
+ day = moment(element.A, "D.", "de");
day = Number(element.A);
}
- if ((!element.F && !element.H && !element.J) || element.I == "Spielort/ Extras" || element.J == "Spielort/Extras"){
-
+ if ((!element.F && !element.H && !element.J) || element.I == "Spielort/ Extras" || element.J == "Spielort/Extras") {
+
} else {
-
+
if (element.hasOwnProperty("D") && element.hasOwnProperty("E")) {
// Probe
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()
- : "";
- }
- else if (element.hasOwnProperty("G") && element.hasOwnProperty("H"))
- {
+ beschreibung = typeof (element.I) != 'undefined' ? element.I.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();
- beschreibung = typeof(element.I) != 'undefined' ? element.I.trim()
- : typeof(element.J) != 'undefined' ? element.J.trim()
- : "";
- }
- else if (element.hasOwnProperty("I"))
- {
+ beschreibung = typeof (element.I) != 'undefined' ? element.I.trim() :
+ typeof (element.J) != 'undefined' ? element.J.trim() :
+ "";
+ } else if (element.hasOwnProperty("I")) {
// Spielort/Extras
beschreibung = element.I.trim();
name = name ? name : "Spielort/Extras";
- }
- else if (element.hasOwnProperty("J"))
- {
+ } else if (element.hasOwnProperty("J")) {
// Spielort/Extras Fallback
beschreibung = element.J.trim();
name = name ? name : "Spielort/Extras";
}
-
+
var datumStr = day + '.' + month.clone().format("MM.YY") + time.format(" HH:mm");
var termin = {
ort: "",
@@ -407,7 +457,7 @@ var app = new Vue({
} catch (error) {
console.error("Fehler beim Parsen", element, error);
}
-
+
});
},
@@ -472,21 +522,22 @@ var app = new Vue({
selectShift: function (shift) {
this.selectedShift = Shift.thaw(shift);
+
this.keepShift = shift;
M.updateTextFields();
- $('#shiftModal').modal('open');
+ this.openModal('shiftModal');
},
saveChanges: function (changedShift) {
this.shifts.splice(this.shifts.indexOf(this.keepShift), 1, changedShift);
- $('#shiftModal').modal('close');
+ this.closeModal('shiftModal');
this.keepShift = '';
this.selectedShift = '';
},
discardChanges: function (changedShift) {
- $('#shiftModal').modal('close');
+ this.closeModal('shiftModal');
this.keepShift = '';
this.selectedShift = '';
},
@@ -494,20 +545,28 @@ var app = new Vue({
editRule: function (rule) {
this.selectedRule = Rule.thaw(rule);
this.selectedRuleIndex = this.rules.indexOf(rule);
- $('#ruleModal').modal('open');
+ this.openModal('ruleModal');
},
saveRule: function () {
this.rules[this.selectedRuleIndex] = this.selectedRule;
- $('#ruleModal').modal('close');
+ this.closeModal('ruleModal');
this.selectedRule = new Rule();
},
discardRule: function () {
- $('#ruleModal').modal('close');
-
+ this.closeModal('ruleModal');
+
this.selectedRule = new Rule();
+ },
+
+ applyRules: function () {
+ var shifts = this.shifts;
+ shifts.forEach(function (shift) {
+ Shift.setDurationFromRules(shift, this.rules);
+ });
+ this.shifts = shifts;
}
},
@@ -517,5 +576,12 @@ var app = new Vue({
el.focus();
}
}
+ },
+ mounted: function () {
+ M.AutoInit();
+ 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);
}
})
diff --git a/index.html b/index.html
index 711543c..fe6dfb5 100644
--- a/index.html
+++ b/index.html
@@ -20,8 +20,8 @@
-