diff --git a/README.md b/README.md index 62d53da..77b3fc3 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ Eine Web-App inspiriert von Heardle, bei der Nutzer täglich einen Song anhand k - **Global-Kuratoren:** Optionale globale Kuratoren, die für alle Rätsel zuständig sind. - **Kurator-Dashboard:** Eigene Dashboard-Seite (`/curator` oder `/de/curator`, `/en/curator`) für Kuratoren. - **Song-Verwaltung:** Kuratoren können Songs hochladen, bearbeiten und Genres/Specials zuweisen. + - **Curate Specials:** Kuratoren können in einem eigenen Bereich („Curate Specials“) die Startzeiten der Songs in ihren zugewiesenen Specials über den Waveform-Editor einstellen – streng begrenzt auf ihre eigenen Specials. - **Batch-Edit:** Mehrere Titel gleichzeitig bearbeiten (Genre/Special Toggle, Artist ändern, Exclude Global Flag setzen). - **Kommentar-Verwaltung:** Kuratoren können Spieler-Kommentare zu ihren Rätseln einsehen, als gelesen markieren und archivieren. - **Spieler-Kommentare:** @@ -195,14 +196,16 @@ Das Projekt ist für den Betrieb mit Docker optimiert. - **Optional:** Setze ein Startdatum (Launch Date) und Enddatum. - **Optional:** Trage einen Kurator ein. - Weise Songs dem Special zu (über die Song-Bibliothek). - - Klicke auf "Curate" neben dem Special. - - Nutze den Waveform-Editor um den perfekten Ausschnitt zu wählen: - - **Klicken:** Positioniert die Selektion - - **Hovern:** Zeigt Vorschau der neuen Position - - **Zoom:** 🔍+ / 🔍− Buttons für detaillierte Ansicht - - **Pan:** ← / → Buttons zum Verschieben der Ansicht - - **Segment-Playback:** Teste einzelne Puzzle-Abschnitte - - **Save:** Speichere Änderungen mit dem grünen Button + - Die eigentliche Kuratierung (Auswahl des Ausschnitts) findet im **Kuratoren-Dashboard** statt: + - Logge dich als Kurator ein und gehe zu `/de/curator` oder `/en/curator`. + - Klicke im Dashboard auf **„Curate Specials“**, um eine Liste deiner zugewiesenen Specials zu sehen. + - Öffne ein Special und nutze dort den Waveform-Editor, um den perfekten Ausschnitt zu wählen: + - **Klicken:** Positioniert die Selektion + - **Hovern:** Zeigt Vorschau der neuen Position + - **Zoom:** 🔍+ / 🔍− Buttons für detaillierte Ansicht + - **Pan:** ← / → Buttons zum Verschieben der Ansicht + - **Segment-Playback:** Teste einzelne Puzzle-Abschnitte + - **Save:** Speichere Änderungen mit dem grünen Button - Die Spieler hören dann nur den kuratierten Ausschnitt. - Auf der Startseite werden zukünftige Specials unter "Coming soon" angezeigt (mit Datum und Kurator). diff --git a/app/curator/help/CuratorHelpClient.tsx b/app/curator/help/CuratorHelpClient.tsx index 9e167f6..3b14c68 100644 --- a/app/curator/help/CuratorHelpClient.tsx +++ b/app/curator/help/CuratorHelpClient.tsx @@ -95,6 +95,28 @@ export default function CuratorHelpClient() { + {/* Specials kuratieren */} +
+

+ {t('curateSpecialsHelpTitle')} +

+
+

{t('curateSpecialsHelpIntro')}

+

+ {t('curateSpecialsHelpStepsTitle')} +

+
    +
  1. {t('curateSpecialsHelpStep1')}
  2. +
  3. {t('curateSpecialsHelpStep2')}
  4. +
  5. {t('curateSpecialsHelpStep3')}
  6. +
  7. {t('curateSpecialsHelpStep4')}
  8. +
+

+ {t('note')}: {t('curateSpecialsPermissionsNote')} +

+
+
+ {/* Kommentar-Verwaltung */}

diff --git a/app/curator/specials/[id]/page.tsx b/app/curator/specials/[id]/page.tsx index b359d5a..f95c81b 100644 --- a/app/curator/specials/[id]/page.tsx +++ b/app/curator/specials/[id]/page.tsx @@ -5,6 +5,7 @@ import { useParams, useRouter, usePathname } from 'next/navigation'; import { useLocale, useTranslations } from 'next-intl'; import CurateSpecialEditor, { CurateSpecial } from '@/components/CurateSpecialEditor'; import { getCuratorAuthHeaders } from '@/lib/curatorAuth'; +import HelpTooltip from '@/components/HelpTooltip'; export default function CuratorSpecialEditorPage() { const params = useParams(); @@ -14,6 +15,7 @@ export default function CuratorSpecialEditorPage() { const intlLocale = useLocale() as 'de' | 'en'; const locale: 'de' | 'en' = urlLocale === 'de' || urlLocale === 'en' ? urlLocale : intlLocale; const t = useTranslations('Curator'); + const tHelp = useTranslations('CuratorHelp'); const specialId = params?.id as string; @@ -117,20 +119,49 @@ export default function CuratorSpecialEditorPage() { } return ( - router.push(`/${locale}/curator/specials`)} - onSaveStartTime={handleSaveStartTime} - backLabel={t('backToCuratorSpecials')} - headerPrefix={t('curateSpecialHeaderPrefix')} - noSongsHint={t('curateSpecialNoSongs')} - noSongsSubHint={t('curateSpecialNoSongsSub')} - instructionsText={t('curateSpecialInstructions')} - savingLabel={t('saving')} - saveChangesLabel={t('saveChanges')} - savedLabel={t('saved')} - /> +
+
+
+

+ {t('curateSpecialHeaderPrefix')} +

+ +
+ +
+ + router.push(`/${locale}/curator/specials`)} + onSaveStartTime={handleSaveStartTime} + backLabel={t('backToCuratorSpecials')} + headerPrefix={t('curateSpecialHeaderPrefix')} + noSongsHint={t('curateSpecialNoSongs')} + noSongsSubHint={t('curateSpecialNoSongsSub')} + instructionsText={t('curateSpecialInstructions')} + savingLabel={t('saving')} + saveChangesLabel={t('saveChanges')} + savedLabel={t('saved')} + /> +
); } diff --git a/app/curator/specials/page.tsx b/app/curator/specials/page.tsx index 3323f0a..f5f2163 100644 --- a/app/curator/specials/page.tsx +++ b/app/curator/specials/page.tsx @@ -4,6 +4,7 @@ import { useEffect, useState } from 'react'; import { useLocale, useTranslations } from 'next-intl'; import { Link } from '@/lib/navigation'; import { getCuratorAuthHeaders } from '@/lib/curatorAuth'; +import HelpTooltip from '@/components/HelpTooltip'; type LocalizedString = string | { de: string; en: string }; @@ -15,6 +16,7 @@ interface CuratorSpecialSummary { export default function CuratorSpecialsPage() { const t = useTranslations('Curator'); + const tHelp = useTranslations('CuratorHelp'); const locale = useLocale(); const [specials, setSpecials] = useState([]); const [loading, setLoading] = useState(true); @@ -94,9 +96,16 @@ export default function CuratorSpecialsPage() { return (
-

- {t('curateSpecialsTitle')} -

+
+

+ {t('curateSpecialsTitle')} +

+ +