@@ -47,6 +47,9 @@ export const TaskDialog = ({
4747 editState,
4848 onUpdateState,
4949 allTasks,
50+ isCreatingNewProject,
51+ setIsCreatingNewProject,
52+ uniqueProjects,
5053 onSaveDescription,
5154 onSaveTags,
5255 onSavePriority,
@@ -839,41 +842,104 @@ export const TaskDialog = ({
839842 < TableCell >
840843 { editState . isEditingProject ? (
841844 < >
842- < div className = "flex items-center" >
843- < Input
844- id = { `project-${ task . id } ` }
845- name = { `project-${ task . id } ` }
846- type = "text"
847- value = { editState . editedProject }
848- onChange = { ( e ) =>
849- onUpdateState ( {
850- editedProject : e . target . value ,
851- } )
845+ < div className = "col-span-3 space-y-2 w-[300px]" >
846+ < Select
847+ value = {
848+ isCreatingNewProject
849+ ? '__CREATE_NEW__'
850+ : editState . editedProject
852851 }
853- className = "flex-grow mr-2"
854- />
855- < Button
856- variant = "ghost"
857- size = "icon"
858- onClick = { ( ) => {
859- onSaveProject ( task , editState . editedProject ) ;
860- onUpdateState ( { isEditingProject : false } ) ;
852+ onValueChange = { ( value ) => {
853+ if ( value === '__CREATE_NEW__' ) {
854+ setIsCreatingNewProject ( true ) ;
855+ onUpdateState ( { editedProject : '' } ) ;
856+ } else {
857+ const project =
858+ value === '__NONE__' ? '' : value ;
859+ setIsCreatingNewProject ( false ) ;
860+ onUpdateState ( { editedProject : project } ) ;
861+ onSaveProject ( task , project ) ;
862+ }
861863 } }
862864 >
863- < CheckIcon className = "h-4 w-4 text-green-500" />
864- </ Button >
865- < Button
866- variant = "ghost"
867- size = "icon"
868- onClick = { ( ) =>
869- onUpdateState ( {
870- editedProject : task . project ,
871- isEditingProject : false ,
872- } )
873- }
874- >
875- < XIcon className = "h-4 w-4 text-red-500" />
876- </ Button >
865+ < SelectTrigger
866+ id = "project"
867+ data-testid = "project-select"
868+ >
869+ < SelectValue
870+ placeholder = {
871+ uniqueProjects . length
872+ ? 'Select a project'
873+ : 'No projects yet'
874+ }
875+ >
876+ { isCreatingNewProject
877+ ? editState . editedProject
878+ ? `New: ${ editState . editedProject } `
879+ : '+ Create new project…'
880+ : undefined }
881+ </ SelectValue >
882+ </ SelectTrigger >
883+ < SelectContent
884+ onWheel = { ( e ) => e . stopPropagation ( ) }
885+ className = "max-h-60 overflow-y-auto"
886+ >
887+ < SelectItem value = "__CREATE_NEW__" >
888+ + Create new project…
889+ </ SelectItem >
890+ < SelectItem value = "__NONE__" >
891+ No project
892+ </ SelectItem >
893+ { uniqueProjects . map ( ( project : string ) => (
894+ < SelectItem key = { project } value = { project } >
895+ { project }
896+ </ SelectItem >
897+ ) ) }
898+ </ SelectContent >
899+ </ Select >
900+
901+ { isCreatingNewProject && (
902+ < div className = "flex gap-4 justify-center items-center" >
903+ < Input
904+ id = "project-name"
905+ placeholder = "New project name"
906+ value = { editState . editedProject }
907+ autoFocus
908+ onChange = { ( e ) =>
909+ onUpdateState ( {
910+ editedProject : e . target . value ,
911+ } )
912+ }
913+ />
914+ < div className = "flex justify-center items-center" >
915+ < Button
916+ variant = "ghost"
917+ size = "icon"
918+ onClick = { ( ) => {
919+ onSaveProject (
920+ task ,
921+ editState . editedProject
922+ ) ;
923+ onUpdateState ( { isEditingProject : false } ) ;
924+ } }
925+ >
926+ < CheckIcon className = "h-4 w-4 text-green-500" />
927+ </ Button >
928+ < Button
929+ variant = "ghost"
930+ size = "icon"
931+ onClick = { ( ) =>
932+ onUpdateState ( {
933+ editedProject : task . project ,
934+ isEditingProject : false ,
935+ } )
936+ }
937+ >
938+ < XIcon className = "h-4 w-4 text-red-500" />
939+ </ Button >
940+ </ div >
941+ </ div >
942+ ) }
877943 </ div >
878944 </ >
879945 ) : (
0 commit comments