Le hook useKeyboardShortcuts interceptait tous les événements clavier,
y compris dans les champs de saisie, empêchant la saisie d'espaces.
La correction ignore les raccourcis sans modificateur quand l'utilisateur
tape dans un input, textarea ou contentEditable, tout en permettant
les raccourcis avec Ctrl/Alt/Meta de fonctionner normalement.
- Ajouter un événement custom 'pomodoroStateChange' lors des modifications
- Chaque instance écoute cet événement et se synchronise avec localStorage
- Quand on met le timer sur pause dans le modal, l'instance cachée se met aussi en pause
- Les deux instances restent parfaitement synchronisées
- Changer z-50 en z-40 pour le bouton de capture rapide
- Les modals (Dialog) avec z-50 passent maintenant devant
- Le bouton QuickCapture n'est plus visible quand un modal est ouvert
- Retirer le raccourci '?' pour ouvrir l'aide
- Ajouter une icône HelpCircle dans le header à côté du ModeToggle
- L'aide est maintenant accessible via l'icône au lieu du raccourci clavier
- Rendre le PomodoroTimer dans une div cachée toujours montée
- Cette instance continue de faire tourner le timer en arrière-plan
- Le modal affiche une seconde instance pour les contrôles
- Les deux instances partagent l'état via localStorage
- Le timer continue maintenant de décompter même modal fermé
- Ajouter z-50 à la Card du chat pour qu'elle passe devant le bouton QuickCapture
- Ajouter un bouton 'Agrandir' avec l'icône LayoutGrid
- Créer un modal agrandi (max-w-4xl, h-80vh) pour l'assistant IA
- Améliorer l'affichage des messages avec whitespace-pre-wrap
- Ajouter des tooltips sur les boutons du chat
- Utiliser useCallback pour mémoriser handleTimerComplete
- Retirer timeLeft des dépendances du useEffect qui gère l'intervalle
- Le useEffect ne dépend plus que de isRunning et handleTimerComplete
- L'intervalle continue de tourner même après démontage/remontage du composant
- Nettoyage propre de l'intervalle avec intervalRef.current = null
- Retirer size="lg" du bouton QuickCapture
- Aligner les deux boutons sur right-4 (au lieu de right-6 pour QuickCapture)
- Ajouter les mêmes effets hover et transition aux deux boutons
- Les boutons ont maintenant exactement la même taille (h-14 w-14)
- Les icônes ont la même taille (h-6 w-6)
- Déplacer le bouton de capture rapide plus haut (bottom-24 au lieu de bottom-6)
- Le bouton QuickCapture est maintenant au-dessus du bouton de chat IA
- Plus de superposition des boutons
- Sauvegarder l'état du timer (mode, temps restant, état running, sessions) dans localStorage
- Restaurer l'état au montage du composant
- Le timer ne se réinitialise plus quand le modal se ferme et se rouvre
- Simplifier le PomodoroModal pour utiliser children directement
- Créer un composant PomodoroModal pour afficher le timer
- Ajouter une icône Clock dans le header qui affiche le temps restant quand le timer est actif
- Modifier PomodoroTimer pour accepter une callback onStateChange
- Retirer la box Pomodoro de la page principale
- L'icône change de style quand le timer est en cours et affiche le décompte
- Remplacer l'audio base64 par Web Audio API dans PomodoroTimer pour éviter les erreurs CSP
- Ajouter une fonction cleanHtmlContent pour correctement décoder les entités HTML
- Corriger l'affichage des notes pour supprimer les caractères parasites (&nb-, etc.)
- Créer un nouveau composant StatsModal pour afficher les statistiques
- Ajouter une icône BarChart3 dans le header à côté du bouton de thème
- Retirer le StatsDashboard de sa position sous le calendrier
- Afficher les statistiques dans un modal au clic sur l'icône
ROOT CAUSE: During phases 1-5, subtask support was added which requires
parent_id and level columns in note_todos and global_todos tables.
However, the auto-migrate script did not include this migration,
causing 500 errors when the API tried to SELECT these non-existent columns.
Changes:
- scripts/auto-migrate.js: Added Migration 4 to create parent_id and
level columns if they don't exist
- config/database.js: Updated CREATE TABLE statements to include
parent_id and level columns in the initial schema
This fixes the 500 error on GET /api/notes that occurred because the
code was trying to SELECT columns that didn't exist in production.
The migration will run automatically on next Docker startup and add
the missing columns without data loss.
Fixes: "je n ai plus aucune note qui s affichent" - notes not displaying
Automatically fixes INTEGER->BOOLEAN type mismatches when Docker starts.
This resolves the 500 error on /api/notes without manual intervention.
Changes:
- scripts/fix-postgres-boolean-types.sql: Idempotent SQL script that
detects INTEGER columns that should be BOOLEAN and converts them
(0→FALSE, 1→TRUE) for all affected tables
- docker-entrypoint.sh: Executes the boolean correction script
automatically after migrations and before starting the server
The script corrects these columns:
• users.is_admin
• notes.archived
• note_todos.completed, note_todos.priority
• global_todos.completed, global_todos.priority
• rss_feeds.enabled
• calendar_events.all_day
The correction is idempotent and runs on every container restart,
ensuring data integrity even after database migrations.
Fixes: Notes not displaying due to boolean type mismatch
Added tools to resolve the 500 error when notes don't display due to
boolean type mismatches between SQLite (0/1) and PostgreSQL (TRUE/FALSE).
New files:
- scripts/fix-boolean-data.js: Converts INTEGER columns to BOOLEAN type
and migrates existing 0/1 data to FALSE/TRUE
- scripts/README-FIXES.md: Instructions for running the fix script
Improved:
- scripts/migrate-sqlite-to-postgres.js: Now automatically converts 0/1
to FALSE/TRUE for known boolean columns during migration
This resolves issues where:
- Migrated data contains INTEGER values (0/1) instead of BOOLEAN
- SQL queries using "completed = TRUE" fail to match rows
- API endpoints return 500 errors
To fix an existing database, run: node scripts/fix-boolean-data.js
Corrected previous commit - some fields in the schema are INTEGER, not BOOLEAN:
- notes.priority is INTEGER (not BOOLEAN) - needs 0/1
- global_todos.in_progress is INTEGER (not BOOLEAN) - needs 0/1
All other fields (archived, completed, etc.) correctly use BOOLEAN and were
properly fixed in the previous commit.
This resolves the 500 error when trying to set INTEGER fields with boolean values.
Fixed issue where notes and todos were not displaying due to boolean
type mismatch between SQLite (uses 0/1) and PostgreSQL (uses TRUE/FALSE).
Changes:
- routes/notes.routes.js: Fixed archived, completed, and priority fields
- routes/todos.routes.js: Fixed completed, priority, and in_progress fields
- routes/calendar.routes.js: Fixed all_day field
- routes/rss.routes.js: Fixed enabled field
- routes/rss.routes-v2.js: Fixed enabled field
- routes/users.routes.js: Fixed is_admin field
All boolean parameters now use native boolean values instead of converting
to 0/1, ensuring compatibility with PostgreSQL BOOLEAN columns.
This resolves the issue where notes were not displaying even though they
existed in the database.
Removed all temporary debug code added during investigation:
- Removed debug console.log statements from loadNotes function
- Removed debug console.log statements from filter logic
- Removed red debug panel showing filter state in UI
The application code is now clean and production-ready.
Successfully configured and connected PostgreSQL database for NoteFlow.
Backend changes:
- Added dotenv package and configured .env loading in server.js
- Increased PostgreSQL connection timeout from 2s to 10s
- Added connection URL logging for debugging
- Configured to use PostgreSQL on port 5432 (instead of 5499)
PostgreSQL setup:
- Installed PostgreSQL 16 locally
- Created 'noteflow' database and user
- Fixed SSL certificate permissions
- Configured TCP listening on localhost
- Set up password authentication (md5)
Database configuration:
- Uses .env file for DATABASE_URL and credentials
- Connection: postgresql://noteflow:***@localhost:5432/noteflow
- All tables created and initialized successfully
- Admin user created (username: admin, password: admin)
This resolves the "no notes displaying" issue. The application now
connects to a working PostgreSQL database and can store/retrieve notes.
Files changed:
- server.js: Added dotenv.config() at top
- config/database.js: Increased timeout, added logging
- package.json: Added dotenv dependency
- config/database-postgres.js: Backup of PostgreSQL config
Switched back from SQLite to PostgreSQL configuration to reconnect
to the existing PostgreSQL database with user data.
Changes:
- Renamed database.js to database-sqlite.js (SQLite backup config)
- Renamed database-postgres.js to database.js (PostgreSQL primary)
- Created .env file with PostgreSQL connection settings (not committed)
The backend now expects PostgreSQL on localhost:5499. To start the
database, run: docker-compose up -d postgres
Note: This resolves the empty notes issue - once PostgreSQL is started,
all user notes will be loaded from the PostgreSQL database.
Added console.log statements to track:
- When notes API fetch is initiated
- Number of notes fetched
- The actual notes data returned
This helps identify if the issue is with the API request, the response,
or the data handling in the frontend.
Added proxy configuration to route API requests from frontend (port 5173)
to backend (port 2222). This resolves the issue where the frontend
couldn't fetch notes because it was trying to access the API on the
wrong port.
Changes:
- Changed Vite dev server port from 2222 to 5173
- Added proxy rules for /api and /uploads endpoints
- Both proxies target http://localhost:2222 (backend)
This completes the fix for notes not displaying. The frontend can now
properly communicate with the backend through the proxy.
PostgreSQL was not available in the development environment, causing
the backend server to fail on startup with connection timeout errors.
Changes:
- Renamed database.js to database-postgres.js (PostgreSQL config)
- Renamed database-sqlite-backup.js to database.js (SQLite config)
- This allows the backend to start and serve data to the frontend
This fixes the issue where no notes were displaying (Total: 0)
because the backend server couldn't connect to the database.
Note: This is a temporary workaround for the development environment.
Production should continue using PostgreSQL via Docker.
Added console.log statements and temporary debug UI panel to help
diagnose why notes are not displaying. This includes:
- Logging total notes count and active filters
- Logging which specific filter is excluding each note
- Visual debug panel showing filter state in the UI
This is temporary debugging code to resolve the issue reported
by the user where no notes are displaying.
- Create exportImport utility with JSON and CSV export
- Support full backup with version tracking
- Add BackupData interface with notes, todos, settings
- Implement file parsing and validation
- Create ExportImportModal component with tabs
- Show current data statistics before export
- Preview backup content before import
- Download as timestamped JSON or CSV files
- Calculate and display backup statistics
- Support reading and validating imported backups
- Add view mode toggle (List/Kanban) in mobile notes page
- Integrate KanbanBoard component with drag & drop support
- Support moving notes between columns via tags
- Auto-refresh notes list after moving to new column
- Maintain search and filter functionality in Kanban view
- Add mobile-optimized horizontal scrolling for Kanban columns
- Update Todo interface to include due_date, parent_id, level fields
- Add due_date parameter to NotesService.addTodo method
- Add due_date parameter to TodosService.createTodo method
- updateTodo already supports Partial<Todo> including due_date
- Backend migrations already created (003 and 004)
- Prepare foundation for due date UI in future updates
Keyboard Shortcuts:
- Create useKeyboardShortcuts hook with configurable shortcuts
- Support Ctrl/Cmd, Alt, Shift modifiers
- Add 7 global shortcuts (New note, Search, Quick capture, etc.)
- Create KeyboardShortcutsHelp modal with categorized shortcuts
- Show formatted shortcut keys (⌘ on Mac, Ctrl on Windows)
- Press ? to open shortcuts help
Statistics Dashboard:
- Create StatsDashboard component with productivity metrics
- Calculate productivity score (0-100) based on completion rate
- Show notes statistics (total, active, archived, priority)
- Display todos statistics with completion rate
- Track content stats (notes with todos/images/files, unique tags)
- Show recent activity (notes updated in last 7 days)
- Visual progress bar for productivity score
- Integrate dashboard in left column below calendar
- Create QuickCaptureWidget with floating action button
- Support quick note capture with optional title
- Auto-generate timestamped title if none provided
- Add keyboard shortcuts: Ctrl+Enter to save, Escape to cancel
- Integrate into desktop interface with reload on capture
- Display visual feedback with kbd tags for shortcuts
- Position as floating FAB in bottom-right corner
- Refresh notes list automatically after capture
- Create noteLinks utility for wiki-style [[Note Title]] links
- Support automatic link detection and conversion to clickable HTML
- Show broken links (when target note doesn't exist) in gray strikethrough
- Implement backlinks detection (find notes linking to current note)
- Add autocomplete suggestions when typing [[ for quick note selection
- Support cursor position detection for inline link editing
- Prioritize exact matches and recent notes in suggestions
- Convert links to HTML with custom styling and click handlers
- Create smartTags utility with keyword extraction algorithm
- Filter out 100+ French stop words for better keyword quality
- Implement category-based tag suggestions (travail, dev, design, etc.)
- Suggest tags from similar notes based on content similarity
- Display smart suggestions with one-click add in note editor
- Show sparkle icon to indicate AI-assisted suggestions
- Combine multiple suggestion strategies for best results
- Limit to top 8 most relevant suggestions per note