@@ -694,6 +694,117 @@ const PythonTaskGenerator: React.FC<{
694694 ) ;
695695} ;
696696
697+ const DockerTaskGenerator : React . FC < {
698+ dockerCaps : DockerCapabilities | undefined ;
699+ onAddTask : ( task : Partial < Task > ) => void ;
700+ } > = ( { dockerCaps, onAddTask } ) => {
701+ if ( ! dockerCaps ) return null ;
702+ const dockerfiles = dockerCaps . dockerfiles ?? [ ] ;
703+ const composeFiles = dockerCaps . composeFiles ?? [ ] ;
704+ if ( dockerfiles . length === 0 && composeFiles . length === 0 ) return null ;
705+
706+ const getBasename = ( p : string ) => p . split ( / [ \\ / ] / ) . pop ( ) || p ;
707+
708+ const createDockerBuildTask = ( dockerfile : string ) => {
709+ onAddTask ( {
710+ name : `Build Image (${ getBasename ( dockerfile ) } )` ,
711+ steps : [
712+ {
713+ type : TaskStepType . DOCKER_BUILD_IMAGE ,
714+ dockerfilePath : dockerfile ,
715+ } ,
716+ ] . map ( step => ( { ...step , id : '' , enabled : true } ) ) ,
717+ } ) ;
718+ } ;
719+
720+ const createComposeTask = (
721+ composePath : string ,
722+ type : TaskStepType . DOCKER_COMPOSE_UP | TaskStepType . DOCKER_COMPOSE_DOWN | TaskStepType . DOCKER_COMPOSE_BUILD ,
723+ ) => {
724+ const labelMap : Record <
725+ TaskStepType . DOCKER_COMPOSE_UP | TaskStepType . DOCKER_COMPOSE_DOWN | TaskStepType . DOCKER_COMPOSE_BUILD ,
726+ string
727+ > = {
728+ [ TaskStepType . DOCKER_COMPOSE_UP ] : 'Compose Up' ,
729+ [ TaskStepType . DOCKER_COMPOSE_DOWN ] : 'Compose Down' ,
730+ [ TaskStepType . DOCKER_COMPOSE_BUILD ] : 'Compose Build' ,
731+ } ;
732+
733+ const name = `${ labelMap [ type ] } (${ getBasename ( composePath ) } )` ;
734+ onAddTask ( {
735+ name,
736+ steps : [
737+ {
738+ type,
739+ dockerComposePath : composePath ,
740+ } ,
741+ ] . map ( step => ( { ...step , id : '' , enabled : true } ) ) ,
742+ } ) ;
743+ } ;
744+
745+ const detectedArtifacts = [
746+ ...dockerfiles . map ( file => `Dockerfile: ${ getBasename ( file ) } ` ) ,
747+ ...composeFiles . map ( file => `Compose: ${ getBasename ( file ) } ` ) ,
748+ ] ;
749+
750+ return (
751+ < div className = "p-3 mb-4 bg-sky-50 dark:bg-gray-900/50 rounded-lg border border-sky-200 dark:border-gray-700" >
752+ < div className = "flex items-center gap-2 mb-2" >
753+ < DockerIcon className = "h-5 w-5 text-sky-500" />
754+ < h3 className = "text-md font-semibold text-gray-800 dark:text-gray-200" > Docker Artifacts Detected</ h3 >
755+ </ div >
756+ < div className = "text-xs text-gray-600 dark:text-gray-400 mb-3 flex flex-wrap gap-2" >
757+ { detectedArtifacts . map ( artifact => (
758+ < span
759+ key = { artifact }
760+ className = "bg-sky-100 dark:bg-sky-900/50 text-sky-800 dark:text-sky-300 px-2 py-0.5 rounded-full"
761+ >
762+ { artifact }
763+ </ span >
764+ ) ) }
765+ </ div >
766+ < div className = "flex flex-wrap gap-2" >
767+ { dockerfiles . map ( file => (
768+ < button
769+ key = { `dockerfile-${ file } ` }
770+ type = "button"
771+ onClick = { ( ) => createDockerBuildTask ( file ) }
772+ className = "text-xs font-medium text-white bg-sky-600 hover:bg-sky-700 px-3 py-1.5 rounded-md"
773+ >
774+ Add Build Task for { getBasename ( file ) }
775+ </ button >
776+ ) ) }
777+ { composeFiles . flatMap ( file => [
778+ < button
779+ key = { `compose-up-${ file } ` }
780+ type = "button"
781+ onClick = { ( ) => createComposeTask ( file , TaskStepType . DOCKER_COMPOSE_UP ) }
782+ className = "text-xs font-medium text-white bg-emerald-600 hover:bg-emerald-700 px-3 py-1.5 rounded-md"
783+ >
784+ Add Compose Up Task ({ getBasename ( file ) } )
785+ </ button > ,
786+ < button
787+ key = { `compose-down-${ file } ` }
788+ type = "button"
789+ onClick = { ( ) => createComposeTask ( file , TaskStepType . DOCKER_COMPOSE_DOWN ) }
790+ className = "text-xs font-medium text-white bg-amber-600 hover:bg-amber-700 px-3 py-1.5 rounded-md"
791+ >
792+ Add Compose Down Task ({ getBasename ( file ) } )
793+ </ button > ,
794+ < button
795+ key = { `compose-build-${ file } ` }
796+ type = "button"
797+ onClick = { ( ) => createComposeTask ( file , TaskStepType . DOCKER_COMPOSE_BUILD ) }
798+ className = "text-xs font-medium text-white bg-slate-600 hover:bg-slate-700 px-3 py-1.5 rounded-md"
799+ >
800+ Add Compose Build Task ({ getBasename ( file ) } )
801+ </ button > ,
802+ ] ) }
803+ </ div >
804+ </ div >
805+ ) ;
806+ } ;
807+
697808const DelphiTaskGenerator : React . FC < {
698809 delphiCaps : DelphiCapabilities | undefined ;
699810 onAddTask : ( task : Partial < Task > ) => void ;
@@ -956,6 +1067,7 @@ const TaskStepsEditor: React.FC<{
9561067 </ div >
9571068 ) }
9581069
1070+ < DockerTaskGenerator dockerCaps = { projectInfo ?. docker } onAddTask = { onAddTask } />
9591071 < NodejsTaskGenerator nodejsCaps = { projectInfo ?. nodejs } onAddTask = { onAddTask } />
9601072 < LazarusTaskGenerator lazarusCaps = { projectInfo ?. lazarus } onAddTask = { onAddTask } />
9611073 < DelphiTaskGenerator delphiCaps = { projectInfo ?. delphi } onAddTask = { onAddTask } />
0 commit comments