Skip to content

Commit 899c85d

Browse files
committed
Resolve some UI errors
1 parent d50b1ab commit 899c85d

2 files changed

Lines changed: 40 additions & 48 deletions

File tree

Frontend/src/Components/Sidebar.tsx

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Sidebar.tsx - Desktop-first filter sidebar with status, category, and due date filters
1+
// Sidebar.tsx - Fixed filter sidebar with proper mobile drawer positioning
22
import { useState } from 'react';
33
import {
44
Drawer,
@@ -24,7 +24,7 @@ type SidebarProps = {
2424
onStatusChange: (status: string | null) => void;
2525
onCategoryChange: (category: string | null) => void;
2626
onDueDateChange: (date: string | null) => void;
27-
categories?: string[]; // Available categories from tasks
27+
categories?: string[];
2828
open: boolean;
2929
onClose: () => void;
3030
};
@@ -43,29 +43,24 @@ function Sidebar({
4343
const theme = useTheme();
4444
const isMobile = useMediaQuery(theme.breakpoints.down('md'));
4545

46-
// Handle status filter change
4746
const handleStatusChange = (event: React.ChangeEvent<HTMLInputElement>) => {
4847
const value = event.target.value;
4948
setSelectedStatus(value);
50-
// Pass null for 'all', otherwise pass the status value
5149
onStatusChange(value === 'all' ? null : value);
5250
};
5351

54-
// Handle category filter change
5552
const handleCategoryChange = (category: string) => {
5653
const newCategory = category === selectedCategory ? 'all' : category;
5754
setSelectedCategory(newCategory);
5855
onCategoryChange(newCategory === 'all' ? null : newCategory);
5956
};
6057

61-
// Handle due date filter change
6258
const handleDateChange = (event: React.ChangeEvent<HTMLInputElement>) => {
6359
const value = event.target.value;
6460
setSelectedDate(value);
6561
onDueDateChange(value || null);
6662
};
6763

68-
// Clear all filters
6964
const handleClearFilters = () => {
7065
setSelectedStatus('all');
7166
setSelectedCategory('all');
@@ -171,37 +166,50 @@ function Sidebar({
171166

172167
return (
173168
<>
174-
{/* Desktop permanent drawer - shows by default */}
169+
{/* Desktop permanent drawer - positioned relative to viewport */}
175170
<Drawer
176171
variant="permanent"
177172
sx={{
178173
width: 280,
179174
flexShrink: 0,
180-
display: { xs: 'none', md: 'block' }, // Hide on mobile, show on desktop
175+
display: { xs: 'none', md: 'block' },
181176
'& .MuiDrawer-paper': {
182177
width: 280,
183178
boxSizing: 'border-box',
184-
top: 64, // Below navbar
179+
top: 64,
185180
height: 'calc(100% - 64px)',
181+
position: 'fixed', // Fixed positioning
182+
left: 0,
183+
zIndex: theme.zIndex.drawer,
186184
},
187185
}}
188186
>
189187
{sidebarContent}
190188
</Drawer>
191189

192-
{/* Mobile temporary drawer */}
190+
{/* Mobile temporary drawer - FIXED: Proper z-index below navbar */}
193191
<Drawer
194192
variant="temporary"
193+
anchor="left"
195194
open={open}
196195
onClose={onClose}
197196
ModalProps={{
198-
keepMounted: true,
197+
keepMounted: true, // Better mobile performance
199198
}}
200199
sx={{
201-
display: { xs: 'block', md: 'none' }, // Show on mobile, hide on desktop
200+
display: { xs: 'block', md: 'none' },
202201
'& .MuiDrawer-paper': {
203202
width: 280,
204203
boxSizing: 'border-box',
204+
top: 64, // Start below the navbar
205+
height: 'calc(100% - 64px)', // Full height minus navbar
206+
// z-index below navbar (appBar default is 1100)
207+
zIndex: theme.zIndex.drawer, // 1200, but modal backdrop handles layering
208+
},
209+
// Ensure modal backdrop is below navbar
210+
'& .MuiBackdrop-root': {
211+
top: 64,
212+
height: 'calc(100% - 64px)',
205213
},
206214
}}
207215
>

Frontend/src/Pages/Tasks.tsx

Lines changed: 19 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Tasks.tsx - Desktop-first task management interface with automatic status handling
1+
// Tasks.tsx - Fixed desktop-first task management interface
22
import { useState, useEffect, useMemo } from 'react';
33
import {
44
Box,
@@ -84,22 +84,18 @@ export function Tasks() {
8484
// Fetch all tasks on component mount
8585
useEffect(() => {
8686
fetchTasks();
87-
// Check for overdue tasks every time component mounts
8887
checkAndUpdateOverdueTasks();
8988

90-
// Set interval to check every hour (3600000 ms)
9189
const interval = setInterval(checkAndUpdateOverdueTasks, 3600000);
9290
return () => clearInterval(interval);
9391
}, []);
9492

95-
// Re-check overdue status after fetching tasks
9693
useEffect(() => {
9794
if (tasks.length > 0) {
9895
checkAndUpdateOverdueTasks();
9996
}
10097
}, [tasks.length]);
10198

102-
// Apply filters whenever tasks or filter criteria change
10399
useEffect(() => {
104100
applyFilters();
105101
}, [tasks, statusFilter, categoryFilter, dueDateFilter, searchQuery]);
@@ -113,22 +109,19 @@ export function Tasks() {
113109
}
114110
};
115111

116-
// Automatically update overdue tasks based on due date
117112
const checkAndUpdateOverdueTasks = async () => {
118113
const today = new Date();
119-
today.setHours(0, 0, 0, 0); // Reset time to midnight for accurate comparison
114+
today.setHours(0, 0, 0, 0);
120115

121116
const tasksToUpdate = tasks.filter((task) => {
122117
if (!task.due_date || task.status === 'completed') return false;
123118

124119
const dueDate = new Date(task.due_date);
125120
dueDate.setHours(0, 0, 0, 0);
126121

127-
// If due date has passed and status is not overdue
128122
return dueDate < today && task.status !== 'overdue';
129123
});
130124

131-
// Update each overdue task
132125
for (const task of tasksToUpdate) {
133126
try {
134127
const updated = await updateTasks(
@@ -137,38 +130,32 @@ export function Tasks() {
137130
description: task.description || '',
138131
due_date: task.due_date || '',
139132
category: task.category || '',
140-
status: 'overdue', // Set status to overdue
133+
status: 'overdue',
141134
},
142135
task.id
143136
);
144-
// Update local state
145137
setTasks((prev) => prev.map((t) => (t.id === task.id ? updated : t)));
146138
} catch (err) {
147139
console.error('Error updating overdue task:', err);
148140
}
149141
}
150142
};
151143

152-
// Apply all active filters to tasks
153144
const applyFilters = () => {
154145
let filtered = [...tasks];
155146

156-
// Status filter
157147
if (statusFilter) {
158148
filtered = filtered.filter((t) => t.status === statusFilter);
159149
}
160150

161-
// Category filter
162151
if (categoryFilter) {
163152
filtered = filtered.filter((t) => t.category === categoryFilter);
164153
}
165154

166-
// Due date filter
167155
if (dueDateFilter) {
168156
filtered = filtered.filter((t) => t.due_date === dueDateFilter);
169157
}
170158

171-
// Search filter (searches in task name and description)
172159
if (searchQuery) {
173160
const query = searchQuery.toLowerCase();
174161
filtered = filtered.filter(
@@ -181,13 +168,11 @@ export function Tasks() {
181168
setFilteredTasks(filtered);
182169
};
183170

184-
// Get unique categories from all tasks
185171
const categories = useMemo(() => {
186172
const cats = tasks.map((t) => t.category).filter(Boolean);
187173
return [...new Set(cats)] as string[];
188174
}, [tasks]);
189175

190-
// Calculate task statistics
191176
const stats = useMemo(() => {
192177
const total = tasks.length;
193178
const completed = tasks.filter((t) => t.status === 'completed').length;
@@ -196,7 +181,6 @@ export function Tasks() {
196181
return { total, completed, pending, overdue };
197182
}, [tasks]);
198183

199-
// Handle adding a new task
200184
const handleAddTask = async () => {
201185
try {
202186
const payload = {
@@ -214,7 +198,6 @@ export function Tasks() {
214198
}
215199
};
216200

217-
// Handle editing a task
218201
const handleEditTask = async () => {
219202
if (!currentTask) return;
220203

@@ -234,7 +217,6 @@ export function Tasks() {
234217
}
235218
};
236219

237-
// Handle deleting a task
238220
const handleDeleteTask = async (id: number) => {
239221
if (!window.confirm('Are you sure you want to delete this task?')) return;
240222

@@ -246,7 +228,6 @@ export function Tasks() {
246228
}
247229
};
248230

249-
// Change task status (pending <-> completed) - Updated to work directly
250231
const handleStatusChange = async (newStatus: 'pending' | 'completed') => {
251232
if (!selectedTaskForStatus) return;
252233

@@ -256,19 +237,18 @@ export function Tasks() {
256237
description: selectedTaskForStatus.description || '',
257238
due_date: selectedTaskForStatus.due_date || '',
258239
category: selectedTaskForStatus.category || '',
259-
status: newStatus, // Update status
240+
status: newStatus,
260241
};
261242
const updated = await updateTasks(payload, selectedTaskForStatus.id);
262243
setTasks((prev) =>
263244
prev.map((t) => (t.id === selectedTaskForStatus.id ? updated : t))
264245
);
265-
setSelectedTaskForStatus(null); // Reset after update
246+
setSelectedTaskForStatus(null);
266247
} catch (err) {
267248
console.error('Error updating status:', err);
268249
}
269250
};
270251

271-
// Open edit dialog with task data
272252
const openEditDialog = (task: Task) => {
273253
setCurrentTask(task);
274254
setFormData({
@@ -285,7 +265,6 @@ export function Tasks() {
285265
setCurrentTask(null);
286266
};
287267

288-
// Get status color for chips
289268
const getStatusColor = (status?: string) => {
290269
switch (status) {
291270
case 'completed':
@@ -299,7 +278,6 @@ export function Tasks() {
299278
}
300279
};
301280

302-
// Get status icon
303281
const getStatusIcon = (status?: string) => {
304282
switch (status) {
305283
case 'completed':
@@ -317,7 +295,7 @@ export function Tasks() {
317295
<>
318296
<Navbar />
319297
<Box sx={{ display: 'flex', minHeight: 'calc(100vh - 64px)', bgcolor: 'background.default' }}>
320-
{/* Sidebar for filters - Desktop permanent, Mobile drawer */}
298+
{/* Sidebar for filters */}
321299
<Sidebar
322300
onStatusChange={setStatusFilter}
323301
onCategoryChange={setCategoryFilter}
@@ -327,18 +305,24 @@ export function Tasks() {
327305
onClose={() => setSidebarOpen(false)}
328306
/>
329307

330-
{/* Main content area - Desktop-first layout */}
308+
{/* Main content area - FIXED: Removed margin-left, content now centered */}
331309
<Box
332310
component="main"
333311
sx={{
334312
flexGrow: 1,
335-
p: { xs: 2, sm: 3, md: 4 }, // More padding on desktop
336-
ml: { xs: 0, md: '280px' }, // Sidebar offset only on desktop
337-
width: { xs: '100%', md: 'calc(100% - 280px)' }, // Ensure proper width
313+
width: '100%',
338314
minHeight: 'calc(100vh - 64px)',
315+
display: 'flex',
316+
justifyContent: 'center',
339317
}}
340318
>
341-
<Container maxWidth="xl">
319+
<Container
320+
maxWidth="xl"
321+
sx={{
322+
p: { xs: 2, sm: 3, md: 4 },
323+
width: '100%',
324+
}}
325+
>
342326
{/* Header with user greeting and search */}
343327
<Box sx={{ mb: 4 }}>
344328
<Typography variant="h4" gutterBottom fontWeight={600}>
@@ -502,7 +486,7 @@ export function Tasks() {
502486
</IconButton>
503487
</Tooltip>
504488

505-
{/* Status change buttons - visible and clear */}
489+
{/* Status change buttons */}
506490
{task.status !== 'overdue' && (
507491
<>
508492
{task.status === 'pending' && (
@@ -545,7 +529,7 @@ export function Tasks() {
545529
)}
546530
</Container>
547531

548-
{/* Floating action button to add task */}
532+
{/* Floating action button */}
549533
<Button
550534
variant="contained"
551535
startIcon={<Add />}

0 commit comments

Comments
 (0)