diff --git a/.release-please-manifest-beta.json b/.release-please-manifest-beta.json index ff00dcac..17a99203 100644 --- a/.release-please-manifest-beta.json +++ b/.release-please-manifest-beta.json @@ -1,3 +1,3 @@ { - ".": "3.35.0-beta.0" + ".": "3.36.0-beta.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 67950a22..bcc87597 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to PicPeak will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [3.36.0-beta.0](https://github.com/the-luap/picpeak/compare/v3.35.0-beta.0...v3.36.0-beta.0) (2026-05-04) + + +### Features + +* **events:** prefill admin email + admin picker on event creation ([3fe8e61](https://github.com/the-luap/picpeak/commit/3fe8e61bd1175e35dcb61604447e5d9c2e902ec5)) + ## [3.35.0-beta.0](https://github.com/the-luap/picpeak/compare/v3.34.2-beta.0...v3.35.0-beta.0) (2026-05-04) diff --git a/backend/package.json b/backend/package.json index bce0acab..72d61772 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "picpeak-backend", - "version": "3.35.0-beta.0", + "version": "3.36.0-beta.0", "description": "Backend for PicPeak event photo sharing platform", "main": "server.js", "scripts": { diff --git a/frontend/package.json b/frontend/package.json index 956800e6..27c609dd 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "picpeak-frontend", "private": true, - "version": "3.35.0-beta.0", + "version": "3.36.0-beta.0", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/src/i18n/locales/de.json b/frontend/src/i18n/locales/de.json index accd89b5..32b73506 100644 --- a/frontend/src/i18n/locales/de.json +++ b/frontend/src/i18n/locales/de.json @@ -1019,6 +1019,8 @@ "welcomeMessagePlaceholder": "Willkommen zu unserem besonderen Tag! Laden Sie diese Erinnerungen gerne herunter und teilen Sie sie...", "hostEmailPlaceholder": "kunde@beispiel.de", "adminEmailPlaceholder": "admin@beispiel.de", + "adminEmailPickFromAdmins": "Aus Admins wählen:", + "adminEmailCustom": "Eigene E-Mail", "securityAndAccess": "Sicherheit & Zugriff", "accessAndSecurity": "Zugriff & Sicherheit", "enterPassword": "Passwort eingeben", diff --git a/frontend/src/i18n/locales/en.json b/frontend/src/i18n/locales/en.json index 20efb40b..3689dec0 100644 --- a/frontend/src/i18n/locales/en.json +++ b/frontend/src/i18n/locales/en.json @@ -356,6 +356,8 @@ "welcomeMessagePlaceholder": "Welcome to our special day! Feel free to download and share these memories...", "hostEmailPlaceholder": "customer@example.com", "adminEmailPlaceholder": "admin@example.com", + "adminEmailPickFromAdmins": "Pick from admins:", + "adminEmailCustom": "Custom email", "securityAndAccess": "Security & Access", "accessAndSecurity": "Access & Security", "enterPassword": "Enter password", diff --git a/frontend/src/i18n/locales/nl.json b/frontend/src/i18n/locales/nl.json index f1f00717..58a6ab8d 100644 --- a/frontend/src/i18n/locales/nl.json +++ b/frontend/src/i18n/locales/nl.json @@ -350,6 +350,8 @@ "welcomeMessagePlaceholder": "Welkom bij onze bijzondere dag! Voel u vrij om deze herinneringen te downloaden en te delen...", "hostEmailPlaceholder": "klant@voorbeeld.nl", "adminEmailPlaceholder": "admin@voorbeeld.nl", + "adminEmailPickFromAdmins": "Kies uit beheerders:", + "adminEmailCustom": "Aangepast e-mailadres", "securityAndAccess": "Beveiliging & Toegang", "accessAndSecurity": "Toegang & Beveiliging", "enterPassword": "Voer wachtwoord in", diff --git a/frontend/src/i18n/locales/pt.json b/frontend/src/i18n/locales/pt.json index 1d32bb90..b9d918fe 100644 --- a/frontend/src/i18n/locales/pt.json +++ b/frontend/src/i18n/locales/pt.json @@ -350,6 +350,8 @@ "welcomeMessagePlaceholder": "Bem-vindo(a) ao nosso dia especial! Sinta-se à vontade para baixar e compartilhar essas memórias...", "hostEmailPlaceholder": "cliente@exemplo.com", "adminEmailPlaceholder": "admin@exemplo.com", + "adminEmailPickFromAdmins": "Escolher entre administradores:", + "adminEmailCustom": "E-mail personalizado", "securityAndAccess": "Segurança e Acesso", "accessAndSecurity": "Acesso e Segurança", "enterPassword": "Digite a senha", diff --git a/frontend/src/i18n/locales/ru.json b/frontend/src/i18n/locales/ru.json index bb038675..e239cdfb 100644 --- a/frontend/src/i18n/locales/ru.json +++ b/frontend/src/i18n/locales/ru.json @@ -350,6 +350,8 @@ "welcomeMessagePlaceholder": "Добро пожаловать на наш особый день! Скачивайте и делитесь этими воспоминаниями...", "hostEmailPlaceholder": "client@example.com", "adminEmailPlaceholder": "admin@example.com", + "adminEmailPickFromAdmins": "Выбрать из админов:", + "adminEmailCustom": "Произвольный e-mail", "securityAndAccess": "Безопасность и доступ", "accessAndSecurity": "Доступ и безопасность", "enterPassword": "Введите пароль", diff --git a/frontend/src/pages/admin/CreateEventPage.tsx b/frontend/src/pages/admin/CreateEventPage.tsx index bde500f9..d0d36ebc 100644 --- a/frontend/src/pages/admin/CreateEventPage.tsx +++ b/frontend/src/pages/admin/CreateEventPage.tsx @@ -25,6 +25,8 @@ import { settingsService } from '../../services/settings.service'; import { usePublicSettings } from '../../hooks/usePublicSettings'; import { cssTemplatesService } from '../../services/cssTemplates.service'; import { eventTypesService } from '../../services/eventTypes.service'; +import { userManagementService } from '../../services/userManagement.service'; +import { useAdminAuth } from '../../contexts/AdminAuthContext'; import { useTranslation } from 'react-i18next'; import { ThemeConfig, GALLERY_THEME_PRESETS } from '../../types/theme.types'; import { Code } from 'lucide-react'; @@ -172,6 +174,41 @@ export const CreateEventPage: React.FC = () => { const { data: publicSettings } = usePublicSettings(); + // Current logged-in admin (used to prefill the admin email field) + const { user: currentAdmin } = useAdminAuth(); + + // Optional: list of admin users — used to populate the email picker when + // there are multiple admins. Falls back to an empty list silently if the + // current user lacks `users.view` permission, so basic admins still get + // the auto-prefill from `currentAdmin` without errors surfacing. + const { data: adminUsers } = useQuery({ + queryKey: ['admin-users-list'], + queryFn: async () => { + try { + return await userManagementService.getUsers(); + } catch { + return []; + } + }, + staleTime: 5 * 60 * 1000, + retry: false + }); + + const activeAdmins = useMemo( + () => (adminUsers || []).filter(u => u.isActive !== false && !!u.email), + [adminUsers] + ); + + // Auto-prefill admin email with the current user's email exactly once, + // and only if the field is still empty (don't clobber typed input). + const didPrefillAdminEmailRef = useRef(false); + useEffect(() => { + if (didPrefillAdminEmailRef.current) return; + if (!currentAdmin?.email) return; + didPrefillAdminEmailRef.current = true; + setFormData(prev => (prev.admin_email ? prev : { ...prev, admin_email: currentAdmin.email })); + }, [currentAdmin?.email]); + // Get field requirements (default to true if not set) const requireCustomerName = publicSettings?.event_require_customer_name !== false; const requireCustomerEmail = publicSettings?.event_require_customer_email !== false; @@ -673,6 +710,31 @@ export const CreateEventPage: React.FC = () => { error={errors.admin_email} leftIcon={} /> + {activeAdmins.length > 1 && ( +
+ + +
+ )}
diff --git a/frontend/src/pages/admin/EventDetailsPage.tsx b/frontend/src/pages/admin/EventDetailsPage.tsx index c81428f2..aeade798 100644 --- a/frontend/src/pages/admin/EventDetailsPage.tsx +++ b/frontend/src/pages/admin/EventDetailsPage.tsx @@ -66,7 +66,7 @@ import { api } from '../../config/api'; import { buildResourceUrl, buildShareLinkUrl } from '../../utils/url'; import { isGalleryPublic, normalizeRequirePassword } from '../../utils/accessControl'; import { archiveService } from '../../services/archive.service'; -import { externalMediaService } from '../../services/externalMedia.service'; +import { externalMediaService, type ExternalEntry } from '../../services/externalMedia.service'; import { photosService, AdminPhoto, type PhotoFilters as PhotoFilterParams, type FeedbackFilters } from '../../services/photos.service'; import { feedbackService, FeedbackSettings as FeedbackSettingsType } from '../../services/feedback.service'; import { cssTemplatesService, type EnabledTemplate } from '../../services/cssTemplates.service';