diff --git a/frontend/i18n/locales/fr.json b/frontend/i18n/locales/fr.json index 57372ca..4561ef7 100644 --- a/frontend/i18n/locales/fr.json +++ b/frontend/i18n/locales/fr.json @@ -60,6 +60,17 @@ "archived": "Groupe archivé avec succès.", "unarchived": "Groupe désarchivé avec succès." }, + "taskDocuments": { + "title": "Documents", + "dropzone": "Glisser des fichiers ici ou cliquer pour sélectionner", + "uploaded": "Document ajouté avec succès.", + "deleted": "Document supprimé avec succès.", + "uploadError": "Erreur lors de l'upload du document.", + "confirmDeleteTitle": "Supprimer le document", + "confirmDeleteMessage": "Êtes-vous sûr de vouloir supprimer ce document ?", + "download": "Télécharger", + "maxSizeError": "Le fichier dépasse la taille maximale de 50 Mo." + }, "tasks": { "created": "Ticket créé avec succès.", "updated": "Ticket mis à jour avec succès.", diff --git a/frontend/services/dto/task-document.ts b/frontend/services/dto/task-document.ts new file mode 100644 index 0000000..98cd045 --- /dev/null +++ b/frontend/services/dto/task-document.ts @@ -0,0 +1,13 @@ +import type { UserData } from './user-data' + +export type TaskDocument = { + '@id'?: string + id: number + task: string + originalName: string + fileName: string + mimeType: string + size: number + createdAt: string + uploadedBy: UserData | null +} diff --git a/frontend/services/dto/task.ts b/frontend/services/dto/task.ts index a37ebe1..1040d58 100644 --- a/frontend/services/dto/task.ts +++ b/frontend/services/dto/task.ts @@ -5,6 +5,7 @@ import type { TaskTag } from './task-tag' import type { TaskGroup } from './task-group' import type { UserData } from './user-data' import type { Project } from './project' +import type { TaskDocument } from './task-document' export type Task = { id: number @@ -19,6 +20,7 @@ export type Task = { group: TaskGroup | null project: Project | null tags: TaskTag[] + documents: TaskDocument[] archived: boolean } diff --git a/frontend/services/task-documents.ts b/frontend/services/task-documents.ts new file mode 100644 index 0000000..87dd5ae --- /dev/null +++ b/frontend/services/task-documents.ts @@ -0,0 +1,42 @@ +import type { TaskDocument } from './dto/task-document' +import type { HydraCollection } from '~/utils/api' +import { extractHydraMembers } from '~/utils/api' +import { $fetch } from 'ofetch' + +export function useTaskDocumentService() { + const api = useApi() + const config = useRuntimeConfig() + const baseURL = config.public.apiBase || '/api' + + async function getByTask(taskId: number): Promise { + const data = await api.get>('/task_documents', { + task: `/api/tasks/${taskId}`, + }) + return extractHydraMembers(data) + } + + async function upload(taskId: number, file: File): Promise { + const formData = new FormData() + formData.append('file', file) + formData.append('task', `/api/tasks/${taskId}`) + + return await $fetch(`${baseURL}/task_documents`, { + method: 'POST', + body: formData, + credentials: 'include', + // Do NOT set Content-Type — browser sets multipart boundary automatically + }) + } + + async function remove(id: number): Promise { + await api.delete(`/task_documents/${id}`, {}, { + toastSuccessKey: 'taskDocuments.deleted', + }) + } + + function getDownloadUrl(id: number): string { + return `${baseURL}/task_documents/${id}/download` + } + + return { getByTask, upload, remove, getDownloadUrl } +}