feat(Notes): add folder management to notes, allowing notes to be categorized into folders, and update related components for folder selection and display

This commit is contained in:
Julien Froidefond
2026-01-06 09:05:27 +01:00
parent 7ce8057c6b
commit 6c4c6992a9
15 changed files with 1314 additions and 21 deletions

View File

@@ -0,0 +1,84 @@
import { HttpClient } from '@/clients/base/http-client';
import { Folder } from '@/services/folders';
export interface CreateFolderData {
name: string;
tagId?: string;
parentId?: string;
order?: number;
}
export interface UpdateFolderData {
name?: string;
tagId?: string;
parentId?: string;
order?: number;
}
export interface FoldersResponse {
folders: Folder[];
}
export interface FolderResponse {
folder: Folder;
}
/**
* Client HTTP pour les dossiers
*/
export class FoldersClient extends HttpClient {
constructor() {
super('/api/folders');
}
/**
* Récupère tous les dossiers de l'utilisateur
*/
async getFolders(): Promise<Folder[]> {
const response = await this.get<FoldersResponse>('');
return response.folders;
}
/**
* Récupère un dossier par son ID
*/
async getFolderById(id: string): Promise<Folder> {
const response = await this.get<FolderResponse>(`/${id}`);
return response.folder;
}
/**
* Crée un nouveau dossier
*/
async createFolder(data: CreateFolderData): Promise<Folder> {
const response = await this.post<FolderResponse>('', data);
return response.folder;
}
/**
* Met à jour un dossier existant
*/
async updateFolder(id: string, data: UpdateFolderData): Promise<Folder> {
const response = await this.put<FolderResponse>(`/${id}`, data);
return response.folder;
}
/**
* Supprime un dossier
*/
async deleteFolder(id: string): Promise<void> {
await this.delete(`/${id}`);
}
/**
* Réorganise l'ordre des dossiers
*/
async reorderFolders(
folderOrders: Array<{ id: string; order: number }>
): Promise<void> {
await this.post('/reorder', { folderOrders });
}
}
// Instance singleton
export const foldersClient = new FoldersClient();

View File

@@ -5,6 +5,7 @@ export interface CreateNoteData {
title: string;
content: string;
taskId?: string; // Tâche associée à la note
folderId?: string; // Dossier contenant la note
tags?: string[];
}
@@ -12,6 +13,7 @@ export interface UpdateNoteData {
title?: string;
content?: string;
taskId?: string; // Tâche associée à la note
folderId?: string | null; // Dossier contenant la note (null pour retirer du dossier)
tags?: string[];
}
@@ -66,7 +68,14 @@ export class NotesClient extends HttpClient {
* Met à jour une note existante
*/
async updateNote(id: string, data: UpdateNoteData): Promise<Note> {
console.log(
'[notesClient.updateNote] Updating note:',
id,
'with data:',
data
);
const response = await this.put<NoteResponse>(`/${id}`, data);
console.log('[notesClient.updateNote] Response:', response);
return response.note;
}