Konto-Navigation: Klick zeigt jetzt wirklich NUR den passenden Bereich

Die Schnellnav-Leiste sprang bisher nur zum Abschnitt (der Rest blieb
sichtbar). Jetzt sind es echte Filter-Tabs: Klick auf "Bestellungen" /
"Wunschliste" / "Offene Sendungen" blendet alle anderen Bereiche komplett
aus und zeigt nur den ausgewählten. "Offene Sendungen" filtert zusätzlich
innerhalb der Bestellungen auf noch nicht abgeschlossene. Der aktive Tab
bleibt farbig hinterlegt und unterstrichen erkennbar. Start-Ansicht:
Bestellungen-Tab aktiv.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
qcigano
2026-08-03 13:33:31 +02:00
co-authored by Claude Sonnet 5
parent fd7b5f4ea5
commit b5be6e0e61
6 changed files with 206 additions and 32 deletions
+4
View File
@@ -225,6 +225,7 @@ export const ui = {
logout: "Abmelden", logout: "Abmelden",
navLabel: "Kontobereich-Navigation", navLabel: "Kontobereich-Navigation",
statOrders: "Bestellungen", statWishlist: "Wunschliste", statOpen: "Offene Sendungen", statOrders: "Bestellungen", statWishlist: "Wunschliste", statOpen: "Offene Sendungen",
noOpenOrders: "Aktuell keine offenen Sendungen — alle Bestellungen sind schon angekommen. 🎉",
ordersTitle: "📦 Meine Bestellungen", ordersTitle: "📦 Meine Bestellungen",
orderNo: "Bestellung", orderDate: "Bestellt am", orderTotal: "Gesamt", orderItems: "Artikel", orderNo: "Bestellung", orderDate: "Bestellt am", orderTotal: "Gesamt", orderItems: "Artikel",
trackingLabel: "Sendungsverfolgung", trackingBtn: "Sendung verfolgen →", invoiceBtn: "Rechnung (PDF)", reorderBtn: "Nochmal bestellen", trackingLabel: "Sendungsverfolgung", trackingBtn: "Sendung verfolgen →", invoiceBtn: "Rechnung (PDF)", reorderBtn: "Nochmal bestellen",
@@ -457,6 +458,7 @@ export const ui = {
logout: "Sign out", logout: "Sign out",
navLabel: "Account section navigation", navLabel: "Account section navigation",
statOrders: "Orders", statWishlist: "Wishlist", statOpen: "Open shipments", statOrders: "Orders", statWishlist: "Wishlist", statOpen: "Open shipments",
noOpenOrders: "No open shipments right now — every order has already arrived. 🎉",
ordersTitle: "📦 My orders", ordersTitle: "📦 My orders",
orderNo: "Order", orderDate: "Ordered on", orderTotal: "Total", orderItems: "Items", orderNo: "Order", orderDate: "Ordered on", orderTotal: "Total", orderItems: "Items",
trackingLabel: "Tracking", trackingBtn: "Track shipment →", invoiceBtn: "Invoice (PDF)", reorderBtn: "Order again", trackingLabel: "Tracking", trackingBtn: "Track shipment →", invoiceBtn: "Invoice (PDF)", reorderBtn: "Order again",
@@ -689,6 +691,7 @@ export const ui = {
logout: "Abmälde", logout: "Abmälde",
navLabel: "Kontobereich-Navigation", navLabel: "Kontobereich-Navigation",
statOrders: "Bstellige", statWishlist: "Wunschlischte", statOpen: "Offni Sändige", statOrders: "Bstellige", statWishlist: "Wunschlischte", statOpen: "Offni Sändige",
noOpenOrders: "Momentan kei offni Sändige — alli Bstellige sind scho aacho. 🎉",
ordersTitle: "📦 Mini Bstellige", ordersTitle: "📦 Mini Bstellige",
orderNo: "Bstellig", orderDate: "Bstellt am", orderTotal: "Total", orderItems: "Artikel", orderNo: "Bstellig", orderDate: "Bstellt am", orderTotal: "Total", orderItems: "Artikel",
trackingLabel: "Sändigsverfolgig", trackingBtn: "Sändig verfolge →", invoiceBtn: "Rächnig (PDF)", reorderBtn: "Nomal bstelle", trackingLabel: "Sändigsverfolgig", trackingBtn: "Sändig verfolge →", invoiceBtn: "Rächnig (PDF)", reorderBtn: "Nomal bstelle",
@@ -921,6 +924,7 @@ export const ui = {
logout: "Se déconnecter", logout: "Se déconnecter",
navLabel: "Navigation de l'espace client", navLabel: "Navigation de l'espace client",
statOrders: "Commandes", statWishlist: "Liste de souhaits", statOpen: "Envois en cours", statOrders: "Commandes", statWishlist: "Liste de souhaits", statOpen: "Envois en cours",
noOpenOrders: "Aucun envoi en cours pour le moment — toutes les commandes sont déjà arrivées. 🎉",
ordersTitle: "📦 Mes commandes", ordersTitle: "📦 Mes commandes",
orderNo: "Commande", orderDate: "Commandé le", orderTotal: "Total", orderItems: "Articles", orderNo: "Commande", orderDate: "Commandé le", orderTotal: "Total", orderItems: "Articles",
trackingLabel: "Suivi", trackingBtn: "Suivre l'envoi →", invoiceBtn: "Facture (PDF)", reorderBtn: "Commander à nouveau", trackingLabel: "Suivi", trackingBtn: "Suivre l'envoi →", invoiceBtn: "Facture (PDF)", reorderBtn: "Commander à nouveau",
+47 -7
View File
@@ -80,21 +80,21 @@ const offeneSendungen = beispielBestellungen.filter((b) => b.status === "versend
"Meine Wunschliste" statt drei loser Kästchen — jedes Segment springt zum passenden "Meine Wunschliste" statt drei loser Kästchen — jedes Segment springt zum passenden
Abschnitt weiter unten, Icon und Akzentfarbe passen zur jeweiligen Überschrift. */} Abschnitt weiter unten, Icon und Akzentfarbe passen zur jeweiligen Überschrift. */}
<nav class="account-nav" aria-label={t.accountDash.navLabel}> <nav class="account-nav" aria-label={t.accountDash.navLabel}>
<a class="account-nav-item account-nav-orders" href="#bestellungen"> <button type="button" class="account-nav-item account-nav-orders" data-tab="bestellungen">
<span class="account-nav-icon" aria-hidden="true">📦</span> <span class="account-nav-icon" aria-hidden="true">📦</span>
<span class="account-nav-value">{beispielBestellungen.length}</span> <span class="account-nav-value">{beispielBestellungen.length}</span>
<span class="account-nav-label">{t.accountDash.statOrders}</span> <span class="account-nav-label">{t.accountDash.statOrders}</span>
</a> </button>
<a class="account-nav-item account-nav-wishlist" href="#wunschliste"> <button type="button" class="account-nav-item account-nav-wishlist" data-tab="wunschliste">
<span class="account-nav-icon" aria-hidden="true">🩵</span> <span class="account-nav-icon" aria-hidden="true">🩵</span>
<span class="account-nav-value">0</span> <span class="account-nav-value">0</span>
<span class="account-nav-label">{t.accountDash.statWishlist}</span> <span class="account-nav-label">{t.accountDash.statWishlist}</span>
</a> </button>
<a class="account-nav-item account-nav-open" href="#bestellungen"> <button type="button" class="account-nav-item account-nav-open" data-tab="offene">
<span class="account-nav-icon" aria-hidden="true">🚚</span> <span class="account-nav-icon" aria-hidden="true">🚚</span>
<span class="account-nav-value">{offeneSendungen}</span> <span class="account-nav-value">{offeneSendungen}</span>
<span class="account-nav-label">{t.accountDash.statOpen}</span> <span class="account-nav-label">{t.accountDash.statOpen}</span>
</a> </button>
</nav> </nav>
</div> </div>
</section> </section>
@@ -102,7 +102,8 @@ const offeneSendungen = beispielBestellungen.filter((b) => b.status === "versend
<section class="section-tight" id="bestellungen"> <section class="section-tight" id="bestellungen">
<div class="container"> <div class="container">
<h2>{t.accountDash.ordersTitle}</h2> <h2>{t.accountDash.ordersTitle}</h2>
<div class="order-list"> <p class="small" id="orders-empty-note" style="display:none;">{t.accountDash.noOpenOrders}</p>
<div class="order-list" id="order-list">
{beispielBestellungen.map((b) => ( {beispielBestellungen.map((b) => (
<div class={`card order-card order-card-${b.status}`}> <div class={`card order-card order-card-${b.status}`}>
<div class="order-card-head"> <div class="order-card-head">
@@ -215,6 +216,45 @@ const offeneSendungen = beispielBestellungen.filter((b) => b.status === "versend
<script define:vars={{ loginPath: "/ch/konto/", fallbackName: "Kundin", greetingTemplate: t.accountDash.greeting("{name}"), reviewedBadgeText: t.accountDash.reviewedBadge }}> <script define:vars={{ loginPath: "/ch/konto/", fallbackName: "Kundin", greetingTemplate: t.accountDash.greeting("{name}"), reviewedBadgeText: t.accountDash.reviewedBadge }}>
window.__accountDashVars = { loginPath, fallbackName, greetingTemplate, reviewedBadgeText }; window.__accountDashVars = { loginPath, fallbackName, greetingTemplate, reviewedBadgeText };
</script> </script>
<script>
// Schnellnavigation als echte Filter-Tabs: Klick zeigt NUR den passenden Bereich, blendet den
// Rest aus (statt nur hinzuspringen). "Offene Sendungen" filtert zusätzlich innerhalb von
// "Meine Bestellungen" auf noch nicht abgeschlossene Bestellungen.
const OFFENE_STATUS = ["bezahlt", "bearbeitung", "versandVorbereitet", "versendet"];
const navItems = Array.from(document.querySelectorAll(".account-nav-item")) as HTMLButtonElement[];
const bestellungenSection = document.getElementById("bestellungen");
const wunschlisteSection = document.getElementById("wunschliste");
const orderCards = Array.from(document.querySelectorAll(".order-card"));
const emptyNote = document.getElementById("orders-empty-note");
function setActiveTab(tab: string) {
navItems.forEach((item) => item.classList.toggle("is-active", item.dataset.tab === tab));
if (tab === "wunschliste") {
if (bestellungenSection) bestellungenSection.style.display = "none";
if (wunschlisteSection) wunschlisteSection.style.display = "";
return;
}
if (bestellungenSection) bestellungenSection.style.display = "";
if (wunschlisteSection) wunschlisteSection.style.display = "none";
let visibleCount = 0;
orderCards.forEach((card) => {
const status = OFFENE_STATUS.find((s) => card.classList.contains("order-card-" + s));
const show = tab === "bestellungen" || (tab === "offene" && !!status);
(card as HTMLElement).style.display = show ? "" : "none";
if (show) visibleCount++;
});
if (emptyNote) emptyNote.style.display = tab === "offene" && visibleCount === 0 ? "block" : "none";
}
navItems.forEach((item) => {
item.addEventListener("click", () => { if (item.dataset.tab) setActiveTab(item.dataset.tab); });
});
setActiveTab("bestellungen");
</script>
<script> <script>
import { getAccount, isLoggedIn, logout, setName, setUsername, setPhoto, hatBestellungBewertet, anzeigeName } from "../../../scripts/account"; import { getAccount, isLoggedIn, logout, setName, setUsername, setPhoto, hatBestellungBewertet, anzeigeName } from "../../../scripts/account";
const { loginPath, fallbackName, greetingTemplate, reviewedBadgeText } = (window as any).__accountDashVars; const { loginPath, fallbackName, greetingTemplate, reviewedBadgeText } = (window as any).__accountDashVars;
+47 -7
View File
@@ -80,21 +80,21 @@ const offeneSendungen = beispielBestellungen.filter((b) => b.status === "versend
"Meine Wunschliste" statt drei loser Kästchen — jedes Segment springt zum passenden "Meine Wunschliste" statt drei loser Kästchen — jedes Segment springt zum passenden
Abschnitt weiter unten, Icon und Akzentfarbe passen zur jeweiligen Überschrift. */} Abschnitt weiter unten, Icon und Akzentfarbe passen zur jeweiligen Überschrift. */}
<nav class="account-nav" aria-label={t.accountDash.navLabel}> <nav class="account-nav" aria-label={t.accountDash.navLabel}>
<a class="account-nav-item account-nav-orders" href="#bestellungen"> <button type="button" class="account-nav-item account-nav-orders" data-tab="bestellungen">
<span class="account-nav-icon" aria-hidden="true">📦</span> <span class="account-nav-icon" aria-hidden="true">📦</span>
<span class="account-nav-value">{beispielBestellungen.length}</span> <span class="account-nav-value">{beispielBestellungen.length}</span>
<span class="account-nav-label">{t.accountDash.statOrders}</span> <span class="account-nav-label">{t.accountDash.statOrders}</span>
</a> </button>
<a class="account-nav-item account-nav-wishlist" href="#wunschliste"> <button type="button" class="account-nav-item account-nav-wishlist" data-tab="wunschliste">
<span class="account-nav-icon" aria-hidden="true">🩵</span> <span class="account-nav-icon" aria-hidden="true">🩵</span>
<span class="account-nav-value">0</span> <span class="account-nav-value">0</span>
<span class="account-nav-label">{t.accountDash.statWishlist}</span> <span class="account-nav-label">{t.accountDash.statWishlist}</span>
</a> </button>
<a class="account-nav-item account-nav-open" href="#bestellungen"> <button type="button" class="account-nav-item account-nav-open" data-tab="offene">
<span class="account-nav-icon" aria-hidden="true">🚚</span> <span class="account-nav-icon" aria-hidden="true">🚚</span>
<span class="account-nav-value">{offeneSendungen}</span> <span class="account-nav-value">{offeneSendungen}</span>
<span class="account-nav-label">{t.accountDash.statOpen}</span> <span class="account-nav-label">{t.accountDash.statOpen}</span>
</a> </button>
</nav> </nav>
</div> </div>
</section> </section>
@@ -102,7 +102,8 @@ const offeneSendungen = beispielBestellungen.filter((b) => b.status === "versend
<section class="section-tight" id="bestellungen"> <section class="section-tight" id="bestellungen">
<div class="container"> <div class="container">
<h2>{t.accountDash.ordersTitle}</h2> <h2>{t.accountDash.ordersTitle}</h2>
<div class="order-list"> <p class="small" id="orders-empty-note" style="display:none;">{t.accountDash.noOpenOrders}</p>
<div class="order-list" id="order-list">
{beispielBestellungen.map((b) => ( {beispielBestellungen.map((b) => (
<div class={`card order-card order-card-${b.status}`}> <div class={`card order-card order-card-${b.status}`}>
<div class="order-card-head"> <div class="order-card-head">
@@ -215,6 +216,45 @@ const offeneSendungen = beispielBestellungen.filter((b) => b.status === "versend
<script define:vars={{ loginPath: "/en/konto/", fallbackName: "Customer", greetingTemplate: t.accountDash.greeting("{name}"), reviewedBadgeText: t.accountDash.reviewedBadge }}> <script define:vars={{ loginPath: "/en/konto/", fallbackName: "Customer", greetingTemplate: t.accountDash.greeting("{name}"), reviewedBadgeText: t.accountDash.reviewedBadge }}>
window.__accountDashVars = { loginPath, fallbackName, greetingTemplate, reviewedBadgeText }; window.__accountDashVars = { loginPath, fallbackName, greetingTemplate, reviewedBadgeText };
</script> </script>
<script>
// Schnellnavigation als echte Filter-Tabs: Klick zeigt NUR den passenden Bereich, blendet den
// Rest aus (statt nur hinzuspringen). "Offene Sendungen" filtert zusätzlich innerhalb von
// "Meine Bestellungen" auf noch nicht abgeschlossene Bestellungen.
const OFFENE_STATUS = ["bezahlt", "bearbeitung", "versandVorbereitet", "versendet"];
const navItems = Array.from(document.querySelectorAll(".account-nav-item")) as HTMLButtonElement[];
const bestellungenSection = document.getElementById("bestellungen");
const wunschlisteSection = document.getElementById("wunschliste");
const orderCards = Array.from(document.querySelectorAll(".order-card"));
const emptyNote = document.getElementById("orders-empty-note");
function setActiveTab(tab: string) {
navItems.forEach((item) => item.classList.toggle("is-active", item.dataset.tab === tab));
if (tab === "wunschliste") {
if (bestellungenSection) bestellungenSection.style.display = "none";
if (wunschlisteSection) wunschlisteSection.style.display = "";
return;
}
if (bestellungenSection) bestellungenSection.style.display = "";
if (wunschlisteSection) wunschlisteSection.style.display = "none";
let visibleCount = 0;
orderCards.forEach((card) => {
const status = OFFENE_STATUS.find((s) => card.classList.contains("order-card-" + s));
const show = tab === "bestellungen" || (tab === "offene" && !!status);
(card as HTMLElement).style.display = show ? "" : "none";
if (show) visibleCount++;
});
if (emptyNote) emptyNote.style.display = tab === "offene" && visibleCount === 0 ? "block" : "none";
}
navItems.forEach((item) => {
item.addEventListener("click", () => { if (item.dataset.tab) setActiveTab(item.dataset.tab); });
});
setActiveTab("bestellungen");
</script>
<script> <script>
import { getAccount, isLoggedIn, logout, setName, setUsername, setPhoto, hatBestellungBewertet, anzeigeName } from "../../../scripts/account"; import { getAccount, isLoggedIn, logout, setName, setUsername, setPhoto, hatBestellungBewertet, anzeigeName } from "../../../scripts/account";
const { loginPath, fallbackName, greetingTemplate, reviewedBadgeText } = (window as any).__accountDashVars; const { loginPath, fallbackName, greetingTemplate, reviewedBadgeText } = (window as any).__accountDashVars;
+47 -7
View File
@@ -80,21 +80,21 @@ const offeneSendungen = beispielBestellungen.filter((b) => b.status === "versend
"Meine Wunschliste" statt drei loser Kästchen — jedes Segment springt zum passenden "Meine Wunschliste" statt drei loser Kästchen — jedes Segment springt zum passenden
Abschnitt weiter unten, Icon und Akzentfarbe passen zur jeweiligen Überschrift. */} Abschnitt weiter unten, Icon und Akzentfarbe passen zur jeweiligen Überschrift. */}
<nav class="account-nav" aria-label={t.accountDash.navLabel}> <nav class="account-nav" aria-label={t.accountDash.navLabel}>
<a class="account-nav-item account-nav-orders" href="#bestellungen"> <button type="button" class="account-nav-item account-nav-orders" data-tab="bestellungen">
<span class="account-nav-icon" aria-hidden="true">📦</span> <span class="account-nav-icon" aria-hidden="true">📦</span>
<span class="account-nav-value">{beispielBestellungen.length}</span> <span class="account-nav-value">{beispielBestellungen.length}</span>
<span class="account-nav-label">{t.accountDash.statOrders}</span> <span class="account-nav-label">{t.accountDash.statOrders}</span>
</a> </button>
<a class="account-nav-item account-nav-wishlist" href="#wunschliste"> <button type="button" class="account-nav-item account-nav-wishlist" data-tab="wunschliste">
<span class="account-nav-icon" aria-hidden="true">🩵</span> <span class="account-nav-icon" aria-hidden="true">🩵</span>
<span class="account-nav-value">0</span> <span class="account-nav-value">0</span>
<span class="account-nav-label">{t.accountDash.statWishlist}</span> <span class="account-nav-label">{t.accountDash.statWishlist}</span>
</a> </button>
<a class="account-nav-item account-nav-open" href="#bestellungen"> <button type="button" class="account-nav-item account-nav-open" data-tab="offene">
<span class="account-nav-icon" aria-hidden="true">🚚</span> <span class="account-nav-icon" aria-hidden="true">🚚</span>
<span class="account-nav-value">{offeneSendungen}</span> <span class="account-nav-value">{offeneSendungen}</span>
<span class="account-nav-label">{t.accountDash.statOpen}</span> <span class="account-nav-label">{t.accountDash.statOpen}</span>
</a> </button>
</nav> </nav>
</div> </div>
</section> </section>
@@ -102,7 +102,8 @@ const offeneSendungen = beispielBestellungen.filter((b) => b.status === "versend
<section class="section-tight" id="bestellungen"> <section class="section-tight" id="bestellungen">
<div class="container"> <div class="container">
<h2>{t.accountDash.ordersTitle}</h2> <h2>{t.accountDash.ordersTitle}</h2>
<div class="order-list"> <p class="small" id="orders-empty-note" style="display:none;">{t.accountDash.noOpenOrders}</p>
<div class="order-list" id="order-list">
{beispielBestellungen.map((b) => ( {beispielBestellungen.map((b) => (
<div class={`card order-card order-card-${b.status}`}> <div class={`card order-card order-card-${b.status}`}>
<div class="order-card-head"> <div class="order-card-head">
@@ -215,6 +216,45 @@ const offeneSendungen = beispielBestellungen.filter((b) => b.status === "versend
<script define:vars={{ loginPath: "/fr/konto/", fallbackName: "Cliente", greetingTemplate: t.accountDash.greeting("{name}"), reviewedBadgeText: t.accountDash.reviewedBadge }}> <script define:vars={{ loginPath: "/fr/konto/", fallbackName: "Cliente", greetingTemplate: t.accountDash.greeting("{name}"), reviewedBadgeText: t.accountDash.reviewedBadge }}>
window.__accountDashVars = { loginPath, fallbackName, greetingTemplate, reviewedBadgeText }; window.__accountDashVars = { loginPath, fallbackName, greetingTemplate, reviewedBadgeText };
</script> </script>
<script>
// Schnellnavigation als echte Filter-Tabs: Klick zeigt NUR den passenden Bereich, blendet den
// Rest aus (statt nur hinzuspringen). "Offene Sendungen" filtert zusätzlich innerhalb von
// "Meine Bestellungen" auf noch nicht abgeschlossene Bestellungen.
const OFFENE_STATUS = ["bezahlt", "bearbeitung", "versandVorbereitet", "versendet"];
const navItems = Array.from(document.querySelectorAll(".account-nav-item")) as HTMLButtonElement[];
const bestellungenSection = document.getElementById("bestellungen");
const wunschlisteSection = document.getElementById("wunschliste");
const orderCards = Array.from(document.querySelectorAll(".order-card"));
const emptyNote = document.getElementById("orders-empty-note");
function setActiveTab(tab: string) {
navItems.forEach((item) => item.classList.toggle("is-active", item.dataset.tab === tab));
if (tab === "wunschliste") {
if (bestellungenSection) bestellungenSection.style.display = "none";
if (wunschlisteSection) wunschlisteSection.style.display = "";
return;
}
if (bestellungenSection) bestellungenSection.style.display = "";
if (wunschlisteSection) wunschlisteSection.style.display = "none";
let visibleCount = 0;
orderCards.forEach((card) => {
const status = OFFENE_STATUS.find((s) => card.classList.contains("order-card-" + s));
const show = tab === "bestellungen" || (tab === "offene" && !!status);
(card as HTMLElement).style.display = show ? "" : "none";
if (show) visibleCount++;
});
if (emptyNote) emptyNote.style.display = tab === "offene" && visibleCount === 0 ? "block" : "none";
}
navItems.forEach((item) => {
item.addEventListener("click", () => { if (item.dataset.tab) setActiveTab(item.dataset.tab); });
});
setActiveTab("bestellungen");
</script>
<script> <script>
import { getAccount, isLoggedIn, logout, setName, setUsername, setPhoto, hatBestellungBewertet, anzeigeName } from "../../../scripts/account"; import { getAccount, isLoggedIn, logout, setName, setUsername, setPhoto, hatBestellungBewertet, anzeigeName } from "../../../scripts/account";
const { loginPath, fallbackName, greetingTemplate, reviewedBadgeText } = (window as any).__accountDashVars; const { loginPath, fallbackName, greetingTemplate, reviewedBadgeText } = (window as any).__accountDashVars;
+47 -7
View File
@@ -80,21 +80,21 @@ const offeneSendungen = beispielBestellungen.filter((b) => b.status === "versend
"Meine Wunschliste" statt drei loser Kästchen — jedes Segment springt zum passenden "Meine Wunschliste" statt drei loser Kästchen — jedes Segment springt zum passenden
Abschnitt weiter unten, Icon und Akzentfarbe passen zur jeweiligen Überschrift. */} Abschnitt weiter unten, Icon und Akzentfarbe passen zur jeweiligen Überschrift. */}
<nav class="account-nav" aria-label={t.accountDash.navLabel}> <nav class="account-nav" aria-label={t.accountDash.navLabel}>
<a class="account-nav-item account-nav-orders" href="#bestellungen"> <button type="button" class="account-nav-item account-nav-orders" data-tab="bestellungen">
<span class="account-nav-icon" aria-hidden="true">📦</span> <span class="account-nav-icon" aria-hidden="true">📦</span>
<span class="account-nav-value">{beispielBestellungen.length}</span> <span class="account-nav-value">{beispielBestellungen.length}</span>
<span class="account-nav-label">{t.accountDash.statOrders}</span> <span class="account-nav-label">{t.accountDash.statOrders}</span>
</a> </button>
<a class="account-nav-item account-nav-wishlist" href="#wunschliste"> <button type="button" class="account-nav-item account-nav-wishlist" data-tab="wunschliste">
<span class="account-nav-icon" aria-hidden="true">🩵</span> <span class="account-nav-icon" aria-hidden="true">🩵</span>
<span class="account-nav-value">0</span> <span class="account-nav-value">0</span>
<span class="account-nav-label">{t.accountDash.statWishlist}</span> <span class="account-nav-label">{t.accountDash.statWishlist}</span>
</a> </button>
<a class="account-nav-item account-nav-open" href="#bestellungen"> <button type="button" class="account-nav-item account-nav-open" data-tab="offene">
<span class="account-nav-icon" aria-hidden="true">🚚</span> <span class="account-nav-icon" aria-hidden="true">🚚</span>
<span class="account-nav-value">{offeneSendungen}</span> <span class="account-nav-value">{offeneSendungen}</span>
<span class="account-nav-label">{t.accountDash.statOpen}</span> <span class="account-nav-label">{t.accountDash.statOpen}</span>
</a> </button>
</nav> </nav>
</div> </div>
</section> </section>
@@ -102,7 +102,8 @@ const offeneSendungen = beispielBestellungen.filter((b) => b.status === "versend
<section class="section-tight" id="bestellungen"> <section class="section-tight" id="bestellungen">
<div class="container"> <div class="container">
<h2>{t.accountDash.ordersTitle}</h2> <h2>{t.accountDash.ordersTitle}</h2>
<div class="order-list"> <p class="small" id="orders-empty-note" style="display:none;">{t.accountDash.noOpenOrders}</p>
<div class="order-list" id="order-list">
{beispielBestellungen.map((b) => ( {beispielBestellungen.map((b) => (
<div class={`card order-card order-card-${b.status}`}> <div class={`card order-card order-card-${b.status}`}>
<div class="order-card-head"> <div class="order-card-head">
@@ -215,6 +216,45 @@ const offeneSendungen = beispielBestellungen.filter((b) => b.status === "versend
<script define:vars={{ loginPath: "/konto/", fallbackName: "Kundin", greetingTemplate: t.accountDash.greeting("{name}"), reviewedBadgeText: t.accountDash.reviewedBadge }}> <script define:vars={{ loginPath: "/konto/", fallbackName: "Kundin", greetingTemplate: t.accountDash.greeting("{name}"), reviewedBadgeText: t.accountDash.reviewedBadge }}>
window.__accountDashVars = { loginPath, fallbackName, greetingTemplate, reviewedBadgeText }; window.__accountDashVars = { loginPath, fallbackName, greetingTemplate, reviewedBadgeText };
</script> </script>
<script>
// Schnellnavigation als echte Filter-Tabs: Klick zeigt NUR den passenden Bereich, blendet den
// Rest aus (statt nur hinzuspringen). "Offene Sendungen" filtert zusätzlich innerhalb von
// "Meine Bestellungen" auf noch nicht abgeschlossene Bestellungen.
const OFFENE_STATUS = ["bezahlt", "bearbeitung", "versandVorbereitet", "versendet"];
const navItems = Array.from(document.querySelectorAll(".account-nav-item")) as HTMLButtonElement[];
const bestellungenSection = document.getElementById("bestellungen");
const wunschlisteSection = document.getElementById("wunschliste");
const orderCards = Array.from(document.querySelectorAll(".order-card"));
const emptyNote = document.getElementById("orders-empty-note");
function setActiveTab(tab: string) {
navItems.forEach((item) => item.classList.toggle("is-active", item.dataset.tab === tab));
if (tab === "wunschliste") {
if (bestellungenSection) bestellungenSection.style.display = "none";
if (wunschlisteSection) wunschlisteSection.style.display = "";
return;
}
if (bestellungenSection) bestellungenSection.style.display = "";
if (wunschlisteSection) wunschlisteSection.style.display = "none";
let visibleCount = 0;
orderCards.forEach((card) => {
const status = OFFENE_STATUS.find((s) => card.classList.contains("order-card-" + s));
const show = tab === "bestellungen" || (tab === "offene" && !!status);
(card as HTMLElement).style.display = show ? "" : "none";
if (show) visibleCount++;
});
if (emptyNote) emptyNote.style.display = tab === "offene" && visibleCount === 0 ? "block" : "none";
}
navItems.forEach((item) => {
item.addEventListener("click", () => { if (item.dataset.tab) setActiveTab(item.dataset.tab); });
});
setActiveTab("bestellungen");
</script>
<script> <script>
import { getAccount, isLoggedIn, logout, setName, setUsername, setPhoto, hatBestellungBewertet, anzeigeName } from "../../scripts/account"; import { getAccount, isLoggedIn, logout, setName, setUsername, setPhoto, hatBestellungBewertet, anzeigeName } from "../../scripts/account";
const { loginPath, fallbackName, greetingTemplate, reviewedBadgeText } = (window as any).__accountDashVars; const { loginPath, fallbackName, greetingTemplate, reviewedBadgeText } = (window as any).__accountDashVars;
+14 -4
View File
@@ -1332,10 +1332,11 @@ a:focus-visible, button:focus-visible {
} }
@media (max-width: 500px) { .account-head-identity { flex-wrap: wrap; } } @media (max-width: 500px) { .account-head-identity { flex-wrap: wrap; } }
/* Kontobereich-Schnellnavigation: statt drei einzelner, loser Kästchen EINE zusammenhängende /* Kontobereich-Schnellnavigation: statt drei einzelner, loser Kästchen EINE zusammenhängende
Leiste direkt über den zugehörigen Abschnitten — jedes Segment ist ein echter Sprunglink zum Leiste direkt über den zugehörigen Abschnitten — jedes Segment ist ein echter Filter-Knopf:
passenden Bereich weiter unten (Bestellungen/Wunschliste), mit eigener Akzentfarbe und Icon, Klick zeigt NUR den passenden Bereich (Bestellungen/Wunschliste/nur offene Sendungen) und
die zur jeweiligen Abschnittsüberschrift passen (📦/🩵/🚚 wie schon bei den Bestellstatus- blendet den Rest aus, mit eigener Akzentfarbe und Icon passend zur jeweiligen Abschnitts-
Icons). Auf Hover/Fokus füllt sich ein farbiger Unterstrich, damit klar ist: das ist klickbar. */ überschrift (📦/🩵/🚚 wie schon bei den Bestellstatus-Icons). Der aktive Knopf bleibt farbig
unterstrichen und hinterlegt, damit immer klar ist, welcher Filter gerade aktiv ist. */
.account-nav { .account-nav {
display: flex; display: flex;
margin-top: 1.2rem; margin-top: 1.2rem;
@@ -1357,6 +1358,13 @@ a:focus-visible, button:focus-visible {
position: relative; position: relative;
scroll-margin-top: 1.5rem; scroll-margin-top: 1.5rem;
transition: background 0.2s var(--ease); transition: background 0.2s var(--ease);
/* Reset, da jetzt <button> statt <a> — soll optisch identisch bleiben. */
border-top: none;
border-right: none;
border-bottom: none;
background-color: transparent;
font: inherit;
cursor: pointer;
} }
.account-nav-item + .account-nav-item { border-left: 1px solid rgba(244, 241, 247, 0.12); } .account-nav-item + .account-nav-item { border-left: 1px solid rgba(244, 241, 247, 0.12); }
.account-nav-item::after { .account-nav-item::after {
@@ -1372,6 +1380,8 @@ a:focus-visible, button:focus-visible {
} }
.account-nav-item:hover { background: color-mix(in srgb, var(--nav-color, var(--c-accent)) 14%, transparent); } .account-nav-item:hover { background: color-mix(in srgb, var(--nav-color, var(--c-accent)) 14%, transparent); }
.account-nav-item:hover::after, .account-nav-item:focus-visible::after { transform: scaleX(1); } .account-nav-item:hover::after, .account-nav-item:focus-visible::after { transform: scaleX(1); }
.account-nav-item.is-active { background: color-mix(in srgb, var(--nav-color, var(--c-accent)) 20%, transparent); }
.account-nav-item.is-active::after { transform: scaleX(1); }
.account-nav-icon { font-size: 1.35rem; } .account-nav-icon { font-size: 1.35rem; }
.account-nav-value { font-family: var(--font-head); font-size: 1.7rem; font-weight: 700; color: var(--nav-color, var(--c-accent)); line-height: 1; } .account-nav-value { font-family: var(--font-head); font-size: 1.7rem; font-weight: 700; color: var(--nav-color, var(--c-accent)); line-height: 1; }
.account-nav-label { font-size: 0.82rem; color: var(--c-text-muted); text-align: center; } .account-nav-label { font-size: 0.82rem; color: var(--c-text-muted); text-align: center; }