diff --git a/CLAUDE.md b/CLAUDE.md index 2ba18a5..c027f66 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -38,6 +38,10 @@ This project is proudly **"vibe-coded"** using Claude.AI - the entire codebase w **Note for AI Assistants:** Clean this section after the specific features are done or new releases are made. Effective changes are tracked in `CHANGELOG.md`. Do not add completed versions here - document them in the Session History section at the end of this file. +### Known Bugs + +No known bugs at this time. + ## Technical Stack - **Language:** PHP 8.3.x @@ -653,3 +657,89 @@ Admin features always work; frontend requires valid license. - Merged to main (fast-forward) - Tagged: `v0.6.0` - Pushed to origin: dev, main, v0.6.0 + + +### 2026-02-03 - Bug Fixes and Enhancements + +**Completed:** + +- Fixed gap between settings page tabs and tab content + - Changed `.nav-tab-wrapper` margin-bottom from 20px to 0 + - Added explicit border-bottom to create seamless connection with tab content +- Added license bypass for localhost development environments + - Created `LicenseManager::is_localhost()` method + - Detects: localhost, 127.0.0.1, ::1, .local/.test/.localhost/.dev/.ddev.site domains, private IP ranges + - `is_license_valid()` now returns true for localhost environments + - Added "Development Mode" notice on license settings page and dashboard when localhost detected +- Expanded General Settings with business owner fields + - Added Address section: street, city, postal code, country + - Added Contact section: email, phone, website + - Added Social Media section: Facebook, Instagram, X (Twitter), LinkedIn, TripAdvisor + - Updated `save_general_settings()` with proper sanitization for all new fields +- Created subtabs on Pricing settings tab + - Three subtabs: Pricing Tiers, Weekend Days, Seasons + - Each subtab has its own save button and focused content + - Added CSS for subtab navigation styling + - Seasons subtab now shows priority column and direct link to Seasons Manager +- Implemented auto-updates system + - Created `src/License/Updater.php` class + - Integrates with WordPress plugin update system via `pre_set_site_transient_update_plugins` + - Provides plugin info for "View details" modal via `plugins_api` filter + - Uses license client's `checkForUpdates()` method + - Configurable check frequency (1-168 hours) + - Options for notifications enabled and auto-install enabled + - Automatic cache clearing when license settings change or after updates +- Added Updates tab to settings page + - Enable/disable update notifications + - Enable/disable automatic updates + - Configurable update check frequency + - Manual "Check for Updates" button with AJAX + - Display of last check timestamp and current version +- Reordered admin submenu for better organization + - Dashboard at top, Settings at bottom + - Logical grouping: Buildings, Rooms, Bookings, Guests, Services, Calendar, Seasons +- Fixed Booking admin issues + - Fixed auto-draft status causing type errors (check for WP_Post object) + - Fixed guest dropdown to always load existing guests + - Booking title now auto-generates with guest name and dates (room removed per user request) + - Fixed booking history display on Guest edit page +- Implemented guest auto-creation from booking form + - When new guest data is entered in booking, guest record is automatically created + - Links booking to the new guest via guest_id meta +- Added encryption for sensitive guest data + - ID/passport numbers encrypted using AES-256-CBC + - Uses WordPress AUTH_KEY for encryption key derivation + - `encrypt()` and `decrypt()` methods in Guest class + - Backward compatible with legacy unencrypted data + - Security notice displayed in Identification meta box +- Disabled Gutenberg block editor for form-based post types + - Service, Guest, and Booking post types now use classic editor + - Added `disable_block_editor()` filter to each post type class + - Meta boxes now appear properly instead of being hidden at bottom + - Form-based interfaces are more appropriate than block editor for data entry + +**Files Changed:** + +- `assets/css/admin.css` - Fixed tab gap, added subtab styles, booking form styles +- `assets/js/admin.js` - AJAX update check, booking form improvements, guest auto-creation +- `src/License/Manager.php` - Added `is_localhost()` method, updated `is_license_valid()` +- `src/License/Updater.php` - New file for auto-updates with configurable settings +- `src/Plugin.php` - Business owner settings, pricing subtabs, updates tab, menu reordering +- `src/PostTypes/Booking.php` - Auto-draft fixes, title generation, guest creation, disable Gutenberg +- `src/PostTypes/Guest.php` - AES-256-CBC encryption for ID numbers, disable Gutenberg +- `src/PostTypes/Service.php` - Disable Gutenberg for classic editor UI + +**Learnings:** + +- WordPress nav-tab styling expects tabs and content to be flush (no margin/gap) +- Localhost detection should cover common development TLDs (.local, .test, .dev, .ddev.site) +- Private IP ranges can be detected using `FILTER_FLAG_NO_PRIV_RANGE` +- WordPress plugin updates require hooking into `pre_set_site_transient_update_plugins` and `plugins_api` +- Subtabs can be implemented with query parameters and conditional rendering within a single settings callback +- URL fields should use `esc_url_raw()` for sanitization, email fields use `sanitize_email()` +- Always check if post object is valid (`$post instanceof \WP_Post`) before accessing properties - auto-draft causes issues +- AES-256-CBC encryption with random IV provides secure storage for sensitive data +- Store IV concatenated with encrypted data (IV is not secret, just needs to be unique) +- `use_block_editor_for_post_type` filter disables Gutenberg per post type +- Post types with `show_in_rest => true` get Gutenberg by default, which hides traditional meta boxes +- Form-based admin interfaces (data entry) should use classic editor, not block editor