Every 'read-only placeholder' and 'missing functionality' gap from the
QA audit is now resolved:
COURSES — categories/instructors/locations can now be deleted:
- Added update/delete methods to course-reference-data.service.ts
- Added deleteCategory/deleteInstructor/deleteLocation server actions
- Created DeleteRefDataButton client component with confirmation dialog
- Wired delete buttons into all three table pages
BOOKINGS — calendar month navigation now works:
- Calendar was hardcoded to current month with disabled prev/next
- Added year/month search params for server-side month rendering
- Replaced disabled buttons with Link-based navigation
- Verified: clicking next/prev correctly renders different months
DOCUMENTS — templates page now reads from database:
- Was hardcoded empty array; now queries document_templates table
- Table exists since migration 20260414000006_shared_templates.sql
FISCHEREI — statistics page shows real data:
- Replaced dashed-border placeholder with 6 real stat cards
- Queries waters, species, stocking, catch_books, leases, permits
- Shows counts + stocking costs + pending catch books
- Falls back to helpful message when no data exists
VERBAND — statistics page shows real KPIs:
- Added server-side data fetching (clubs, members, fees)
- Passes activeClubs, totalMembers, openFees as props
- Added 4 KPI cards: Aktive Vereine, Gesamtmitglieder,
∅ Mitglieder/Verein, Offene Beiträge
- Kept existing trend charts below KPI cards
Every module had buttons that rendered visually but did nothing when
clicked. Server actions existed for all of them. Created client
components with dialogs/forms and wired them in.
BOOKINGS MODULE:
- BookingStatusActions: Check-in/Check-out/Cancel buttons now call
updateBookingStatus server action with loading states + toast
- CreateRoomDialog: 'Neues Zimmer' opens dialog with room number,
name, capacity, price/night fields → calls createRoom
- CreateGuestDialog: 'Neuer Gast' opens dialog with first/last name,
email, phone fields → calls createGuest
COURSES MODULE:
- EnrollParticipantDialog: 'Teilnehmer anmelden' on participants
page opens dialog with first/last name, email, phone → calls
enrollParticipant
EVENTS MODULE:
- EventRegistrationDialog: 'Anmeldung' button on event detail opens
dialog with participant data + DOB → calls registerForEvent
- CreateHolidayPassDialog: 'Neuer Ferienpass' opens dialog with name,
year, description, price, date range → calls createHolidayPass
NEWSLETTER MODULE:
- CreateTemplateDialog: 'Neue Vorlage' opens dialog with name,
subject, HTML body → calls createTemplate
SITE-BUILDER MODULE:
- Posts 'Neuer Beitrag' button now links to /posts/new page
All dialogs use German labels, helpful placeholders, loading spinners,
toast notifications, and form validation appropriate for association
board members (Vereinsvorstände, 40-65, moderate tech skills).
The SEPA batch detail page was a dead end: users could create a batch
but had no way to add payment positions or generate the XML file.
Added SepaBatchActions client component with three key workflows:
1. 'Mitglieder hinzufügen' — auto-populates batch from all active
members who have a SEPA mandate and dues category (calls existing
populateBatchFromMembers server action)
2. 'Einzelposition' — dialog to manually add a single debit item
with Name, IBAN, Amount, and Verwendungszweck fields
3. 'XML herunterladen' — dialog for creditor info (Gläubiger-Name,
IBAN, BIC, Gläubiger-ID) then generates and triggers download of
the SEPA pain.008 XML file. Disabled when batch has 0 positions.
Also fixed: SEPA list page crashed because a Server Component had an
onClick handler on a <tr> — removed the invalid event handler.
Target demographic: German association treasurers (Kassenwarte) who
need a straightforward workflow for annual membership fee collection
via SEPA Lastschrift.
- fix(member-detail): display gender in German (Männlich/Weiblich/Divers)
instead of raw English enum values (male/female/diverse)
- fix(member-detail): display country names in German (Österreich, Deutschland)
instead of raw ISO codes (AT, DE)
- fix(member-statistics): total member count was always 0
getStatistics() returns per-status counts without a total key;
now computes total by summing all status counts
- fix(i18n): add 56 breadcrumb segment translations for DE and EN
Breadcrumbs were showing English path segments (Courses, Calendar,
Registrations) because translation keys for URL path segments were
missing. Added all segment-level route translations so breadcrumbs
now display in German throughout the app.
The EcosystemShowcase component forces text-right on children when
textPosition="right", causing WhyItem content to be right-aligned.
Added text-left on the wrapper div to fix alignment.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Logo: Replace generic Makerkit SVG with MYeasyCMS branded logo (grid icon + styled text)
- Blog: Replace 3 SaaS placeholder posts with 5 real articles (Vereinsverwaltung, SEPA, Website, DSGVO, Mitglieder-Tipps)
- Changelog: Replace 6 generic entries with real feature announcements (Verbandsverwaltung, Fischerei, Dateien, Kurse, Einladungen, i18n)
- Documentation: Rewrite all 20 docs from Makerkit references to MYeasyCMS content
- FAQ: Replace 6 generic SaaS questions with 10 real MYeasyCMS questions
- Navigation: Replace Changelog link with Contact in main nav
- Footer: Reorganize into Product/Company/Legal sections
- Translations: Update all EN marketing strings to match real Com.BISS content
ROOT CAUSE FIX: All server-side Supabase clients (server-client, middleware-client,
server-admin-client) now use SUPABASE_INTERNAL_URL (http://supabase-kong:8000)
when available, with cookieOptions.name set to match the external URL's cookie key
(e.g. sb-myeasycms-auth-token). This gives us:
- Reliable Docker-internal networking (no hairpin NAT through Traefik)
- Correct session cookie matching between browser and server
- No more 500 errors on SSR pages that query Supabase
Reverted per-page try/catch workarounds since root cause is now fixed.
SSR pages crash with 500 when Supabase queries fail (expired session,
network issues). Now catch errors and render with empty data instead
of crashing the entire page.
- Updated version to 3.1.1 in package.json.
- Refactored mobile navigation components to enhance structure and usability.
- Adjusted layout components to improve responsiveness and visual consistency.
- Introduced shared mobile navigation components for better code reuse.
* chore: bump version to 3.1.0 and update dependencies in package.json, pnpm-lock.yaml, and pnpm-workspace.yaml; enhance billing services with support for hosted checkout page in Stripe integration
* Enhance error handling in billing services to log error messages instead of objects; update documentation for Stripe integration to clarify publishable key requirements based on UI mode.
* Refactor localization keys to use dot notation for consistency across documentation and components
* chore: bump version to 3.0.1 in package.json
* Remove console log from SidebarLayout and update migration documentation for AlertDialog usage within Dropdowns
* Update dashboard image to improve visual assets
Version 3 of the kit:
- Radix UI replaced with Base UI (using the Shadcn UI patterns)
- next-intl replaces react-i18next
- enhanceAction deprecated; usage moved to next-safe-action
- main layout now wrapped with [locale] path segment
- Teams only mode
- Layout updates
- Zod v4
- Next.js 16.2
- Typescript 6
- All other dependencies updated
- Removed deprecated Edge CSRF
- Dynamic Github Action runner