diff --git a/frontend/src/app/tasks/page.tsx b/frontend/src/app/tasks/page.tsx index 55e962b8..59a942d6 100644 --- a/frontend/src/app/tasks/page.tsx +++ b/frontend/src/app/tasks/page.tsx @@ -57,7 +57,6 @@ import { Rows3, Search, ShoppingCart, - Star, Tag, Trash2, UserPlus, @@ -3924,9 +3923,15 @@ function TasksPageContent() { const loadBoard = useCallback(async (boardId?: number | null) => { setError(null); - const data = boardId - ? await apiClient.getTaskBoard(boardId) - : await apiClient.getDefaultTaskBoard(); + if (!boardId) { + setBoard(null); + setSelectedBoardId(null); + boardViewStateRef.current = EMPTY_BOARD_VIEW_STATE; + setBoardViewState(EMPTY_BOARD_VIEW_STATE); + setViewTaskId(null); + return null; + } + const data = await apiClient.getTaskBoard(boardId); setBoard(data); setTaskLabels(data.labels || []); let nextViewState = normalizeBoardViewState(data.view_state); @@ -4300,15 +4305,6 @@ function TasksPageContent() { const boardList = await loadBoards(); if (!currentBoardId) { - const nextBoard = eventBoardId - ? boardList.find((item) => item.id === eventBoardId) - : boardList[0]; - if (nextBoard) { - await loadBoard(nextBoard.id); - } else { - await loadBoard(null); - await loadBoards(); - } return; } @@ -4316,12 +4312,8 @@ function TasksPageContent() { (item) => item.id === currentBoardId, ); if (!currentBoardAvailable) { - if (boardList[0]) { - await loadBoard(boardList[0].id); - } else { - await loadBoard(null); - await loadBoards(); - } + await loadBoard(null); + router.replace("/tasks", { scroll: false }); setSearch(""); setOnlyMine(false); setSelectedColumnTarget("all"); @@ -4334,7 +4326,7 @@ function TasksPageContent() { } catch (syncError) { setError(getTaskError(syncError, "Не удалось синхронизировать доску")); } - }, [loadBoard, loadBoards]); + }, [loadBoard, loadBoards, router]); useTaskBoardRealtime({ viewTaskId, @@ -4372,7 +4364,7 @@ function TasksPageContent() { ] = await Promise.all([ requestedBoardId > 0 ? apiClient.getTaskBoard(requestedBoardId) - : apiClient.getDefaultTaskBoard(), + : Promise.resolve(null), apiClient.getTaskBoards({ view: "summary" }), apiClient.getTaskBoardGroups(), apiClient.getEmployees({ limit: 200, is_active: true, ordering: "last_name" }), @@ -4387,11 +4379,13 @@ function TasksPageContent() { setBoards(boardList as TaskBoardSummary[]); setBoardGroups(groupList as TaskBoardGroup[]); setBoard(boardData); - const initialViewState = normalizeBoardViewState(boardData.view_state); + const initialViewState = boardData + ? normalizeBoardViewState(boardData.view_state) + : EMPTY_BOARD_VIEW_STATE; boardViewStateRef.current = initialViewState; setBoardViewState(initialViewState); - setSelectedBoardId(boardData.id); - if (window.matchMedia("(max-width: 1023px)").matches) { + setSelectedBoardId(boardData?.id ?? null); + if (boardData && window.matchMedia("(max-width: 1023px)").matches) { const firstColumn = (boardData.columns || []).find( (column: TaskColumn) => !column.is_archived && !column.parent, ); @@ -4401,6 +4395,7 @@ function TasksPageContent() { setDepartments(departmentsData.results || departmentsData || []); setTaskLabels(Array.isArray(labelsData) ? labelsData : labelsData.results || []); if ( + boardData && requestedTaskId > 0 && (boardData.tasks || []).some((task: TaskCard) => task.id === requestedTaskId) ) { @@ -5394,35 +5389,6 @@ function TasksPageContent() { } }, [board, loadBoard, loadBoards]); - const setDefaultBoard = useCallback(async ( - targetBoard: Pick, - ) => { - if (saving || targetBoard.is_default_for_current_user) return; - - setBoardActionsMenuOpen(false); - setSaving(true); - setError(null); - try { - const updatedBoard = await apiClient.setDefaultTaskBoard(targetBoard.id); - setBoard((current) => ( - current - ? { - ...current, - is_default_for_current_user: current.id === updatedBoard.id, - } - : current - )); - setBoards((current) => current.map((item) => ({ - ...item, - is_default_for_current_user: item.id === updatedBoard.id, - }))); - } catch (defaultError) { - setError(getTaskError(defaultError, "Не удалось выбрать доску по умолчанию")); - } finally { - setSaving(false); - } - }, [saving]); - const deleteBoard = useCallback(async ( targetBoard: Pick, ) => { @@ -5434,16 +5400,10 @@ function TasksPageContent() { setError(null); try { await apiClient.deleteTaskBoard(targetBoard.id); - const nextBoards = await loadBoards(); + await loadBoards(); if (selectedBoardId === targetBoard.id) { - const nextBoard = nextBoards[0] || null; - if (nextBoard) { - router.replace(`/tasks?board=${nextBoard.id}`, { scroll: false }); - } else { - setBoard(null); - setSelectedBoardId(null); - router.replace("/tasks", { scroll: false }); - } + await loadBoard(null); + router.replace("/tasks", { scroll: false }); setSearch(""); setOnlyMine(false); setSelectedColumnTarget("all"); @@ -5453,7 +5413,7 @@ function TasksPageContent() { } finally { setSaving(false); } - }, [loadBoards, router, saving, selectedBoardId]); + }, [loadBoard, loadBoards, router, saving, selectedBoardId]); const deleteSelectedBoard = useCallback(() => { if (!board) return; @@ -7411,7 +7371,6 @@ function TasksPageContent() { onToggleHiddenGroup={(group) => void toggleBoardGroupHidden(group)} onEditBoard={openEditBoard} onDeleteBoard={(targetBoard) => void deleteBoard(targetBoard)} - onSetDefaultBoard={(targetBoard) => void setDefaultBoard(targetBoard)} onToggleBoardPin={(targetBoard) => void toggleBoardPin(targetBoard)} onToggleBoardNotifications={(targetBoard) => void toggleBoardNotifications(targetBoard)} onMoveBoard={setBoardGroupMemberships} @@ -7422,6 +7381,8 @@ function TasksPageContent() { />
+ {board ? ( + <>
@@ -7547,26 +7508,6 @@ function TasksPageContent() { Автоматизация - ) : null} + + ) : ( +
+
+ +

Выберите доску

+

Доска откроется справа от списка

+
+
+ )}
diff --git a/frontend/src/components/tasks/TaskBoardNavigator.tsx b/frontend/src/components/tasks/TaskBoardNavigator.tsx index 3a447213..f7505f69 100644 --- a/frontend/src/components/tasks/TaskBoardNavigator.tsx +++ b/frontend/src/components/tasks/TaskBoardNavigator.tsx @@ -62,7 +62,6 @@ type TaskBoardNavigatorProps = { onToggleHiddenGroup: (group: TaskBoardGroup) => void; onEditBoard: (board: TaskBoardSummary) => void; onDeleteBoard: (board: TaskBoardSummary) => void; - onSetDefaultBoard: (board: TaskBoardSummary) => void; onToggleBoardPin: (board: TaskBoardSummary) => void; onToggleBoardNotifications: (board: TaskBoardSummary) => void; onMoveBoard: ( @@ -102,7 +101,6 @@ function BoardRow({ onToggleMenu, onEdit, onDelete, - onSetDefault, onTogglePin, onToggleNotifications, onMove, @@ -118,7 +116,6 @@ function BoardRow({ onToggleMenu: () => void; onEdit: () => void; onDelete: () => void; - onSetDefault: () => void; onTogglePin: () => void; onToggleNotifications: () => void; onMove: () => void; @@ -170,9 +167,6 @@ function BoardRow({ {board.name} - {board.is_default_for_current_user ? ( - - ) : null} {board.is_pinned ? ( ) : null} @@ -244,20 +238,6 @@ function BoardRow({ /> {board.is_pinned ? "Открепить" : "Закрепить"} -