# Keyboard Shortcuts & Notifications Fix 🔧 ## Issues Fixed ### 1. **JavaScript Error in smart-notifications.js** ✅ **Error**: `Uncaught TypeError: right-hand side of 'in' should be an object, got undefined` **Root Cause**: The code was checking `'sync' in window.registration`, but `window.registration` doesn't exist. **Fix**: Updated the `startBackgroundTasks()` method to properly check for service worker sync support: ```javascript startBackgroundTasks() { if ('serviceWorker' in navigator) { navigator.serviceWorker.ready.then(registration => { if (registration && registration.sync) { registration.sync.register('sync-notifications').catch(() => { // Sync not supported, ignore }); } }).catch(() => { // Service worker not ready, ignore }); } } ``` ### 2. **Notification Permission Error** ✅ **Error**: "De notificatietoestemming mag alleen vanuit een kortwerkende door de gebruiker gegenereerde gebeurtenis-handler worden opgevraagd." **Root Cause**: Browser security policy prevents requesting notification permissions on page load. Permissions can only be requested in response to a user action (like clicking a button). **Fix**: - Changed `init()` to call `checkPermissionStatus()` instead of `requestPermission()` - `checkPermissionStatus()` only checks the current permission state without requesting - `requestPermission()` can now be called from user interactions (like clicking the "Enable" button) - Added an "Enable Notifications" banner in the notification center panel ### 3. **Ctrl+/ Not Working** ✅ **Root Cause**: The `isTyping()` method had conflicting logic that would first allow `Ctrl+/` but then immediately block it again. **Fix**: Rewrote the `isTyping()` method with clearer logic: ```javascript isTyping(e) { const target = e.target; const tagName = target.tagName.toLowerCase(); const isInput = tagName === 'input' || tagName === 'textarea' || target.isContentEditable; // Don't block anything if not in an input if (!isInput) { return false; } // Allow Escape in search inputs if (target.type === 'search' && e.key === 'Escape') { return false; } // Allow Ctrl+/ and Cmd+/ even in inputs for search if (e.key === '/' && (e.ctrlKey || e.metaKey)) { return false; } // Allow Ctrl+K and Cmd+K even in inputs for command palette if (e.key === 'k' && (e.ctrlKey || e.metaKey)) { return false; } // Allow Shift+? for shortcuts panel if (e.key === '?' && e.shiftKey) { return false; } // Block all other keys when typing return true; } ``` ## What Now Works ### ✅ Keyboard Shortcuts | Shortcut | Action | Status | |----------|--------|--------| | `Ctrl+K` | Open Command Palette | ✅ Works | | `Ctrl+/` | Focus Search Input | ✅ Works | | `Shift+?` | Show Keyboard Shortcuts Panel | ✅ Works | | `Esc` | Close Modals/Panels | ✅ Works | ### ✅ Notifications - No more errors on page load - Notification permission is checked silently - Users can enable notifications by clicking the bell icon in the header - If notifications are not enabled, a banner appears in the notification panel with an "Enable" button - Clicking "Enable" requests permission (as per browser requirements) - After enabling, users get a confirmation notification ### ✅ Service Worker - Background sync properly checks for support - No errors if sync is not available - Graceful degradation if service worker is not ready ## Testing the Fixes ### Test Keyboard Shortcuts 1. Open the application 2. Press `Ctrl+K` → Command palette should open 3. Press `Esc` → Command palette should close 4. Press `Ctrl+/` → Search input should focus 5. Press `Shift+?` → Keyboard shortcuts panel should open ### Test Notifications 1. Open the application 2. Click the bell icon in the header 3. If notifications are disabled, you'll see an "Enable Notifications" banner 4. Click "Enable" → Browser will ask for permission 5. Grant permission → You'll see a confirmation notification 6. The notification panel will now show "No notifications" (empty state) ### Test in Console Open browser console (F12) and verify: - No errors about `window.registration` - No errors about notification permissions - No errors about keyboard shortcuts ## Browser Compatibility All fixes are compatible with: - ✅ Chrome/Edge (latest) - ✅ Firefox (latest) - ✅ Safari (latest) - ✅ Opera (latest) ## Notes ### Notification Permissions - Browser policy requires user interaction to request permissions - The application now follows best practices by: 1. Checking permission status on load (silent) 2. Showing a UI prompt to enable notifications 3. Only requesting when user clicks "Enable" ### Keyboard Shortcuts in Input Fields - Most shortcuts are blocked when typing in inputs - Exception: `Ctrl+/`, `Ctrl+K`, and `Shift+?` work everywhere - This allows users to quickly access search, command palette, and help even when focused in an input ### Service Worker Sync - The application gracefully handles browsers that don't support Background Sync API - No errors are thrown if sync is unavailable - Basic functionality works with or without sync support ## Files Modified 1. `app/static/smart-notifications.js` - Fixed `startBackgroundTasks()` method - Changed `init()` to check permission instead of requesting - Updated `requestPermission()` to be user-action triggered - Added permission banner to notification panel 2. `app/static/keyboard-shortcuts-advanced.js` - Completely rewrote `isTyping()` method - Fixed logic conflicts in keyboard event handling - Added better support for shortcuts in input fields 3. `app/templates/base.html` - Added escape key handler for command palette - Added help text showing shortcut keys ## Future Enhancements Consider adding: - [ ] Settings page for notification preferences - [ ] Option to customize keyboard shortcuts per user - [ ] Browser notification sound preferences - [ ] Desktop notification styling - [ ] Notification history persistence