- Add spacing below Datenschutzerklaerung text
- Fix missing Umzugstermin on step 9 (wrong field names in JS)
- Remove number-to-checkmark animation flicker on progress dots
- Add cbm unit label to furniture item values and summary
- Translate all summary field labels via l10n (Name, Strasse, etc.)
- Fix room names showing lowercase keys instead of proper titles
- Auto-check checkbox when quantity is entered on step 8
- Remove redundant Sonstiges textarea placeholder
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace generic Google blue with 3 professional palettes (Deep Teal,
Slate Blue & Amber, Rich Olive & Copper) using CSS token overrides.
Palette B (Slate Blue + amber Next button) is the default. Includes
WP_DEBUG-only purple switcher button to cycle between palettes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace bordered card sections with flat rows using hairline dividers,
opacity dimming, and native radio controls to match the room step visual
pattern. Also includes structural refactors (step-sections, address-sections)
and running totals bar polish from the modernization branch.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Hide montage toggles and dim furniture rows when quantity is 0
- Animate running totals bar with CSS transform instead of display toggle
- Add directional slide transitions (forward/backward) between steps
- Add +/- stepper buttons around quantity inputs for better affordance
- Increase mobile tap targets to 44px and show active step label
- Add "Edit" links to summary section headings for quick navigation
- Add "Step X of Y" counter below progress bar
- Add summaryEdit, stepLabel, stepOf l10n strings to both entry points
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Track highestStep so navigating backward preserves completed dots and
allows clicking forward to any previously visited step. Add [umzugsliste
lang="de|en"] shortcode attribute that switches locale via
switch_to_locale() for per-page language control.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add Phase 10 GSD documentation for three critical bugs found during
manual testing: form submit 404 (reserved query vars), handler init
timing, and missing CPT detail meta box. Update ROADMAP and STATE
tracking files.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rename day/month/year form fields to umzug_day/umzug_month/umzug_year
to avoid conflict with WordPress reserved public query variables that
caused a 404 on form POST
- Move form handler instantiation to init_hooks() so handle_submission
registers on the init action before it fires
- Add standalone template fallback: detect [umzugsliste] shortcode in
page content when form_page_id option is not set
- Add submission details meta box to CPT entries showing addresses,
furniture, additional work, and status
- Add German translations for all new admin meta box strings
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add standalone form page template that bypasses the theme, with admin
setting and auto-creation on plugin activation. Fix reCAPTCHA v3 double
submission, remove jQuery dependency, extend localized JS strings, and
overhaul form CSS/JS. Update milestone audit to PASSED (9/9, 10/10, 5/5).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Verifier caught 5 hardcoded German strings in the email failure wp_die
block. Wrapped in esc_html__(), added German translations, regenerated
POT/PO/MO files.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Generated POT template with 224 translatable strings using WP-CLI
- Created German de_DE PO file with complete translations
- All room names translated (7 rooms)
- All 90+ furniture item names translated across all rooms
- All additional work section labels and fields translated
- All form UI strings translated (headers, labels, buttons, placeholders)
- All validation messages translated
- All settings page strings translated
- Compiled MO binary file for out-of-box German support
- POT file follows Loco Translate naming convention
- PO file has UTF-8 encoding with German umlauts (ä, ö, ü, ß)
- 222 of 224 strings translated (only empty msgid and metadata remain)
- MO file: 14K compiled binary
- Files ship with plugin for immediate German translation support
- Wrap all room names and 90+ furniture item names in __()
- Wrap all additional work section labels and field names in __()
- Wrap all form renderer UI strings (headers, labels, buttons) in gettext
- Pass translated address field labels to render methods
- Wrap validation error messages in class-form-handler
- Force German locale for email generation via switch_to_locale()
- Restore locale after email with restore_previous_locale()
- Add wp_localize_script() for JS validation messages
- Update form.js to use umzugslisteL10n for translated strings
- Email generator remains untouched (hardcoded German as required)
- Email subject stays hardcoded German (not wrapped in gettext)
- All PHP files pass syntax check
- 163 gettext calls in furniture-data, 26 in form-renderer
- CPT labels: wrap all 13 labels in __() with English source strings
- Admin menu: wrap menu titles (Moving List, Entries, Settings) in __()
- Settings page: wrap all section titles, field labels, and descriptions with appropriate gettext functions
- Date helpers: wrap Day, Month, Year labels in esc_html__()
- All strings use English as source language per i18n strategy
- Text domain 'siegel-umzugsliste' applied throughout
- German translations will be provided in .po file (Plan 02)
- Update text domain from 'umzugsliste' to 'siegel-umzugsliste' in plugin header
- Add siegel_umzugsliste_load_textdomain() function hooked on init priority 1
- Add change_locale hook to reload text domain (workaround for WP core bug #39210)
- Text domain loading enables translation file support in languages/ directory
Tasks completed: 2/2
- Render additional work sections and Sonstiges in form
- Sanitize additional work data and generate email sections
SUMMARY: .planning/phases/08-bugfixes-legacy-parity/08-02-SUMMARY.md
- Added sanitization for additional_work array in sanitize_submission()
- Keys sanitized with sanitize_key(), values with sanitize_text_field()
- Added sanitization for sonstiges with sanitize_textarea_field()
- Added generate_additional_work_sections() to generate email tables
- Added has_additional_work_data() helper to check if section has data
- Added generate_sonstiges_section() for Sonstiges textarea in email
- Email tables use legacy bgcolor='#CCCCCC' header pattern
- All 4 field types (checkbox, abbau_aufbau, checkbox_anzahl, text) handled
- Empty sections omitted from email for clean formatting
- Line breaks preserved in Sonstiges with nl2br()
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Added render_additional_work_sections() method to loop through all sections
- Added render_additional_work_section() to render individual sections with correct field types
- Added render_sonstiges_field() for free text textarea
- Added get_field_key() helper to generate field keys from field names
- Field types: checkbox, abbau_aufbau (radio), checkbox_anzahl, text
- All fields use additional_work[section][key] naming pattern
- Added CSS styling for additional work sections and Sonstiges textarea
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove all session_id() calls (unreliable on WordPress hosts)
- Generate unique form_id with uniqid() in form renderer
- Pass form_id via hidden field and GET parameter through redirect
- Use form_id for per-submission transient keys
- Fix validation error format to match expected array structure with 'messages' key
- Both captcha and validation errors now use consistent format
Fixes production-blocking bug where multiple users shared 'umzugsliste_errors_default' transient key.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add missing implementation files and planning docs:
- Phase 04: Shortcode handler and date helpers for form rendering
- Phase 05: Planning documentation for volume calculations
- Phase 06: Email generator for legacy HTML table format
These complete the form rendering, calculation, and email system.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Phase 7 implementation complete:
- Created captcha verification class
- Added inline form validation
- Integrated captcha with form
- Added error styling
- Updated all documentation
All 7 phases now complete! Plugin ready for testing.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Verify captcha after nonce check
- Support all three providers
- Store captcha errors in transient
- Redirect back to form on verification failure
- German error message for failed captcha
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Render validation errors from transient at form top
- Display error summary with red border
- Integrate captcha widget in submit section
- Position captcha above submit button
- Delete transient after displaying errors
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Client-side validation on blur and submit
- Email format validation
- Required field validation
- Furniture items validation (at least one)
- Date field validation
- Inline error messages (no JavaScript alerts)
- Auto-scroll to first error
- Error clearing on field input
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Support for reCAPTCHA v2, v3, and hCaptcha
- Server-side verification with wp_remote_post
- Automatic script enqueuing based on provider
- Widget rendering for all three providers
- reCAPTCHA v3 score checking (>= 0.5)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Tasks completed: 3/3
- Settings class with WordPress Settings API
- Settings sections and fields with German labels
- Settings save confirmation
SUMMARY: .planning/phases/03-settings/03-01-SUMMARY.md
- Added settings_errors() call to display WordPress admin notices
- get_option() helper method already implemented for clean API access
- Settings now show success message after save
- All settings validated and persisted via WordPress Settings API
- Three sections: Email, Captcha, Form settings
- Email: receiver address field with validation
- Captcha: provider dropdown (none/reCAPTCHA v2/v3/hCaptcha) with dynamic key fields
- Form: thank you URL field
- JavaScript to show/hide captcha keys based on provider selection
- All labels and descriptions in German
- Settings class with singleton pattern
- Registered 5 settings: receiver_email, captcha_provider, captcha_site_key, captcha_secret_key, thankyou_url
- Proper sanitization callbacks for each setting type
- Helper method get_option() for clean API access
- Integrated with admin menu structure
- Added 6 additional work sections: Montage, Schrank, Elektriker, Dübelarbeiten, Packarbeiten, Anfahrt
- Each section includes label, fields with type information
- Field types: checkbox, abbau_aufbau, checkbox_anzahl, text
- Total: 32 additional work fields across 6 sections
- Preserves exact field names and structure from legacy
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Created Umzugsliste_Furniture_Data class with singleton pattern
- Extracted all 118 furniture items from 7 rooms with exact cbm values
- Preserved exact item names and order from legacy liste.php
- Room structure: wohnzimmer (32), schlafzimmer (15), arbeitszimmer (11), bad (3), kueche_esszimmer (18), kinderzimmer (18), keller (21)
- All items have name, cbm (float), and montage (boolean) properties
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- CPT init hook was being added from within parent init hook
- Changed to call register_post_type() directly from main init
- Removed redundant hook from CPT constructor
- Fixes CPT not registering on plugin activation
Tasks completed: 3/3
- Create main plugin file with bootstrap code
- Register Custom Post Type for form submissions
- Create admin menu structure
SUMMARY: .planning/phases/01-foundation/01-01-SUMMARY.md