@@ -39,6 +39,7 @@ import {
3939 refreshGitMaterial ,
4040 triggerCDNode ,
4141 triggerCINode ,
42+ triggerBranchChange ,
4243} from '../../../app/service'
4344import {
4445 createGitCommitUrl ,
@@ -47,6 +48,7 @@ import {
4748 preventBodyScroll ,
4849 sortObjectArrayAlphabetically ,
4950} from '../../../common'
51+ import { ReactComponent as Pencil } from '../../../../assets/icons/ic-pencil.svg'
5052import { getWorkflows , getWorkflowStatus } from '../../AppGroup.service'
5153import { CI_MATERIAL_EMPTY_STATE_MESSAGING , TIME_STAMP_ORDER } from '../../../app/details/triggerView/Constants'
5254import { toast } from 'react-toastify'
@@ -59,8 +61,8 @@ import {
5961 BulkResponseStatus ,
6062 ENV_TRIGGER_VIEW_GA_EVENTS ,
6163 BULK_CD_RESPONSE_STATUS_TEXT ,
62- responseListOrder ,
6364 BULK_VIRTUAL_RESPONSE_STATUS ,
65+ GetBranchChangeStatus ,
6466} from '../../Constants'
6567import { ReactComponent as DeployIcon } from '../../../../assets/icons/ic-nav-rocket.svg'
6668import { ReactComponent as Close } from '../../../../assets/icons/ic-cross.svg'
@@ -88,6 +90,7 @@ import Tippy from '@tippyjs/react'
8890import { getModuleInfo } from '../../../v2/devtronStackManager/DevtronStackManager.service'
8991import GitCommitInfoGeneric from '../../../common/GitCommitInfoGeneric'
9092import { getDefaultConfig } from '../../../notifications/notifications.service'
93+ import BulkSourceChange from './BulkSourceChange'
9194
9295const ApprovalMaterialModal = importComponentFromFELibrary ( 'ApprovalMaterialModal' )
9396const getDeployManifestDownload = importComponentFromFELibrary ( 'getDeployManifestDownload' , null , 'function' )
@@ -102,6 +105,7 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
102105 const [ pageViewType , setPageViewType ] = useState < string > ( ViewType . LOADING )
103106 const [ isCILoading , setCILoading ] = useState ( false )
104107 const [ isCDLoading , setCDLoading ] = useState ( false )
108+ const [ isBranchChangeLoading , setIsBranchChangeLoading ] = useState ( false ) ;
105109 const [ showPreDeployment , setShowPreDeployment ] = useState ( false )
106110 const [ showPostDeployment , setShowPostDeployment ] = useState ( false )
107111 const [ errorCode , setErrorCode ] = useState ( 0 )
@@ -110,6 +114,7 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
110114 const [ showApprovalModal , setShowApprovalModal ] = useState ( false )
111115 const [ showBulkCDModal , setShowBulkCDModal ] = useState ( false )
112116 const [ showBulkCIModal , setShowBulkCIModal ] = useState ( false )
117+ const [ showBulkSourceChangeModal , setShowBulkSourceChangeModal ] = useState ( false )
113118 const [ showWebhookModal , setShowWebhookModal ] = useState ( false )
114119 const [ isWebhookPayloadLoading , setWebhookPayloadLoading ] = useState ( false )
115120 const [ invalidateCache , setInvalidateCache ] = useState ( false )
@@ -176,6 +181,19 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
176181 } )
177182 }
178183
184+ const preserveSelection = ( _workflows : WorkflowType [ ] ) => {
185+ if ( ! workflows || ! _workflows ) {
186+ return
187+ }
188+ const workflowMap = new Map ( )
189+ workflows . forEach ( ( wf ) => {
190+ workflowMap . set ( wf . id , wf . isSelected )
191+ } )
192+ _workflows . forEach ( ( wf ) => {
193+ wf . isSelected = workflowMap . get ( wf . id )
194+ } )
195+ }
196+
179197 const getWorkflowsData = async ( ) : Promise < void > => {
180198 try {
181199 const { workflows : _workflows , filteredCIPipelines } = await getWorkflows ( envId , filteredAppIds )
@@ -194,6 +212,7 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
194212 } ) ,
195213 )
196214 }
215+ preserveSelection ( _workflows )
197216 setWorkflows ( _workflows )
198217 setFilteredCIPipelines ( filteredCIPipelines )
199218 setErrorCode ( 0 )
@@ -1032,6 +1051,41 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
10321051 setFilteredWorkflows ( _workflows )
10331052 }
10341053
1054+ const changeBranch = ( value ) : void => {
1055+ let appIds = [ ]
1056+ let appNameMap = new Map ( )
1057+ selectedAppList . map ( ( app ) => {
1058+ appIds . push ( app . id )
1059+ appNameMap . set ( app . id , app . name )
1060+ } )
1061+ setIsBranchChangeLoading ( true )
1062+ triggerBranchChange ( appIds , + envId , value )
1063+ . then ( ( response : any ) => {
1064+ console . log ( response )
1065+ const _responseList = [ ]
1066+ response . result . apps . map ( ( res ) => {
1067+ _responseList . push ( {
1068+ appId : res . appId ,
1069+ appName : appNameMap . get ( res . appId ) ,
1070+ statusText : res . status ,
1071+ status : GetBranchChangeStatus ( res . status ) ,
1072+ envId : + envId ,
1073+ message : res . message ,
1074+ } )
1075+ } )
1076+ updateResponseListData ( _responseList )
1077+ setCDLoading ( false )
1078+ setCILoading ( false )
1079+ preventBodyScroll ( false )
1080+ } )
1081+ . catch ( ( error ) => {
1082+ showError ( error )
1083+ } )
1084+ . finally ( ( ) => {
1085+ setIsBranchChangeLoading ( false )
1086+ } )
1087+ }
1088+
10351089 const selectMaterial = ( materialId , pipelineId ?: number ) : void => {
10361090 const _workflows = [ ...filteredWorkflows ] . map ( ( workflow ) => {
10371091 const nodes = workflow . nodes . map ( ( node ) => {
@@ -1295,8 +1349,19 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
12951349 } , 100 )
12961350 }
12971351
1298- const sortResponseList = ( a , b ) => {
1299- return responseListOrder [ a . status ] - responseListOrder [ b . status ]
1352+ const hideChangeSourceModal = ( ) => {
1353+ if ( responseList . length > 0 ) {
1354+ setPageViewType ( ViewType . LOADING )
1355+ inprogressStatusTimer && clearTimeout ( inprogressStatusTimer )
1356+ getWorkflowsData ( )
1357+ }
1358+ setIsBranchChangeLoading ( false )
1359+ setShowBulkSourceChangeModal ( false )
1360+ setResponseList ( [ ] )
1361+ }
1362+
1363+ const onShowChangeSourceModal = ( ) => {
1364+ setShowBulkSourceChangeModal ( true )
13001365 }
13011366
13021367 const updateBulkCDInputMaterial = ( cdMaterialResponse : Record < string , CDMaterialResponseType > ) : void => {
@@ -1380,7 +1445,7 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
13801445 setResponseList ( ( prevList ) => {
13811446 const resultMap = new Map ( _responseList . map ( ( data ) => [ data . appId , data ] ) )
13821447 const updatedArray = prevList ?. map ( ( prevItem ) => resultMap . get ( prevItem . appId ) || prevItem )
1383- return ( updatedArray ?. length > 0 ? updatedArray : _responseList ) . sort ( sortResponseList )
1448+ return ( updatedArray ?. length > 0 ? updatedArray : _responseList ) . sort ( ( a , b ) => sortCallback ( 'appName' , a , b ) )
13841449 } )
13851450 }
13861451
@@ -1862,6 +1927,22 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
18621927 )
18631928 }
18641929
1930+ const renderBulkSourchChange = ( ) : JSX . Element | null => {
1931+ if ( ! showBulkSourceChangeModal ) {
1932+ return null
1933+ }
1934+
1935+ return (
1936+ < BulkSourceChange
1937+ closePopup = { hideChangeSourceModal }
1938+ responseList = { responseList }
1939+ changeBranch = { changeBranch }
1940+ loading = { isBranchChangeLoading }
1941+ selectedAppCount = { selectedAppList . length }
1942+ />
1943+ )
1944+ }
1945+
18651946 const renderCDMaterial = ( ) : JSX . Element | null => {
18661947 if ( showCDModal ) {
18671948 let node : NodeAttr , _appID
@@ -2030,6 +2111,18 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
20302111 const _showPopupMenu = showPreDeployment || showPostDeployment
20312112 return (
20322113 < div className = "flex dc__min-width-fit-content" >
2114+ < button
2115+ className = "dc__edit_button h-36 lh-36"
2116+ type = "button"
2117+ style = { { marginRight : 'auto' } }
2118+ onClick = { onShowChangeSourceModal }
2119+ >
2120+ < span className = "flex dc__align-items-center" >
2121+ < Pencil className = "icon-dim-16 scb-5 mr-4" />
2122+ Change branch
2123+ </ span >
2124+ </ button >
2125+ < span className = "filter-divider" > </ span >
20332126 < button
20342127 className = "cta flex h-36 mr-12"
20352128 data-testid = "bulk-build-image-button"
@@ -2157,6 +2250,7 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
21572250 { renderBulkCDMaterial ( ) }
21582251 { renderBulkCIMaterial ( ) }
21592252 { renderApprovalMaterial ( ) }
2253+ { renderBulkSourchChange ( ) }
21602254 </ TriggerViewContext . Provider >
21612255 < div > </ div >
21622256 </ div >
0 commit comments