Commit Graph

23 Commits

Author SHA1 Message Date
2ca1f4ff54 feat: redesign Step 8 with flat list layout matching room steps
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>
2026-02-12 22:47:39 +09:00
89bd555dc1 feat: modernize wizard UX with smart rows, steppers, transitions, and edit links
- 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>
2026-02-07 23:46:36 +09:00
b9ae7d707d fix: step navigation back-click bug and add shortcode lang attribute
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>
2026-02-07 22:54:55 +09:00
64caccc5c1 fix: resolve form submission issues and add CPT detail view
- 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>
2026-02-07 13:03:31 +09:00
c0021befe2 feat: add standalone form page, close all audit gaps, pass v1.0 milestone
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>
2026-02-07 12:09:11 +09:00
a7c70031d9 fix(09): wrap wp_die error strings in gettext and update translations
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>
2026-02-07 00:06:25 +09:00
a32260dc87 feat(09-02): wrap form-facing strings and localize JS validation
- 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
2026-02-06 23:51:56 +09:00
8982227d33 feat(09-01): wrap admin and infrastructure strings in gettext functions
- 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)
2026-02-06 23:41:39 +09:00
270349b82f feat(08-02): sanitize additional work data and generate email sections
- 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>
2026-02-06 23:00:39 +09:00
d0edef9c00 feat(08-02): render additional work sections and Sonstiges in form
- 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>
2026-02-06 22:59:42 +09:00
28fcfcca34 fix(08-01): replace session_id with unique form_id to prevent error cross-contamination
- 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>
2026-02-06 22:55:30 +09:00
9c8ddc555c feat: add core implementation files for phases 4-6
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>
2026-01-16 23:06:23 +09:00
d1d71a5e4e feat(07-01): integrate captcha verification in form handler
- 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>
2026-01-16 12:30:42 +09:00
64f25041ad feat(07-01): add captcha widget and error display
- 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>
2026-01-16 12:30:35 +09:00
486d88e5b1 feat(07-01): create captcha verification class
- 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>
2026-01-16 12:30:18 +09:00
dca1cf7f37 feat(03-01): add settings save confirmation
- 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
2026-01-16 11:46:23 +09:00
6cfa6e2451 feat(03-01): add settings sections and fields with German labels
- 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
2026-01-16 11:46:08 +09:00
e87d974f71 feat(03-01): create settings class with WordPress Settings API
- 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
2026-01-16 11:45:16 +09:00
4d2a584e08 feat(02-01): extract additional work sections from legacy
- 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>
2026-01-16 11:32:56 +09:00
5bb324c4c3 feat(02-01): extract furniture data from legacy into structured class
- 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>
2026-01-16 11:30:51 +09:00
cd9b6a6891 fix(01-01): correct CPT registration hook timing
- 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
2026-01-16 11:10:01 +09:00
253129cfca feat(01-01): create admin menu structure
- Created Umzugsliste_Admin_Menu class with singleton pattern
- Top-level menu 'Umzugsliste' with dashicons-list-view icon
- Position 25 (below Comments, above Appearance)
- Capability: edit_posts (editors and above)
- Submenu 'Einträge' links to CPT list view
- Submenu 'Einstellungen' shows placeholder (Phase 3)
- Removed duplicate top-level menu item
2026-01-16 11:02:32 +09:00
59acfaee51 feat(01-01): register custom post type for form submissions
- Created Umzugsliste_CPT class with singleton pattern
- Registered umzugsliste_entry post type
- German labels (Einträge, Eintrag)
- Settings: public=false, show_ui=true, show_in_menu=false
- Supports title field only (custom fields in Phase 6)
- Registered on init hook
2026-01-16 11:02:21 +09:00