- Add created_via column to notes table (values: 'web' or 'api')
- Mark notes created via POST /api/notes/full as 'api'
- Display light red background for API-created notes in dashboard
- Add "API" badge with lightning icon for visual identification
- 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