diff --git a/frontend/src/app/tasks/page.tsx b/frontend/src/app/tasks/page.tsx index 440fb2bf..7dd68ee9 100644 --- a/frontend/src/app/tasks/page.tsx +++ b/frontend/src/app/tasks/page.tsx @@ -1738,6 +1738,7 @@ type BoardTaskCellProps = TaskColumnCardsProps & { linkedColumnHighlight: boolean; synchronizedColumnDrag: boolean; fillAvailableHeight: boolean; + embeddedInMobileLane?: boolean; }; function BoardTaskCell({ @@ -1746,6 +1747,7 @@ function BoardTaskCell({ linkedColumnHighlight, synchronizedColumnDrag, fillAvailableHeight, + embeddedInMobileLane = false, ...cardsProps }: BoardTaskCellProps) { const { setNodeRef, isOver } = useDroppable({ @@ -1764,12 +1766,14 @@ function BoardTaskCell({ return (
@@ -3700,6 +3704,7 @@ function TasksPageContent() { const [error, setError] = useState(null); const [search, setSearch] = useState(""); const [mobileSearchOpen, setMobileSearchOpen] = useState(false); + const [mobileLaneLayout, setMobileLaneLayout] = useState(false); const [onlyMine, setOnlyMine] = useState(false); const [desktopWideMode, setDesktopWideMode] = useState(false); const [selectedColumnTarget, setSelectedColumnTarget] = useState("all"); @@ -3897,6 +3902,14 @@ function TasksPageContent() { ); }, [user?.id]); + useEffect(() => { + const mediaQuery = window.matchMedia("(max-width: 79.999rem)"); + const updateMobileLaneLayout = () => setMobileLaneLayout(mediaQuery.matches); + updateMobileLaneLayout(); + mediaQuery.addEventListener("change", updateMobileLaneLayout); + return () => mediaQuery.removeEventListener("change", updateMobileLaneLayout); + }, []); + const changeDesktopWideMode = useCallback((enabled: boolean) => { setDesktopWideMode(enabled); if (user?.id) { @@ -7738,9 +7751,10 @@ function TasksPageContent() { const renderTaskCell = ( cellColumn: TaskColumn, rowId: number | null, + embeddedInMobileLane = false, ) => ( ); @@ -7826,31 +7841,85 @@ function TasksPageContent() { subcolumnHeaders={subcolumnHeaders} subcolumnGridTemplate={gridTemplateColumns} > - {baseColumns} - {columnRows.length > 0 ? ( -
- {columnRows.map((row, rowIndex) => { - const rowTasksCount = filteredTasks.filter((task) => task.row === row.id).length; + {mobileLaneLayout ? ( +
+ {previewCellColumns.map((cellColumn) => { + const baseCellTasksCount = tasksByPlacement.get( + taskPlacementKey(cellColumn.id, null), + )?.length || 0; return ( - { - if (cellColumns[0]) startQuickTask(cellColumns[0].id, row.id); - }} - onEdit={() => openEditColumnRow(row)} - onDelete={() => void deleteColumnRow(row)} - expanded={!boardViewState.collapsed_row_ids.includes(row.id)} - onToggle={() => toggleBoardViewState("row", row.id)} - hasFollowingSection={rowIndex < columnRows.length - 1} +
- {previewCellColumns.map((item) => renderTaskCell(item, row.id))} - +
+ 0} + tasksCount={baseCellTasksCount} + gridTemplateColumns={TASK_SUBCOLUMN_WIDTH} + expanded={!boardViewState.collapsed_base_column_ids.includes(column.id)} + onToggle={() => toggleBoardViewState("base", column.id)} + hasFollowingSection={columnRows.length > 0} + > + {renderTaskCell(cellColumn, null, true)} + + {columnRows.map((row, rowIndex) => { + const rowTasksCount = tasksByPlacement.get( + taskPlacementKey(cellColumn.id, row.id), + )?.length || 0; + return ( + startQuickTask(cellColumn.id, row.id)} + onEdit={() => openEditColumnRow(row)} + onDelete={() => void deleteColumnRow(row)} + expanded={!boardViewState.collapsed_row_ids.includes(row.id)} + onToggle={() => toggleBoardViewState("row", row.id)} + hasFollowingSection={rowIndex < columnRows.length - 1} + > + {renderTaskCell(cellColumn, row.id, true)} + + ); + })} +
+
); })}
- ) : null} + ) : ( + <> + {baseColumns} + {columnRows.length > 0 ? ( +
+ {columnRows.map((row, rowIndex) => { + const rowTasksCount = filteredTasks.filter((task) => task.row === row.id).length; + return ( + { + if (cellColumns[0]) startQuickTask(cellColumns[0].id, row.id); + }} + onEdit={() => openEditColumnRow(row)} + onDelete={() => void deleteColumnRow(row)} + expanded={!boardViewState.collapsed_row_ids.includes(row.id)} + onToggle={() => toggleBoardViewState("row", row.id)} + hasFollowingSection={rowIndex < columnRows.length - 1} + > + {previewCellColumns.map((item) => renderTaskCell(item, row.id))} + + ); + })} +
+ ) : null} + + )} ); })}