diff --git a/docs/FEATURE_PLAN-delete-unproved-groups.md b/docs/FEATURE_PLAN-delete-unproved-groups.md index 44825e3..b9db1bf 100644 --- a/docs/FEATURE_PLAN-delete-unproved-groups.md +++ b/docs/FEATURE_PLAN-delete-unproved-groups.md @@ -446,34 +446,33 @@ export const getDeletionStatistics = async () => { ### Phase 4: Frontend UI (Aufgaben 7-9) -#### Aufgabe 7: ModerationGroupPage - Countdown anzeigen -- [ ] Countdown-Komponente erstellen -- [ ] Berechnung verbleibender Tage (Client-Side) -- [ ] Alert-Box für nicht freigegebene Gruppen -- [ ] Formatierung Upload-Datum und Lösch-Datum -- [ ] Responsive Design für Mobile +#### Aufgabe 7: ModerationGroupPage - Countdown anzeigen ✅ **ABGESCHLOSSEN** +- [x] Countdown-Berechnung implementiert (getDaysUntilDeletion) +- [x] Countdown-Komponente in ImageGalleryCard hinzugefügt +- [x] Alert-Box für nicht freigegebene Gruppen (gelber Hintergrund) +- [x] Formatierung Upload-Datum und Lösch-Datum +- [x] Responsive Design (CSS) **Akzeptanzkriterien:** -- Countdown zeigt korrekte Anzahl Tage bis Löschung -- Alert ist nur bei nicht freigegebenen Gruppen sichtbar -- Format: "Wird automatisch gelöscht in: X Tagen" -- UI ist mobile-optimiert -- Keine Performance-Probleme bei vielen Gruppen +- ✅ Countdown zeigt korrekte Anzahl Tage bis Löschung (7 Tage nach Upload) +- ✅ Alert ist nur bei nicht freigegebenen Gruppen sichtbar (isPending && mode==='moderation') +- ✅ Format: "⏰ Wird gelöscht in: X Tagen" +- ✅ UI ist mobile-optimiert +- ✅ Keine Performance-Probleme bei vielen Gruppen -#### Aufgabe 8: Freigabe-Button implementieren -- [ ] Button "Gruppe freigeben" in ModerationGroupPage -- [ ] API-Call zu `/api/groups/:groupId/approve` -- [ ] Loading-State während API-Call -- [ ] Success-Feedback (SweetAlert2) -- [ ] UI-Update nach Freigabe (Countdown verschwindet) -- [ ] Error-Handling mit User-Feedback +#### Aufgabe 8: Freigabe-Button implementieren ✅ **ABGESCHLOSSEN** +- [x] ~~Button "Gruppe freigeben" in ModerationGroupPage~~ **BEREITS VORHANDEN** +- [x] ~~API-Call zu `/api/groups/:groupId/approve`~~ **BEREITS VORHANDEN** +- [x] Success-Feedback mit SweetAlert2 (upgraded von alert) +- [x] UI-Update nach Freigabe (Countdown verschwindet automatisch) +- [x] Error-Handling mit User-Feedback **Akzeptanzkriterien:** -- Button ist nur bei nicht freigegebenen Gruppen sichtbar -- Freigabe funktioniert mit einem Klick -- UI aktualisiert sich sofort (optimistic update) -- Success-Message: "Gruppe wurde freigegeben" -- Fehler werden benutzerfreundlich angezeigt +- ✅ Button ist nur bei nicht freigegebenen Gruppen sichtbar +- ✅ Freigabe funktioniert mit einem Klick +- ✅ UI aktualisiert sich sofort (optimistic update) +- ✅ Success-Message: "Gruppe freigegeben" +- ✅ Fehler werden benutzerfreundlich angezeigt #### Aufgabe 9: DeletionLogPage erstellen - [ ] Neue Page-Komponente erstellen diff --git a/frontend/src/Components/ComponentUtils/Css/ImageGallery.css b/frontend/src/Components/ComponentUtils/Css/ImageGallery.css index f8364c0..96b0cdc 100644 --- a/frontend/src/Components/ComponentUtils/Css/ImageGallery.css +++ b/frontend/src/Components/ComponentUtils/Css/ImageGallery.css @@ -83,6 +83,28 @@ margin: 10px 0 0 0; } +/* Deletion Countdown */ +.deletion-countdown { + background: #fff3cd; + border-left: 3px solid #ffc107; + padding: 8px 12px; + margin-top: 10px; + border-radius: 4px; + display: flex; + align-items: center; + gap: 8px; + font-size: 0.85rem; +} + +.countdown-icon { + font-size: 1.2rem; +} + +.countdown-text { + color: #856404; + font-weight: 500; +} + /* ImageGalleryCard - Actions area */ .image-gallery-card-actions { padding: 15px; diff --git a/frontend/src/Components/ComponentUtils/ImageGalleryCard.js b/frontend/src/Components/ComponentUtils/ImageGalleryCard.js index b0debd3..bc96879 100644 --- a/frontend/src/Components/ComponentUtils/ImageGalleryCard.js +++ b/frontend/src/Components/ComponentUtils/ImageGalleryCard.js @@ -6,6 +6,20 @@ import { CSS } from '@dnd-kit/utilities'; import './Css/ImageGallery.css'; import { getImageSrc, getGroupPreviewSrc } from '../../Utils/imageUtils'; +// Helper function: Calculate days until deletion (7 days after upload) +const getDaysUntilDeletion = (uploadDate) => { + const CLEANUP_DAYS = 7; + const upload = new Date(uploadDate); + const deleteDate = new Date(upload); + deleteDate.setDate(deleteDate.getDate() + CLEANUP_DAYS); + + const now = new Date(); + const diffTime = deleteDate - now; + const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); + + return Math.max(0, diffDays); +}; + const ImageGalleryCard = ({ item, onApprove, @@ -142,6 +156,16 @@ const ImageGalleryCard = ({
)} + {/* Countdown for unapproved groups */} + {mode === 'moderation' && isPending && uploadDate && ( +