1- // Tasks.tsx - Desktop -first task management interface with automatic status handling
1+ // Tasks.tsx - Fixed desktop -first task management interface
22import { useState , useEffect , useMemo } from 'react' ;
33import {
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