- Replace non-existent FrmFormActionsController::create_action() with proper API
- Use get_form_actions('wppost')->prepare_new() pattern
- Affects job submission, edit, and deactivation forms
- Move register_activation_hook() to main plugin file top level
- WordPress requires activation hooks at bootstrap, not in plugins_loaded
- Fixes missing page creation on plugin activation
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Tasks completed: 1/1
- Add post meta guard to prevent duplicate mentor notifications
SUMMARY: .planning/quick/002-fix-duplicate-mentor-notifications-on-jo/002-SUMMARY.md
- Add post meta guard `_ddhh_mentors_notified` to track notification status
- Check meta before scheduling notifications, skip if already notified
- Set meta flag after successful batch scheduling
- Prevents re-notification when job edited and republished (pending -> publish)
- Maintains existing publish -> publish guard logic
- Move job submission form to separate view (?action=new_job)
- Replace inline form with prominent green button on main dashboard
- Migrate logos from per-job (post thumbnail) to per-provider (user meta)
- Add logo upload/removal functionality to provider dashboard
- Display provider logo on single job pages instead of per-job logo
- Add back link to archive on single job pages
- Remove logo handling from form submission/edit processors
- Improve button styling with proper CSS specificity
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add 1rem vertical padding to .ddhh-provider-dashboard for proper spacing
- Remove all !important declarations from button styles
- Use proper CSS specificity (.ddhh-jobs-table .button) instead
- Document CSS best practices in CLAUDE.md (avoid !important)
CSS specificity approach is more maintainable and prevents conflicts
with Elementor and other theme styles.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Make all button text white (!important) for better readability
- Add vertical padding (2.5rem) to green background sections
- Apply to all button types: logout, edit, view, deactivate
- Ensures text is visible against colored button backgrounds
Improves accessibility and visual hierarchy on provider dashboard.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add prominent logout button to all dashboard views (main, edit, deactivate)
showing logged-in user name and "Abmelden" (logout) option.
- Header displays "Angemeldet als: [Name]" with logout button
- Logout redirects back to /anbieter-login/ page
- Responsive design: stacks on mobile screens
- Consistent styling across all dashboard views
Fixes Issue 1 from Phase 7 testing: No logout option visible.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add job description to submission and edit emails (truncated to 500 chars)
- Fix deactivation reason timing bug by hooking into ddhh_job_deactivated action instead of transition_post_status
- Make all admin email links clickable HTML hyperlinks using proper <a> tags
- Convert all admin emails from plain text to proper HTML format with esc_html() on individual values
- Add setup_hooks() method to DDHH_JM_Pages class
- Add maybe_redirect_logged_in_from_login() method that checks if current page is login page
- Redirect logged-in providers to dashboard, allow non-providers to view login page
- Register Pages::setup_hooks() in main plugin orchestrator
Tasks completed: 3/3
- Archive access control and display verification
- Job detail page and application form verification
- Notification opt-in system verification
All tests PASSED with zero issues found. Mentor workflow fully functional.
SUMMARY: .planning/phases/07-testing-polish/07-02-SUMMARY.md
Add detailed documentation covering plugin architecture, subsystems, workflows, and development practices. Includes GSD workflow requirement for all code changes.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Replace mailto link with modal popup containing Formidable job application form. Modal stays open after submission to show success message.
Changes:
- Add modal popup with contact form on job detail pages
- Implement AJAX form submission to prevent page reload
- Auto-populate job_id field when modal opens
- Add field key compatibility for both job_id and job_id2
- Fix form ID comparison to use loose equality
- Keep modal open after submission to display success message
- Add modal styling and close functionality
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added form submit handler that converts DD.MM.YYYY dates back to YYYY-MM-DD format before submission. This fixes validation error "Bewerbungsfrist is invalid" by ensuring Formidable Forms receives dates in the expected format.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added change event listener that automatically replaces forward slashes with dots in date fields after user makes a selection. This ensures consistent DD.MM.YYYY format throughout the form interaction.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added JavaScript to convert YYYY-MM-DD dates to DD.MM.YYYY format when prepopulating date fields. This is a partial fix for the date field issues - full fix requires Formidable Forms configuration.
Also updated ISSUES.md with detailed documentation of all three date field problems: initial format, picker display, and post-selection format.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
All three job notification emails (new submission, edit, deactivation) now include:
- Bewerbungsfrist (deadline) - formatted as DD.MM.YYYY
- Kontakt-E-Mail (contact email)
This provides administrators with complete information about each job posting.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Improved JavaScript to use case-insensitive matching for select fields, so 'vollzeit' matches 'Vollzeit'. Also normalized all job_type values to lowercase when saving to ensure consistency.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Date field shows as '20260130' instead of German format '30.01.2026'. Documented as low priority cosmetic issue to be fixed later.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added edit_published_job_offers capability to ddhh_provider role and created upgrade_roles function to automatically add this capability to existing provider accounts. Providers can now edit their published job offers from the dashboard.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Created DDHH_JM_Template class to display full job details on single job offer pages. Shows logo, organization, location, type, deadline, description, and contact information in a styled layout.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Moved job submission notifications from transition_post_status hook to custom ddhh_job_submitted/ddhh_job_edited hooks. This ensures metadata is saved before the email is sent, so location and type fields are populated correctly instead of showing "Nicht angegeben".
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Adds comprehensive job submission, editing, and deactivation functionality with proper form handling and permissions. Includes administrator capabilities for job_offer management and fixed dashboard navigation.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Job submission form had 0 actions, posts weren't being created
- Manually created wppost action with proper field mappings
- Maps all 7 fields (title, description, location, type, deadline, email, logo)
- Discovered during provider flow testing (jobs not appearing in dashboard)
- Logo field misplaced on job form instead of provider profile
- Empty dropdown issue (fixed)
- Identified required changes for proper company logo implementation
- Added ddhhRedirectTriggered flag to ensure only one redirect
- Clear interval immediately when success message detected
- Removed MutationObserver which was causing duplicate events
- Simplified JavaScript to single interval-based check
- Changed from event listener to MutationObserver
- Watches for success message text to appear in form
- Monitors form DOM for changes and redirects when success appears
- More reliable than waiting for custom events
- Added set_registration_redirect() filter on frm_json_response
- Modifies Formidable's JSON response to include redirect_url
- Formidable JavaScript will then redirect to /anbieter-dashboard/
- Fixes registration redirect issue
- Registration form now redirects to /anbieter-dashboard/ after successful submission
- Configured via form options redirect_url setting
- Fixes missing redirect after registration
- Changed !== to != to allow type coercion
- Fixes registration not working due to string vs int comparison
- Added type debugging to help diagnose similar issues
- Changed FrmFormAction::create() to FrmFormActionsController::create_action()
- Updated class_exists checks to use FrmFormActionsController
- Fixes fatal error on plugin activation with modern Formidable Forms
- Discovered during provider flow testing (Plan 07-01)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Phase 6 Plan 3 complete. Async batch email notifications to opted-in
mentors on job publish without blocking admin workflow. Integrated with
Action Scheduler for background processing in batches of 50 users.
German email templates with job details, rate limit delays, error
logging, and unsubscribe hints.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add process_mentor_notification_batch() method to process Action
Scheduler callbacks. Sends German email notifications with job details
(title, location, type, permalink) to batches of opted-in mentors.
Includes rate limit delay (0.1s between emails), error logging for
failures, and unsubscribe hint in email body. Registered callback for
'ddhh_jm_send_mentor_notification_batch' hook.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add notify_mentors_on_job_publish() method to trigger async batch
notifications when jobs transition to publish status. Only triggers on
initial publish (not updates). Queries opted-in mentors via User
Preferences class and schedules batches via Scheduler class. Logs
notification scheduling with mentor count and batch count.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Tasks completed: 2/2
- User preferences class with notification opt-in meta
- Helper method to query opted-in mentors
SUMMARY: .planning/phases/06-email-notifications/06-01-SUMMARY.md
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Created DDHH_JM_Scheduler class with static setup_hooks() method
- Added schedule_mentor_notification_batch() method with 50-user batching
- Uses as_enqueue_async_action() with unique flag and email-notifications group
- Initialized in main plugin file and job manager class
- Ready for Phase 06-03 to register async action callbacks
- Downloaded Action Scheduler 3.9.3 from GitHub
- Placed in vendor/action-scheduler/ directory
- Included in main plugin file before other code for proper initialization
- Library will auto-initialize itself when required