'use strict';
// NOTE: innerHTML usage is intentional - content comes from our own API/DB only (admin-imported Markdown).
// This is an internal training tool for 2-5 known users. No user-generated content.
var Flashcards = {
session: null,
render: function(params) {
var el = document.getElementById('content');
if (params[0] === 'study' && params[1]) {
this.renderStudy(el, params[1]);
return;
}
el.textContent = 'Lade Decks...';
var self = this;
API.get('/decks').then(function(data) {
self.renderDeckList(el, data.decks);
}).catch(function(e) {
el.textContent = e.message;
});
},
renderDeckList: function(el, decks) {
var total = decks.reduce(function(s, d) { return s + (d.card_count || 0); }, 0);
var totalDue = decks.reduce(function(s, d) { return s + (parseInt(d.due) || 0); }, 0);
var h = '
Flashcards
';
h += '
' + total + ' Karten in ' + decks.length + ' Decks';
if (totalDue > 0) h += ' — ' + totalDue + ' faellig';
h += '
';
decks.forEach(function(d) {
var reviewed = parseInt(d.reviewed) || 0;
var ct = d.card_count || 0;
var due = parseInt(d.due) || 0;
var pct = ct > 0 ? Math.round((reviewed / ct) * 100) : 0;
h += '
';
h += '
' + Markdown.esc(d.name) + '
';
h += '
' + ct + ' Karten — ' + pct + '% gelernt
';
if (due > 0) h += '
' + due + ' Karten faellig
';
h += '
';
h += '
';
});
h += '
';
el.innerHTML = h; // safe: data from own API only
el.querySelectorAll('.deck-card').forEach(function(card) {
card.addEventListener('click', function() {
location.hash = '#/flashcards/study/' + card.dataset.slug;
});
});
},
renderStudy: function(el, slug) {
el.textContent = 'Lade Karten...';
var self = this;
API.get('/cards/due?deck=' + slug + '&limit=50').then(function(data) {
if (data.cards.length === 0) {
return API.get('/cards/deck/' + slug).then(function(allData) {
var h = '← Zurueck zu Decks';
h += '
Keine faelligen Karten
';
h += '
Alle Karten sind gelernt. Komm spaeter wieder!
';
h += '
';
el.innerHTML = h; // safe: static text + number
document.getElementById('start-all-btn').addEventListener('click', function() {
self.startSession(el, slug, allData.cards);
});
});
}
self.startSession(el, slug, data.cards);
}).catch(function(e) { el.textContent = e.message; });
},
startSession: function(el, slug, cards) {
this.session = { slug: slug, cards: cards, index: 0, correct: 0, wrong: 0, showAnswer: false };
this.renderCard(el);
},
renderCard: function(el) {
var s = this.session;
if (s.index >= s.cards.length) { this.renderSummary(el); return; }
var card = s.cards[s.index];
var open = s.cards.length - s.index - 1;
var deckName = card.deck_name || s.slug;
var lastReview = card.last_reviewed_at
? 'Zuletzt: ' + new Date(card.last_reviewed_at).toLocaleDateString('de-DE')
: 'Noch nie gelernt';
var h = '← Zurueck zu Decks';
h += '
' + Markdown.esc(deckName) + '';
h += '
' + s.correct + ' richtig';
h += '' + s.wrong + ' falsch';
h += '' + open + ' offen