Rename season UI language to years

This commit is contained in:
AzuTear
2026-06-17 13:45:06 +02:00
parent 33975a633c
commit 567f0e2ebf
9 changed files with 29 additions and 25 deletions
@@ -28,12 +28,12 @@ const currentSeason = computed(() => store.adminSeasonDetail)
<template>
<div class="flex flex-col gap-3 rounded-lg border border-violet-100 bg-white/80 px-4 py-3 lg:flex-row lg:items-center lg:justify-between">
<div class="flex flex-wrap items-center gap-2">
<p class="text-xs font-semibold uppercase tracking-[0.22em] text-violet-500">Season</p>
<p class="text-xs font-semibold uppercase tracking-[0.22em] text-violet-500">Jahr</p>
<span class="rounded-full border border-violet-100 bg-violet-50/70 px-3 py-1.5 text-xs font-semibold text-slate-600">
{{ currentSeason.currentPhase || 'Kein Status' }}
</span>
<span class="rounded-full border border-violet-100 bg-white px-3 py-1.5 text-xs font-semibold text-slate-600">
{{ currentSeason.isCurrent ? 'Public Season' : 'Nicht aktiv' }}
{{ currentSeason.isCurrent ? 'Public-Jahr' : 'Nicht aktiv' }}
</span>
</div>
+5 -1
View File
@@ -75,7 +75,11 @@ const router = createRouter({
},
{
path: 'seasons',
name: 'admin-seasons',
redirect: { name: 'admin-years' },
},
{
path: 'years',
name: 'admin-years',
component: AdminSeasonsView,
meta: {
keepAlive: true,
+4 -4
View File
@@ -68,7 +68,7 @@ const heroYear = computed(() => store.overview.year)
<span class="text-xs font-semibold uppercase tracking-[0.25em]">Team verwaltet pro Jahr</span>
</div>
<p class="mt-5 text-sm leading-7 text-slate-600">
Kategorien und Unterkategorien werden im Admin-Bereich je Season gepflegt und freigeschaltet.
Kategorien und Unterkategorien werden im Admin-Bereich je Jahr gepflegt und freigeschaltet.
</p>
</Card>
</div>
@@ -202,9 +202,9 @@ const heroYear = computed(() => store.overview.year)
<WandSparkles class="h-5 w-5 text-amber-500" />
<p class="text-xs font-semibold uppercase tracking-[0.3em] text-violet-500">Admin</p>
</div>
<h2 class="mt-4 font-[Cormorant_Garamond] text-4xl text-violet-800">Season-first Management</h2>
<h2 class="mt-4 font-[Cormorant_Garamond] text-4xl text-violet-800">Jahresbasiertes Management</h2>
<p class="mt-3 text-slate-600">
Jahre, Kategorien, Unterkategorien, Gewinnerarchiv und Reviews werden als saisonale Inhalte gedacht, nicht als harte statische App-Texte.
Jahre, Kategorien, Unterkategorien, Gewinnerarchiv und Reviews werden als kuratierte Award-Jahre gedacht, nicht als harte statische App-Texte.
</p>
</Card>
</section>
@@ -273,7 +273,7 @@ const heroYear = computed(() => store.overview.year)
<section class="grid gap-6 lg:grid-cols-[0.8fr_1.2fr]">
<Card class="p-6">
<p class="text-xs font-semibold uppercase tracking-[0.35em] text-amber-500">Gewinner Archiv</p>
<h2 class="mt-3 font-[Cormorant_Garamond] text-5xl text-violet-800">Vergangene Seasons sichtbar machen</h2>
<h2 class="mt-3 font-[Cormorant_Garamond] text-5xl text-violet-800">Vergangene Jahre sichtbar machen</h2>
<p class="mt-4 text-slate-600">
Gewinner, Nominierte und Banner werden pro Jahr archiviert. So bleibt die Show-Historie dauerhaft sichtbar und teilbar.
</p>
+1 -1
View File
@@ -24,7 +24,7 @@ async function selectYear(year: number) {
<div class="space-y-10 pb-14">
<div class="space-y-4">
<p class="text-xs font-semibold uppercase tracking-[0.35em] text-amber-500">Gewinnerarchiv</p>
<h1 class="max-w-[12ch] font-[Cormorant_Garamond] text-6xl leading-[0.92] text-violet-800">Seasons, Gewinner und Show-Historie</h1>
<h1 class="max-w-[12ch] font-[Cormorant_Garamond] text-6xl leading-[0.92] text-violet-800">Jahre, Gewinner und Show-Historie</h1>
<p class="max-w-3xl text-lg leading-8 text-slate-600">
Das Archiv macht Awards dauerhaft sichtbar und verlinkbar. Kategorien und Banner bleiben pro Jahr nachvollziehbar.
</p>
@@ -110,7 +110,7 @@ async function createCandidate() {
<AdminPageHeader
eyebrow="Candidates"
title="Kandidatenbasis pflegen"
description="Hier findest du alle Kandidaten der gewaehlten Season an einem Ort. Filtere zuerst und bearbeite dann nur die relevanten Eintraege."
description="Hier findest du alle Kandidaten des gewaehlten Award-Jahres an einem Ort. Filtere zuerst und bearbeite dann nur die relevanten Eintraege."
/>
<AdminSeasonToolbar />
@@ -29,7 +29,7 @@ const quickActions = computed(() => [
{
label: 'Kategorien pflegen',
value: store.adminSeasonDetail.categories.length,
to: '/admin/seasons',
to: '/admin/years',
hint: 'Texte, Limits und Sortierung',
},
{
+5 -5
View File
@@ -13,8 +13,8 @@ const authStore = useAuthStore()
const navItems = [
{ label: 'Dashboard', to: '/admin/dashboard', description: 'Status, Trends, Quick Actions', icon: LayoutDashboard, badge: () => null },
{ label: 'Seasons', to: '/admin/seasons', description: 'Season-Status, Kategorien, Limits', icon: CalendarCog, badge: () => `${store.adminSeasonDetail.categories.length}` },
{ label: 'Candidates', to: '/admin/candidates', description: 'Kandidatenbasis pro Season pflegen', icon: Users, badge: () => `${store.adminSeasonDetail.candidates.length}` },
{ label: 'Jahre', to: '/admin/years', description: 'Jahresstatus, Kategorien, Limits', icon: CalendarCog, badge: () => `${store.adminSeasonDetail.categories.length}` },
{ label: 'Candidates', to: '/admin/candidates', description: 'Kandidatenbasis pro Jahr pflegen', icon: Users, badge: () => `${store.adminSeasonDetail.candidates.length}` },
{ label: 'Reviews', to: '/admin/reviews', description: 'Freitext-Nominierungen bearbeiten', icon: Sparkles, badge: () => `${store.adminSeasonDetail.pendingNominations.length}` },
{ label: 'Risk & Audit', to: '/admin/risk', description: 'Flags pruefen, Aktionen nachvollziehen', icon: AlertTriangle, badge: () => `${store.admin.riskFlags.length}` },
]
@@ -67,9 +67,9 @@ onMounted(async () => {
</Card>
<Card class="p-3">
<p class="text-[10px] font-semibold uppercase tracking-[0.18em] text-violet-500">Aktive Season</p>
<p class="mt-1 truncate text-sm font-semibold text-violet-800">{{ currentSeason.year || 'Keine Season' }} · {{ currentSeason.currentPhase || 'Kein Status' }}</p>
<p class="mt-1 truncate text-xs text-slate-500">{{ currentSeason.name || 'Bitte Season auswaehlen.' }}</p>
<p class="text-[10px] font-semibold uppercase tracking-[0.18em] text-violet-500">Aktives Jahr</p>
<p class="mt-1 truncate text-sm font-semibold text-violet-800">{{ currentSeason.year || 'Kein Jahr' }} · {{ currentSeason.currentPhase || 'Kein Status' }}</p>
<p class="mt-1 truncate text-xs text-slate-500">{{ currentSeason.name || 'Bitte Jahr auswaehlen.' }}</p>
<div class="mt-3 grid grid-cols-3 gap-1.5">
<div
v-for="item in seasonSummary"
@@ -172,7 +172,7 @@ async function rejectNomination(nominationId: number) {
</div>
<p v-if="seasonDetail.pendingNominations.length === 0" class="rounded-[26px] border border-dashed border-violet-100 px-5 py-6 text-sm text-slate-500">
Keine offenen Review-Faelle in der aktuell gewaehlten Season.
Keine offenen Review-Faelle im aktuell gewaehlten Award-Jahr.
</p>
<p v-else-if="filteredNominations.length === 0" class="rounded-[26px] border border-dashed border-violet-100 px-5 py-6 text-sm text-slate-500">
Keine Review-Faelle passen zum aktuellen Filter.
@@ -84,9 +84,9 @@ async function saveSeason() {
currentPhase: seasonForm.currentPhase,
isCurrent: seasonForm.isCurrent,
})
adminMessage.value = 'Season-Einstellungen gespeichert.'
adminMessage.value = 'Jahres-Einstellungen gespeichert.'
} catch (error) {
adminError.value = error instanceof Error ? error.message : 'Season konnte nicht gespeichert werden.'
adminError.value = error instanceof Error ? error.message : 'Jahr konnte nicht gespeichert werden.'
} finally {
seasonSaving.value = false
}
@@ -136,8 +136,8 @@ async function createCategory() {
<template>
<div class="space-y-6">
<AdminPageHeader
eyebrow="Seasons"
title="Season und Kategorien verwalten"
eyebrow="Jahre"
title="Jahr und Kategorien verwalten"
description="Hier steuerst du die aktive Phase, legst neue Kategorien an und pflegst bestehende Gruppen, Limits und Beschreibungen."
/>
@@ -147,8 +147,8 @@ async function createCategory() {
<Card class="p-7">
<div class="flex flex-col gap-6">
<div>
<h2 class="font-[Cormorant_Garamond] text-4xl text-violet-800">Season Setup</h2>
<p class="mt-2 text-sm text-slate-500">Phase, Current-Status und Basiskontext fuer die aktive Awards-Season.</p>
<h2 class="font-[Cormorant_Garamond] text-4xl text-violet-800">Jahres-Setup</h2>
<p class="mt-2 text-sm text-slate-500">Phase, Current-Status und Basiskontext fuer das aktive Award-Jahr.</p>
</div>
<div class="space-y-3">
@@ -162,12 +162,12 @@ async function createCategory() {
<label class="flex items-center gap-3 rounded-2xl border border-violet-100 bg-violet-50/60 px-4 py-4 text-sm text-slate-700">
<input v-model="seasonForm.isCurrent" type="checkbox" class="h-4 w-4 accent-violet-600" />
Diese Season ist die aktuelle Public Season
Dieses Jahr ist das aktuelle Public-Jahr
</label>
<div class="flex flex-wrap items-center gap-4">
<Button :disabled="seasonSaving || !selectedSeasonId" @click="saveSeason">
{{ seasonSaving ? 'Speichert ...' : 'Season speichern' }}
{{ seasonSaving ? 'Speichert ...' : 'Jahr speichern' }}
</Button>
<span class="text-sm text-slate-500">
{{ seasonDetail.year }} · {{ seasonDetail.name }}
@@ -204,7 +204,7 @@ async function createCategory() {
<Card class="p-7">
<div class="flex items-center justify-between gap-4">
<div>
<h2 class="font-[Cormorant_Garamond] text-4xl text-violet-800">Kategorien der Season</h2>
<h2 class="font-[Cormorant_Garamond] text-4xl text-violet-800">Kategorien des Jahres</h2>
<p class="mt-2 text-sm text-slate-500">Sortierung, Slugs und Limits werden hier pro Jahr gepflegt.</p>
</div>
<span class="text-sm uppercase tracking-[0.2em] text-slate-500">