- Add api_key column to users table with auto-migration
- Modify auth middleware to accept both JWT (24h) and API keys (permanent)
- Add endpoints: GET/POST/DELETE /api/users/:id/api-key
- Update admin panel with API key management (generate, copy, regenerate, revoke)
- Update API documentation modal to show permanent API key usage
API keys use the format: nf_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Use header: X-API-Key: <your-key>
Add an "API" button for each user in the admin panel that displays:
- Authentication instructions with curl examples
- Documentation for new endpoints (notes/full, todos/batch)
- Complete usage examples with proper headers
- Important notes about token expiration and data isolation
Add three new API endpoints for comprehensive note management:
- POST /api/notes/full: Create note with title, content, todos, and tags in one request
- PUT /api/notes/:id/full: Update note with optional todos/tags replacement
- POST /api/notes/:id/todos/batch: Add multiple todos at once with subtask support
Also adds corresponding frontend service methods in NotesService.ts
Correction du problème où le timer Pomodoro se mettait en pause lors du
changement d'onglet. Le timer utilise maintenant des timestamps réels au
lieu de setInterval pour calculer le temps restant, ce qui permet de
continuer à fonctionner même quand l'onglet n'est pas actif.
Changements:
- Ajout d'un état endTime pour stocker le timestamp de fin
- Modification de la logique du timer pour calculer le temps restant basé sur endTime
- Le timer vérifie maintenant toutes les 100ms pour plus de précision
- Persistance de endTime dans localStorage pour la synchronisation
Correction du problème où le timer Pomodoro se mettait en pause lors du
changement d'onglet. Le timer utilise maintenant des timestamps réels au
lieu de setInterval pour calculer le temps restant, ce qui permet de
continuer à fonctionner même quand l'onglet n'est pas actif.
Changements:
- Ajout d'un état endTime pour stocker le timestamp de fin
- Modification de la logique du timer pour calculer le temps restant basé sur endTime
- Le timer vérifie maintenant toutes les 100ms pour plus de précision
- Persistance de endTime dans localStorage pour la synchronisation
Le champ de titre utilisait des classes qui tentaient de supprimer
les bordures (border-none, shadow-none), créant un rendu visuel
incohérent avec les autres inputs. Simplifié pour utiliser le style
standard de l'Input avec juste text-2xl et font-semibold.
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