+
- edit Foto bearbeiten
+ edit_note Bericht bearbeiten
-
+
-
-
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
![]()
+
+ image
+
+
+
+
+
+
Nichts ausgewählt
+
+
-
-
+
+
@@ -1360,6 +1392,8 @@ tailwind.config = {
const data = await r.json();
const photos = data.photos || [];
document.getElementById('statPhotos').textContent = photos.length;
+ document.getElementById('statCats').textContent = allCategories.length;
+ document.getElementById('statCatsSublabel').textContent = allCategories.slice(0, 3).join(', ') + (allCategories.length > 3 ? '...' : '');
const counts = {};
let lastDate = null;
@@ -1703,20 +1737,23 @@ tailwind.config = {
});
// ─── Erfolge (Career) ─────────────────────────────────────
- function createAuszeichnungRow(titel, detail) {
+ function createAuszeichnungRow(titel, detail, beschreibung) {
const row = document.createElement('div');
- row.className = 'bg-surface-container-low rounded-xl p-4 flex gap-3 items-center';
+ row.className = 'bg-surface-container-low rounded-xl p-4 flex flex-col gap-3';
row.innerHTML =
+ '
' +
'' +
'' +
'';
+ 'delete' +
+ '
' +
+ '
';
row.querySelector('.ea-delete').addEventListener('click', function() { row.remove(); });
return row;
}
-
document.getElementById('efWeitereAdd').addEventListener('click', function() {
document.getElementById('efWeitereFields').appendChild(createAuszeichnungRow('', ''));
});
@@ -1777,7 +1814,7 @@ tailwind.config = {
const wf = document.getElementById('efWeitereFields');
wf.innerHTML = '';
(d.weitere_auszeichnungen || []).forEach(function(a) {
- wf.appendChild(createAuszeichnungRow(a.titel, a.detail));
+ wf.appendChild(createAuszeichnungRow(a.titel, a.detail, a.beschreibung));
});
const sf = document.getElementById('efStatsFields');
sf.innerHTML = '';
@@ -1793,6 +1830,7 @@ tailwind.config = {
});
document.getElementById('efZitatText').value = (d.zitat || {}).text || '';
document.getElementById('efZitatAutor').value = (d.zitat || {}).autor || '';
+ loadIndividualSuccesses();
} catch(err) { console.error('Career load error:', err); }
}
@@ -1823,7 +1861,8 @@ tailwind.config = {
weitere_auszeichnungen: Array.from(weRows).map(function(row) {
return {
titel: row.querySelector('[data-ea="titel"]').value,
- detail: row.querySelector('[data-ea="detail"]').value
+ detail: row.querySelector('[data-ea="detail"]').value,
+ beschreibung: row.querySelector('[data-ea="beschreibung"]').value
};
}),
stats: Array.from(stRows).map(function(row) {
@@ -1847,6 +1886,104 @@ tailwind.config = {
} catch(err) { console.error('Career save error:', err); }
});
+ async function loadIndividualSuccesses() {
+ try {
+ const r = await fetch('/api/individual-successes');
+ const list = await r.json();
+ const container = document.getElementById('individualSuccessList');
+ container.innerHTML = '';
+ list.forEach(item => {
+ const div = document.createElement('div');
+ div.className = 'flex items-center justify-between bg-surface-container-low rounded-xl px-6 py-4';
+ div.innerHTML = `
+
+
+ description
+
+
+
${escHtml(item.title)}
+
${escHtml(item.rang || 'Bericht')}
+
+
+
+ `;
+ container.appendChild(div);
+ });
+ } catch(err) { console.error('Load individual successes error:', err); }
+ }
+
+ async function editSuccess(fileName) {
+ try {
+ const r = await fetch('/api/individual-success/' + fileName);
+ const data = await r.json();
+ document.getElementById('esFileName').value = fileName;
+ document.getElementById('esTitle').value = data.title || '';
+ document.getElementById('esRang').value = data.rang || '';
+ document.getElementById('esSummary').value = data.summary || '';
+ document.getElementById('esContent').value = data.content || '';
+
+ const preview = document.getElementById('esPreview');
+ const placeholder = document.getElementById('esPlaceholder');
+ if (data.image) {
+ preview.src = '/erfolge-img/' + data.image + '?t=' + Date.now();
+ preview.classList.remove('hidden');
+ placeholder.classList.add('hidden');
+ } else {
+ preview.classList.add('hidden');
+ placeholder.classList.remove('hidden');
+ }
+
+ document.getElementById('esFileStatus').textContent = 'Keine neue Datei gewählt';
+ document.getElementById('editSuccessModal').classList.remove('hidden');
+ } catch(err) { console.error('Edit success error:', err); }
+ }
+
+ document.getElementById('esFileInput').addEventListener('change', function() {
+ const file = this.files[0];
+ if (file) {
+ document.getElementById('esPreview').src = URL.createObjectURL(file);
+ document.getElementById('esPreview').classList.remove('hidden');
+ document.getElementById('esPlaceholder').classList.add('hidden');
+ document.getElementById('esFileStatus').textContent = file.name;
+ }
+ });
+
+ document.getElementById('saveSuccessBtn').addEventListener('click', async function() {
+ const fileName = document.getElementById('esFileName').value;
+ const title = document.getElementById('esTitle').value;
+ const rang = document.getElementById('esRang').value;
+ const summary = document.getElementById('esSummary').value;
+ const content = document.getElementById('esContent').value;
+ const fileInput = document.getElementById('esFileInput');
+
+ try {
+ // 1. Metadaten & Inhalt speichern
+ const r = await fetch('/api/individual-success/' + fileName, {
+ method: 'PUT',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ title, rang, summary, content })
+ });
+
+ // 2. Bild falls gewählt
+ if (fileInput.files.length > 0) {
+ const fd = new FormData();
+ fd.append('image', fileInput.files[0]);
+ await fetch('/api/individual-success/' + fileName + '/image', {
+ method: 'POST',
+ body: fd
+ });
+ }
+
+ if (r.ok) {
+ showToast('✓ Bericht gespeichert & Deploy gestartet');
+ document.getElementById('editSuccessModal').classList.add('hidden');
+ loadIndividualSuccesses();
+ }
+ } catch(err) { console.error('Save success error:', err); }
+ });
+
// ─── Site-Name ────────────────────────────────────────────
async function loadSiteTitle() {
try {
diff --git a/data/categories.json b/data/categories.json
index ff0ce56..52530ea 100644
--- a/data/categories.json
+++ b/data/categories.json
@@ -2,5 +2,6 @@
"Training",
"Wettkämpfe",
"Gürtelprüfungen",
- "test"
+ "test",
+ "Haudrauf"
]
\ No newline at end of file
diff --git a/data/erfolge.json b/data/erfolge.json
index 4fd8123..f64a61a 100644
--- a/data/erfolge.json
+++ b/data/erfolge.json
@@ -2,9 +2,9 @@
"hero": {
"badge": "Meine Wettkampf-Geschichte",
"heading_main": "JEDER SIEG",
- "heading_colored": "ZÄHLT.",
+ "heading_colored": "ZÄHLT",
"description": "Von der ersten Gürtelprüfung bis zur Landesmeisterschaft – hier sammle ich alle Momente, auf die ich besonders stolz bin.",
- "rang_value": "Blaugurt",
+ "rang_value": "Grüngurt",
"rang_label": "Aktueller Rang",
"image": "hero.webp"
},
@@ -19,15 +19,18 @@
"weitere_auszeichnungen": [
{
"titel": "Norddeutsche Meisterschaft",
- "detail": "Silber – Kata 2024"
+ "detail": "Silber – Kata 2024",
+ "beschreibung": "War eine harter Fight"
},
{
"titel": "Dojo Champion",
- "detail": "Kiai Berlin, intern"
+ "detail": "Kiai Berlin, intern",
+ "beschreibung": ""
},
{
"titel": "Fairness-Preis",
- "detail": "Dojo-Auszeichnung 2023"
+ "detail": "Dojo-Auszeichnung 2023",
+ "beschreibung": ""
}
],
"stats": [
diff --git a/data/gaestebuch.json b/data/gaestebuch.json
index dc1dca0..5b41e8e 100644
--- a/data/gaestebuch.json
+++ b/data/gaestebuch.json
@@ -32,8 +32,8 @@
"name": "Lea M.",
"rolle": "Freundin",
"text": "Die Website sieht so professionell aus! Mega cool, alle deine Erfolge an einem Ort zu sehen. Wir müssen bald mal wieder eis essen gehen!",
- "farbe": "default",
- "breit": false
+ "farbe": "secondary",
+ "breit": true
},
{
"id": "4",
diff --git a/data/galerie.json b/data/galerie.json
index f8bf5a3..cfc67d6 100644
--- a/data/galerie.json
+++ b/data/galerie.json
@@ -2,16 +2,25 @@
"hero": {
"badge": "Visuelle Reise",
"heading_main": "Eingefangene",
- "heading_colored": "Momente.",
+ "heading_colored": "Momente",
"description": "Die Kunst der Disziplin durch die Linse. Von intensiven Trainingseinheiten bis zum Triumph bei Gürtelprüfungen."
},
"ribbon": {
"heading": "Hinter der Linse",
"description": "Unsere Galerie ist nicht nur Fotos – sie ist ein Zeugnis der Disziplin, die wir jeden Tag im Dojo leben.",
"stats": [
- { "wert": "24", "label": "Turniere" },
- { "wert": "150+", "label": "Schüler" },
- { "wert": "85", "label": "Gürtelprüfungen" }
+ {
+ "wert": "24",
+ "label": "Turniere"
+ },
+ {
+ "wert": "20",
+ "label": "Schüler"
+ },
+ {
+ "wert": "6",
+ "label": "Gürtelprüfungen"
+ }
]
}
-}
+}
\ No newline at end of file
diff --git a/data/gallery.json b/data/gallery.json
index d036b34..bd6dca4 100644
--- a/data/gallery.json
+++ b/data/gallery.json
@@ -1,5 +1,13 @@
{
"photos": [
+ {
+ "id": "1777571196788-em155",
+ "filename": "1777571196788-em155.webp",
+ "thumb": "1777571196788-em155-thumb.webp",
+ "title": "254E64FC-1F3E-4694-9828-28C620DB7A0D_1_105_c",
+ "kategorie": "Haudrauf",
+ "datum": "2026-04-30"
+ },
{
"id": "1775774640975-43j95",
"filename": "1775774640975-43j95.webp",
@@ -21,7 +29,7 @@
"filename": "1775774187000-q74m0.webp",
"thumb": "1775774187000-q74m0-thumb.webp",
"title": "Test",
- "kategorie": "Training",
+ "kategorie": "test",
"datum": "2026-04-09"
}
]
diff --git a/data/homepage.json b/data/homepage.json
index 08d59db..a21d2e4 100644
--- a/data/homepage.json
+++ b/data/homepage.json
@@ -6,13 +6,22 @@
"image": "hero.webp"
},
"hero_karte": {
- "rang": "Blaugurt",
- "status": "Status 2024"
+ "rang": "Grüngurt",
+ "status": "Status 2026"
},
"stats": [
- { "value": "7+", "label": "Jahre Training" },
- { "value": "1", "label": "Gold Medaillen" },
- { "value": "11", "label": "Turniere" }
+ {
+ "value": "7+",
+ "label": "Jahre Training"
+ },
+ {
+ "value": "1",
+ "label": "Gold Medaillen"
+ },
+ {
+ "value": "11",
+ "label": "Turniere"
+ }
],
"pruefung_karte": {
"titel": "Prüfung bestanden",
@@ -28,4 +37,4 @@
"description": "Schau dir hunderte Fotos von Trainingseinheiten, Turnieren und Reisen in meiner großen Galerie an.",
"button_text": "ZUR GALERIE GEHEN"
}
-}
+}
\ No newline at end of file
diff --git a/layouts/.DS_Store b/layouts/.DS_Store
index 8ebf5a1..6bc5d88 100644
Binary files a/layouts/.DS_Store and b/layouts/.DS_Store differ
diff --git a/layouts/erfolge/list.html b/layouts/erfolge/list.html
index 0d51657..a469d1f 100644
--- a/layouts/erfolge/list.html
+++ b/layouts/erfolge/list.html
@@ -219,6 +219,9 @@
{{ $a.titel }}
{{ $a.detail }}
+ {{ if $a.beschreibung }}
+
{{ $a.beschreibung }}
+ {{ end }}
{{ end }}
diff --git a/layouts/galerie/list.html b/layouts/galerie/list.html
index 0242903..802c1b4 100644
--- a/layouts/galerie/list.html
+++ b/layouts/galerie/list.html
@@ -91,9 +91,9 @@
@@ -103,6 +103,7 @@
{{ $katColor := "text-primary-fixed" }}
{{ if eq .kategorie "Wettkämpfe" }}{{ $katColor = "text-secondary-fixed" }}{{ end }}
{{ if eq .kategorie "Gürtelprüfungen" }}{{ $katColor = "text-primary-container" }}{{ end }}
+ {{ if and (ne .kategorie "Training") (ne .kategorie "Wettkämpfe") (ne .kategorie "Gürtelprüfungen") }}{{ $katColor = "text-on-surface-variant" }}{{ end }}