UX: Correction angles carte + Input inline todos + Système de fichiers complet

## Corrections UX:
- Fix coins arrondis en bas des notes étendues (overflow: hidden)
- Remplacement prompt() par input inline pour ajout de tâches
- Bouton "Ajouter" avec validation au clic ou touche Entrée
- Expérience utilisateur fluide sans popups intrusifs

## Système de fichiers complet:

### Backend:
- Création table note_files (id, note_id, filename, original_name, file_size, mime_type, created_at)
- POST /api/notes/:id/files - Upload fichier (multer, 10MB max)
- GET /api/notes/:id/files - Liste fichiers d'une note
- GET /api/notes/files/:fileId/download - Téléchargement sécurisé
- DELETE /api/notes/files/:fileId - Suppression fichier
- Stockage dans public/uploads/files/
- Auto-création dossier si nécessaire

### Frontend:
- Bouton "Ajouter un fichier" dans footer des notes
- Input hidden fileInput pour sélection
- Affichage liste fichiers avec icône, nom, taille
- Boutons télécharger/supprimer par fichier
- Fonction formatFileSize() pour affichage lisible
- Event delegation pour tous les boutons fichiers
- Confirmation avant suppression

### Intégration:
- GET /api/notes charge maintenant files[] et files_count
- renderInlineFiles() génère HTML des fichiers
- downloadFile() ouvre download dans nouvel onglet
- deleteFile() avec confirmation dialog
- Reload automatique après upload/delete
- Conservation état étendu après opérations

### CSS moderne:
- .note-file-item avec hover effect
- .note-file-icon, .note-file-info, .note-file-actions
- Buttons download/delete avec transitions
- Design cohérent avec reste de l'app
- Truncate nom fichier avec ellipsis

Tous types de fichiers acceptés (PDF, DOC, ZIP, etc.)
This commit is contained in:
Claude committed 2025-11-11 15:40:15 +00:00
1 parent 17a088ec05
commit 820b0cfeda
5 files changed
+526 -16

No files matched your search

+152 -8
View File
@@ -28,6 +28,7 @@
cursor: default;
box-shadow: var(--shadow-lg);
border-color: var(--color-accent);
overflow: hidden;
}
.note-card.expanded:hover {
@@ -312,26 +313,54 @@
font-style: italic;
}
.btn-add-todo-inline {
.add-todo-inline-container {
display: flex;
align-items: center;
gap: var(--spacing-sm);
align-items: center;
}
.add-todo-inline-input {
flex: 1;
padding: var(--spacing-sm) var(--spacing-md);
border: 1px dashed var(--color-border);
border: 1px solid var(--color-border);
border-radius: var(--radius-sm);
background: transparent;
background: var(--color-background);
color: var(--color-text-primary);
font-size: var(--font-size-sm);
transition: all var(--transition-fast);
}
.add-todo-inline-input:focus {
outline: none;
border-color: var(--color-accent);
background: var(--color-card);
}
.add-todo-inline-input::placeholder {
color: var(--color-text-secondary);
}
.btn-add-todo-inline {
padding: var(--spacing-sm) var(--spacing-md);
border: 1px solid var(--color-accent);
border-radius: var(--radius-sm);
background: var(--color-accent);
color: white;
font-size: var(--font-size-sm);
font-weight: var(--font-weight-medium);
cursor: pointer;
transition: all var(--transition-fast);
width: 100%;
white-space: nowrap;
}
.btn-add-todo-inline:hover {
background: var(--color-hover);
border-color: var(--color-accent);
color: var(--color-text-primary);
background: var(--color-accent-hover);
box-shadow: var(--shadow-sm);
}
.btn-add-todo-inline:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.note-footer-inline {
@@ -375,6 +404,121 @@
height: 100%;
}
.btn-add-file-inline {
width: 36px;
height: 36px;
padding: 8px;
border: 1px solid var(--color-border);
border-radius: var(--radius-sm);
background: transparent;
color: var(--color-text-secondary);
cursor: pointer;
transition: all var(--transition-fast);
display: flex;
align-items: center;
justify-content: center;
}
.btn-add-file-inline:hover {
background: var(--color-hover);
color: var(--color-text-primary);
border-color: var(--color-accent);
}
.btn-add-file-inline svg {
width: 100%;
height: 100%;
}
.note-files-container-inline {
padding: 0 var(--spacing-lg) var(--spacing-md);
}
.note-files-list {
display: flex;
flex-direction: column;
gap: var(--spacing-xs);
}
.note-file-item {
display: flex;
align-items: center;
gap: var(--spacing-sm);
padding: var(--spacing-sm) var(--spacing-md);
background: var(--color-background);
border-radius: var(--radius-sm);
border: 1px solid var(--color-border);
transition: all var(--transition-fast);
}
.note-file-item:hover {
background: var(--color-hover);
border-color: var(--color-accent);
}
.note-file-icon {
width: 20px;
height: 20px;
flex-shrink: 0;
color: var(--color-text-secondary);
}
.note-file-info {
flex: 1;
min-width: 0;
}
.note-file-name {
font-size: var(--font-size-sm);
color: var(--color-text-primary);
font-weight: var(--font-weight-medium);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.note-file-size {
font-size: var(--font-size-xs);
color: var(--color-text-secondary);
}
.note-file-actions {
display: flex;
gap: var(--spacing-xs);
}
.btn-download-file,
.btn-delete-file {
width: 28px;
height: 28px;
padding: 6px;
border: none;
border-radius: var(--radius-sm);
background: transparent;
color: var(--color-text-secondary);
cursor: pointer;
transition: all var(--transition-fast);
display: flex;
align-items: center;
justify-content: center;
}
.btn-download-file:hover {
background: var(--color-accent);
color: white;
}
.btn-delete-file:hover {
background: var(--color-danger);
color: white;
}
.btn-download-file svg,
.btn-delete-file svg {
width: 100%;
height: 100%;
}
/* ============================================
TODO BOX
============================================ */