From 73aa685b1d56227d43c7c642c0deea39a1ea0f55 Mon Sep 17 00:00:00 2001 From: lizerk Date: Fri, 7 Aug 2026 15:43:55 +0300 Subject: [PATCH] improve empty task cover selection --- frontend/src/app/tasks/page.tsx | 79 ++++++++++++++++++++++++++++++--- 1 file changed, 73 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/tasks/page.tsx b/frontend/src/app/tasks/page.tsx index 42c0ba6f..eb7b2535 100644 --- a/frontend/src/app/tasks/page.tsx +++ b/frontend/src/app/tasks/page.tsx @@ -3652,6 +3652,7 @@ function TasksPageContent() { const pendingBoardViewStateRef = useRef>(new Map()); const columnNodeRefs = useRef>(new Map()); const taskAttachmentInputRef = useRef(null); + const taskCoverUploadInputRef = useRef(null); const taskFormAttachmentInputRef = useRef(null); const taskChecklistDraftRef = useRef(null); const taskFormChecklistDraftRef = useRef(null); @@ -5855,6 +5856,44 @@ function TasksPageContent() { } }, [activityOpen, board, loadBoard, loadTaskActivity, taskAttachmentsUploading, viewTask]); + const uploadViewedTaskCover = useCallback(async (file: File | null) => { + if (!board || !viewTask || !file || saving || taskAttachmentsUploading) return; + if (!isMediaFile(file)) { + setError("Для обложки можно загрузить только изображение или видео"); + return; + } + + setSaving(true); + setTaskAttachmentsUploading(true); + setError(null); + try { + const [attachment] = await apiClient.uploadTaskAttachments(viewTask.id, [file]); + if (!attachment) throw new Error("Файл не был загружен"); + + setTaskAttachments((current) => [...current, attachment]); + await apiClient.setTaskCover(viewTask.id, { + kind: "attachment", + source_id: attachment.id, + }); + await loadBoard(board.id); + if (activityOpen) await loadTaskActivity(viewTask.id); + setCoverPickerOpen(false); + } catch (coverError) { + setError(getTaskError(coverError, "Не удалось загрузить и установить обложку задачи")); + } finally { + setTaskAttachmentsUploading(false); + setSaving(false); + } + }, [ + activityOpen, + board, + loadBoard, + loadTaskActivity, + saving, + taskAttachmentsUploading, + viewTask, + ]); + const downloadViewedTaskAttachment = useCallback(async (attachment: TaskAttachment) => { if (!viewTask) return; setError(null); @@ -9225,6 +9264,18 @@ function TasksPageContent() { )} > + { + const file = event.currentTarget.files?.[0] || null; + event.currentTarget.value = ""; + void uploadViewedTaskCover(file); + }} + /> {coverPickerLoading ? (
@@ -9338,12 +9389,28 @@ function TasksPageContent() { && taskComments.length === 0 && taskExternalLinks.length === 0 && taskCoverLinkedOptions.length === 0 ? ( -
- -

- Добавьте фото, видео, чек-лист, комментарий, ссылку или связанный объект. -

-
+ ) : null}
) : null}