Lukas Fürderer 9a855dbf7c Run the quiz in a dialog box to get more horizontal space
- Rearrange the elements to make use of this new space
2020-08-21 21:15:33 +02:00

199 lines
6.0 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

let cards_content = [
[
"Einzug",
"Kreuzzeichen und liturgischer Gruß",
"Begrüßung und Einführung in die Feier",
"Schuldbekenntnis und Vergebungsbitte (Bußakt)",
"Kyrie",
"Gloria",
"Tagesgebet",
"Lesung (Altes Testament)",
"Zwischengesang / Antwortpsalm",
"Lesung (Neues Testament)",
"Hallelujaruf",
"Evangelium",
"Homilie / Predigt",
"Credo / Glaubensbekenntnis",
"Fürbitten",
"Gabenbereitung mit Gabengebet",
"Eucharistisches Hochgebet: Präfation",
"Sanctus",
"Einsetzungsbericht / Wandlung",
"Vaterunser",
"Friedensgruß",
"Brechen des Brotes / Agnus Dei Lamm Gottes",
"Kommunion",
"Dank- / Schlussgebet",
"Segen",
"Entlassung",
],
];
function shuffle(a) {
for (let x = a.length-1; x>0; x--) {
let y = Math.floor(Math.random() * (x + 1));
let temp = a[x];
a[x] = a[y];
a[y] = temp;
}
}
function shuffle_cards() {
let a = [];
for (let i=0; i<cards_content[0].length; i++) {
a.push(i);
}
shuffle(a);
return a;
}
function choose_incorrects(idx_vals) {
let options = {
0: [],
};
function find_longest_chain(maxkey) {
let longest = null;
for (let key in options) {
if (
(
maxkey == null
|| key <= maxkey
)
&& (
longest == null
|| options[key].length > options[longest].length
|| (
options[key].length == options[longest].length
&& Number.parseInt(key) < Number.parseInt(longest)
)
)
) {
longest = key;
}
}
return longest;
}
idx_vals.forEach((val) => {
let longest = find_longest_chain(val);
let mychain = options[longest].slice();
mychain.push(val);
options[val + 1] = mychain;
});
let result_chain = find_longest_chain(null);
let a = [];
for (let i=0; i<cards_content[0].length; i++) {
a.push(true);
}
options[result_chain].forEach((elem) => {
a[elem] = false;
});
return a;
}
var app = new Vue({
el: "#quiz",
data: {
is_open: true,
cards_content,
store: {
section: 0,
selected: null,
items: shuffle_cards(),
},
solution: [],
order_revealed: false,
},
computed: {
helptext: function() {
if (this.order_revealed) {
if (this.order_correct) {
return "Perfekt! Die Reihenfolge ist korrekt.";
} else {
return "Die Reihenfolge passt leider noch nicht ganz. Falsch eingeordnete Elemente sind rot markiert. Entferne diese mit einem Klick auf das rote X und füge sie neu ein, bis die Reihenfolge stimmt.";
}
} else {
if (this.solution.length == 0) {
return "Klicke rechts auf ein Element des Gottesdienstablaufs, um es nach links zu übernehmen.";
} else if (this.solution.length == 1) {
if (this.store.selected == null) {
return "Wähle nun von rechts das nächste Element aus.";
} else {
return "Klicke links auf einen grünen Pfeil, um es an der richtigen Stelle in die Liste einzuordnen.";
}
} else {
return "Bringe nun auch alle weiteren Elemente in die richtige Reihenfolge.";
}
}
},
all_inserted: function() {
return this.solution.length == this.cards_content[0].length;
},
arrows_visible: function() {
return this.store.selected != null;
},
incorrects: function() {
if (this.order_revealed) {
let idx_vals = this.solution.map(elem => elem.main_idx);
return choose_incorrects(idx_vals);
} else {
return [];
}
},
order_correct: function() {
return this.order_revealed && this.all_inserted && !this.incorrects.includes(true);
},
},
methods: {
store_text: function(idx) {
return this.cards_content[this.store.section][idx];
},
store_card_visible: function(idx) {
for (let i=0; i<this.solution.length; i++) {
if (this.solution[i].main_idx == idx) {
return false;
}
}
return true;
},
store_select: function(i) {
if (this.solution.length == 0) {
this.solution.push({
main_idx: i,
});
} else if (i == this.store.selected) {
this.store.selected = null;
} else {
this.store.selected = i;
}
},
solution_main_text: function(elem) {
return cards_content[0][elem.main_idx];
},
insert_front: function() {
this.solution.splice(0, 0, {
main_idx: this.store.selected,
});
this.store.selected = null;
},
find_solution: function(elem) {
for (let i=0; i<this.solution.length; i++) {
if (this.solution[i] == elem) {
return i;
}
}
},
insert_after: function(elem) {
this.solution.splice(this.find_solution(elem)+1, 0, {
main_idx: this.store.selected,
});
this.store.selected = null;
},
remove_solution: function(elem) {
this.solution.splice(this.find_solution(elem), 1);
},
reveal_order: function() {
this.order_revealed = true;
},
},
});