@@ -2,9 +2,10 @@ import React, { useState, useEffect, useCallback, useMemo, Suspense } from 'reac
2
2
import {
3
3
Container , Typography , Box , Button , Paper , ThemeProvider ,
4
4
createTheme , Snackbar , Menu , MenuItem , Modal , Fade ,
5
- useMediaQuery , useTheme
5
+ useMediaQuery , useTheme , Fab
6
6
} from '@mui/material' ;
7
7
import { Calendar , dateFnsLocalizer , Views } from 'react-big-calendar' ;
8
+ import AddIcon from '@mui/icons-material/Add' ;
8
9
import format from 'date-fns/format' ;
9
10
import parse from 'date-fns/parse' ;
10
11
import startOfWeek from 'date-fns/startOfWeek' ;
@@ -452,10 +453,27 @@ function Home({ isDemo = false }) {
452
453
color : 'white' ,
453
454
border : 'none' ,
454
455
padding : '2px 5px' ,
455
- display : 'block'
456
+ display : 'block' ,
457
+ overflow : 'hidden' ,
458
+ textOverflow : 'ellipsis' ,
459
+ whiteSpace : 'nowrap' ,
460
+ fontSize : isMobile ? '0.7rem' : '0.9rem'
456
461
}
457
462
} ;
458
- } , [ ] ) ;
463
+ } , [ isMobile ] ) ;
464
+
465
+ const formats = {
466
+ weekdayFormat : ( date , culture , localizer ) =>
467
+ isMobile
468
+ ? localizer . format ( date , 'EEEEE' , culture )
469
+ : localizer . format ( date , 'EEEE' , culture )
470
+ } ;
471
+
472
+ const CustomEvent = ( { event } ) => (
473
+ < span title = { event . title } >
474
+ { isMobile ? event . title . slice ( 0 , 3 ) + '...' : event . title }
475
+ </ span >
476
+ ) ;
459
477
460
478
const handleNavigate = useCallback ( ( newDate ) => {
461
479
setCurrentDate ( newDate ) ;
@@ -609,6 +627,7 @@ function Home({ isDemo = false }) {
609
627
setSelectedDayTasks ( [ ] ) ;
610
628
} ;
611
629
630
+
612
631
return (
613
632
< ThemeProvider theme = { theme } >
614
633
< Box sx = { {
@@ -617,34 +636,36 @@ function Home({ isDemo = false }) {
617
636
minHeight : '100vh' ,
618
637
bgcolor : 'background.default'
619
638
} } >
620
- < Navbar onViewChange = { setView } onNewTask = { ( ) => setIsFormVisible ( true ) } isDemo = { isDemo } />
639
+ < Navbar onViewChange = { setView } onNewTask = { handleNewTask } isDemo = { isDemo } />
621
640
{ isDemo && < Container maxWidth = "lg" sx = { { mt : 2 } } > < DemoBanner /> </ Container > }
622
641
< Container component = "main" maxWidth = "lg" sx = { { mt : 4 , mb : 4 , flexGrow : 1 } } >
623
642
< Paper elevation = { 0 } sx = { { p : 3 , minHeight : 'calc(100vh - 200px)' , ...calendarStyles } } >
624
643
{ view === 'calendar' ? (
625
644
< DnDCalendar
626
- localizer = { localizer }
627
- events = { calendarEvents }
628
- startAccessor = "start"
629
- endAccessor = "end"
630
- style = { { height : '100%' , minHeight : '500px' } }
631
- eventPropGetter = { eventStyleGetter }
632
- messages = { messages }
633
- culture = 'es'
634
- onSelectEvent = { handleSelectEvent }
635
- onSelectSlot = { handleSelectSlot }
636
- selectable
637
- views = { { month : true , week : true , day : true , agenda : true } }
638
- defaultView = { Views . MONTH }
639
- date = { currentDate }
640
- onNavigate = { handleNavigate }
641
- components = { {
642
- toolbar : ( toolbarProps ) => < CustomToolbar { ...toolbarProps } date = { currentDate } />
643
- } }
644
- onShowMore = { handleShowMoreClick }
645
- onEventDrop = { handleEventDrop }
646
- resizable = { false }
647
- />
645
+ localizer = { localizer }
646
+ events = { calendarEvents }
647
+ startAccessor = "start"
648
+ endAccessor = "end"
649
+ style = { { height : '100%' , minHeight : '500px' } }
650
+ eventPropGetter = { eventStyleGetter }
651
+ messages = { messages }
652
+ culture = 'es'
653
+ onSelectEvent = { handleSelectEvent }
654
+ onSelectSlot = { handleSelectSlot }
655
+ selectable
656
+ views = { { month : true , week : true , day : true , agenda : true } }
657
+ defaultView = { Views . MONTH }
658
+ date = { currentDate }
659
+ onNavigate = { handleNavigate }
660
+ components = { {
661
+ toolbar : ( toolbarProps ) => < CustomToolbar { ...toolbarProps } date = { currentDate } /> ,
662
+ event : CustomEvent
663
+ } }
664
+ onShowMore = { handleShowMoreClick }
665
+ onEventDrop = { handleEventDrop }
666
+ resizable = { false }
667
+ formats = { formats }
668
+ />
648
669
) : (
649
670
< >
650
671
< Box sx = { { display : 'flex' , justifyContent : 'space-between' , alignItems : 'center' , mb : 2 } } >
@@ -684,6 +705,21 @@ function Home({ isDemo = false }) {
684
705
</ Paper >
685
706
</ Container >
686
707
< Footer />
708
+ { isMobile && (
709
+ < Fab
710
+ color = "primary"
711
+ aria-label = "add"
712
+ onClick = { handleNewTask }
713
+ sx = { {
714
+ position : 'fixed' ,
715
+ bottom : 16 ,
716
+ right : 16 ,
717
+ zIndex : 1000
718
+ } }
719
+ >
720
+ < AddIcon />
721
+ </ Fab >
722
+ ) }
687
723
</ Box >
688
724
< LimitReachedModal isOpen = { isModalOpen } onClose = { ( ) => setIsModalOpen ( false ) } />
689
725
< Modal
@@ -735,41 +771,41 @@ function Home({ isDemo = false }) {
735
771
/>
736
772
{ isFormVisible && (
737
773
< Modal
738
- open = { isFormVisible }
739
- onClose = { ( ) => setIsFormVisible ( false ) }
740
- closeAfterTransition
741
- BackdropProps = { {
742
- timeout : 500 ,
743
- } }
744
- >
745
- < Fade in = { isFormVisible } >
746
- < Box sx = { {
747
- position : 'absolute' ,
748
- top : '50%' ,
749
- left : '50%' ,
750
- transform : 'translate(-50%, -50%)' ,
751
- width : isMobile ? '90%' : 400 ,
752
- bgcolor : 'background.paper' ,
753
- boxShadow : 24 ,
754
- p : 4 ,
755
- borderRadius : 2 ,
756
- } } >
757
- < Typography variant = "h6" component = "h2" sx = { { mb : 2 } } >
758
- { editingTask && editingTask . _id ? 'Editar Tarea' : 'Crear Nueva Tarea' }
759
- </ Typography >
760
- < Suspense fallback = { < div > Cargando...</ div > } >
761
- < TaskForm
762
- onSubmit = { editingTask && editingTask . _id ? handleUpdateTask : handleCreateTask }
763
- initialTask = { editingTask }
764
- onCancel = { ( ) => {
765
- setEditingTask ( null ) ;
766
- setIsFormVisible ( false ) ;
767
- } }
768
- />
769
- </ Suspense >
770
- </ Box >
771
- </ Fade >
772
- </ Modal >
774
+ open = { isFormVisible }
775
+ onClose = { ( ) => setIsFormVisible ( false ) }
776
+ closeAfterTransition
777
+ BackdropProps = { {
778
+ timeout : 500 ,
779
+ } }
780
+ >
781
+ < Fade in = { isFormVisible } >
782
+ < Box sx = { {
783
+ position : 'absolute' ,
784
+ top : '50%' ,
785
+ left : '50%' ,
786
+ transform : 'translate(-50%, -50%)' ,
787
+ width : isMobile ? '90%' : 400 ,
788
+ bgcolor : 'background.paper' ,
789
+ boxShadow : 24 ,
790
+ p : 4 ,
791
+ borderRadius : 2 ,
792
+ } } >
793
+ < Typography variant = "h6" component = "h2" sx = { { mb : 2 } } >
794
+ { editingTask && editingTask . _id ? 'Editar Tarea' : 'Crear Nueva Tarea' }
795
+ </ Typography >
796
+ < Suspense fallback = { < div > Cargando...</ div > } >
797
+ < TaskForm
798
+ onSubmit = { editingTask && editingTask . _id ? handleUpdateTask : handleCreateTask }
799
+ initialTask = { editingTask }
800
+ onCancel = { ( ) => {
801
+ setEditingTask ( null ) ;
802
+ setIsFormVisible ( false ) ;
803
+ } }
804
+ />
805
+ </ Suspense >
806
+ </ Box >
807
+ </ Fade >
808
+ </ Modal >
773
809
) }
774
810
{ isDayTasksPanelOpen && (
775
811
< DayTasksPanel
0 commit comments