From 454fec338263ca7a3e605006cabcb54c46622f5b Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Wed, 3 Dec 2025 20:48:00 +0100 Subject: [PATCH] feat: Implement mobile notes page with search, advanced filters, and view modes. --- src/pages/mobile/NotesPage.tsx | 248 +++++++++++++++------------------ 1 file changed, 113 insertions(+), 135 deletions(-) diff --git a/src/pages/mobile/NotesPage.tsx b/src/pages/mobile/NotesPage.tsx index 31c4f59..22b1d7a 100644 --- a/src/pages/mobile/NotesPage.tsx +++ b/src/pages/mobile/NotesPage.tsx @@ -8,8 +8,6 @@ import { MobileCard } from "@/components/mobile/MobileCard"; import { Plus, Search, CheckSquare, Image as ImageIcon, Paperclip, Tag as TagIcon, FileText, LayoutGrid, List } from "lucide-react"; import NotesService, { Note } from "@/services/NotesService"; import { showError, showSuccess } from "@/utils/toast"; -import { TemplateSelector } from "@/components/TemplateSelector"; -import type { NoteTemplate } from "@/utils/noteTemplates"; import { AdvancedSearch, type SearchFilters, type TagOption } from "@/components/AdvancedSearch"; import { KanbanBoard } from "@/components/KanbanBoard"; import TagsService from "@/services/TagsService"; @@ -30,7 +28,6 @@ export default function NotesPage() { }); const [showArchived, setShowArchived] = useState(false); const [page, setPage] = useState(0); - const [templateSelectorOpen, setTemplateSelectorOpen] = useState(false); const [viewMode, setViewMode] = useState<'list' | 'kanban'>('list'); const navigate = useNavigate(); @@ -122,22 +119,11 @@ export default function NotesPage() { const totalPages = Math.ceil(filteredNotes.length / NOTES_PER_PAGE); const paginatedNotes = filteredNotes.slice(page * NOTES_PER_PAGE, (page + 1) * NOTES_PER_PAGE); - const handleCreateNote = () => { - setTemplateSelectorOpen(true); - }; - - const handleCreateNoteFromTemplate = async (template: NoteTemplate) => { + const handleCreateNote = async () => { try { - const title = template.name === "Note vide" ? "Nouvelle note" : template.name; - const newNote = await NotesService.createNote(title, template.content); + const newNote = await NotesService.createNote("Nouvelle note", ""); if (newNote) { - // Add todos if template has any - if (template.todos && template.todos.length > 0) { - for (const todo of template.todos) { - await NotesService.addTodo(newNote.id!, todo.text); - } - } - showSuccess("Note créée depuis le template"); + showSuccess("Note créée"); navigate(`/mobile/notes/${newNote.id}`); } } catch (error) { @@ -238,124 +224,123 @@ export default function NotesPage() { {/* Notes View - List or Kanban */} {viewMode === 'list' ? ( -
- {paginatedNotes.length > 0 ? ( - paginatedNotes.map(note => ( - navigate(`/mobile/notes/${note.id}`)} - > -
- {/* Priority Button */} - +
+ {paginatedNotes.length > 0 ? ( + paginatedNotes.map(note => ( + navigate(`/mobile/notes/${note.id}`)} + > +
+ {/* Priority Button */} + -

- {note.title || "Sans titre"} -

+

+ {note.title || "Sans titre"} +

-

- {note.content ? note.content.replace(/<[^>]*>/g, '') : "Note vide"} -

+

+ {note.content ? note.content.replace(/<[^>]*>/g, '') : "Note vide"} +

- {/* Badges */} -
- {note.todos && note.todos.length > 0 && ( - - - {note.todos.length} - - )} - {note.images && note.images.length > 0 && ( - - - {note.images.length} - - )} - {note.files && note.files.length > 0 && ( - - - {note.files.length} - - )} - {note.tags && note.tags.length > 0 && ( - note.tags.slice(0, 2).map((tag) => ( - - - {tag.name} + {/* Badges */} +
+ {note.todos && note.todos.length > 0 && ( + + + {note.todos.length} - )) - )} - {note.tags && note.tags.length > 2 && ( - - +{note.tags.length - 2} - + )} + {note.images && note.images.length > 0 && ( + + + {note.images.length} + + )} + {note.files && note.files.length > 0 && ( + + + {note.files.length} + + )} + {note.tags && note.tags.length > 0 && ( + note.tags.slice(0, 2).map((tag) => ( + + + {tag.name} + + )) + )} + {note.tags && note.tags.length > 2 && ( + + +{note.tags.length - 2} + + )} +
+ + {/* Date */} + {note.updated_at && ( +

+ {new Date(note.updated_at).toLocaleDateString('fr-FR', { + day: '2-digit', + month: '2-digit', + year: 'numeric' + })} +

)}
+ + )) + ) : ( +
+ +

+ {searchQuery ? "Aucune note trouvée" : "Aucune note"} +

+ {!searchQuery && ( + + )} +
+ )} - {/* Date */} - {note.updated_at && ( -

- {new Date(note.updated_at).toLocaleDateString('fr-FR', { - day: '2-digit', - month: '2-digit', - year: 'numeric' - })} -

- )} -
-
- )) - ) : ( -
- -

- {searchQuery ? "Aucune note trouvée" : "Aucune note"} -

- {!searchQuery && ( - - )} -
- )} - - {/* Pagination */} - {totalPages > 1 && ( -
- - - {page + 1} / {totalPages} - - -
- )} -
+ + {page + 1} / {totalPages} + + +
+ )} +
) : ( /* Kanban View */
@@ -363,7 +348,7 @@ export default function NotesPage() { notes={filteredNotes} onNoteClick={(note) => navigate(`/mobile/notes/${note.id}`)} onCreateNote={(columnId) => { - setTemplateSelectorOpen(true); + handleCreateNote(); }} onMoveNote={async (noteId, newStatus) => { const note = notes.find(n => n.id === noteId); @@ -393,13 +378,6 @@ export default function NotesPage() { {/* FAB */} - - {/* Template Selector */} -
); }