Skip to content

Commit 0ffe5d3

Browse files
committed
feat: common out render cd material from trigger view and env trigger view
1 parent daf2db3 commit 0ffe5d3

File tree

9 files changed

+102
-341
lines changed

9 files changed

+102
-341
lines changed

.eslintignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,6 @@ src/components/app/details/testViewer/TestRunList.tsx
103103
src/components/app/details/triggerView/EmptyStateCIMaterial.tsx
104104
src/components/app/details/triggerView/MaterialSource.tsx
105105
src/components/app/details/triggerView/__tests__/triggerview.test.tsx
106-
src/components/app/details/triggerView/cdMaterial.tsx
107-
src/components/app/details/triggerView/ciMaterial.tsx
108106
src/components/app/details/triggerView/ciWebhook.service.ts
109107
src/components/app/details/triggerView/config.ts
110108
src/components/app/details/triggerView/workflow.service.ts

src/components/ApplicationGroup/Details/TriggerView/EnvTriggerView.tsx

Lines changed: 11 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
import React, { useEffect, useRef, useState } from 'react'
17+
import React, { useEffect, useState } from 'react'
1818
import { Prompt, Route, Switch, useHistory, useLocation, useParams, useRouteMatch } from 'react-router-dom'
1919
import Tippy from '@tippyjs/react'
2020

@@ -29,7 +29,6 @@ import {
2929
DEFAULT_ROUTE_PROMPT_MESSAGE,
3030
DeploymentNodeType,
3131
ErrorScreenManager,
32-
handleAnalyticsEvent,
3332
PopupMenu,
3433
Progressing,
3534
ServerErrors,
@@ -43,7 +42,7 @@ import {
4342
} from '@devtron-labs/devtron-fe-common-lib'
4443

4544
import { BuildImageModal, BulkBuildImageModal } from '@Components/app/details/triggerView/BuildImageModal'
46-
import { BulkDeployModal, DeployImageModal } from '@Components/app/details/triggerView/DeployImageModal'
45+
import { BulkDeployModal } from '@Components/app/details/triggerView/DeployImageModal'
4746
import { shouldRenderWebhookAddImageModal } from '@Components/app/details/triggerView/TriggerView.utils'
4847
import { getExternalCIConfig } from '@Components/ciPipeline/Webhook/webhook.service'
4948

@@ -58,7 +57,7 @@ import { TRIGGER_VIEW_PARAMS } from '../../../app/details/triggerView/Constants'
5857
import { CIMaterialRouterProps, MATERIAL_TYPE } from '../../../app/details/triggerView/types'
5958
import { Workflow } from '../../../app/details/triggerView/workflow/Workflow'
6059
import { triggerBranchChange } from '../../../app/service'
61-
import { getCDPipelineURL, importComponentFromFELibrary, sortObjectArrayAlphabetically } from '../../../common'
60+
import { importComponentFromFELibrary, sortObjectArrayAlphabetically } from '../../../common'
6261
import { getModuleInfo } from '../../../v2/devtronStackManager/DevtronStackManager.service'
6362
import { getWorkflows, getWorkflowStatus } from '../../AppGroup.service'
6463
import {
@@ -70,16 +69,15 @@ import {
7069
import { processWorkflowStatuses } from '../../AppGroup.utils'
7170
import {
7271
BulkResponseStatus,
73-
ENV_TRIGGER_VIEW_GA_EVENTS,
7472
GetBranchChangeStatus,
7573
SKIPPED_RESOURCES_MESSAGE,
7674
SKIPPED_RESOURCES_STATUS_TEXT,
7775
} from '../../Constants'
7876
import BulkSourceChange from './BulkSourceChange'
79-
import { RenderCDMaterialContentProps } from './types'
80-
import { getSelectedNodeAndAppId, getSelectedNodeAndMeta } from './utils'
77+
import { getSelectedNodeAndAppId } from './utils'
8178

8279
import './EnvTriggerView.scss'
80+
import CDMaterial from '@Components/app/details/triggerView/CDMaterial'
8381

8482
const ApprovalMaterialModal = importComponentFromFELibrary('ApprovalMaterialModal')
8583
const processDeploymentWindowStateAppGroup = importComponentFromFELibrary(
@@ -529,86 +527,10 @@ const EnvTriggerView = ({ filteredAppIds, isVirtualEnv }: AppGroupDetailDefaultT
529527
)
530528
}
531529

532-
const renderCDMaterialContent = ({
533-
node,
534-
appId,
535-
workflowId,
536-
selectedAppName,
537-
doesWorkflowContainsWebhook,
538-
ciNodeId,
539-
}: RenderCDMaterialContentProps) => {
540-
const configurePluginURL = getCDPipelineURL(
541-
String(appId),
542-
workflowId,
543-
doesWorkflowContainsWebhook ? '0' : ciNodeId,
544-
doesWorkflowContainsWebhook,
545-
node?.id,
546-
true,
547-
)
548-
549-
const cdMaterialType = location.search.includes(TRIGGER_VIEW_PARAMS.CD_NODE)
550-
? MATERIAL_TYPE.inputMaterialList
551-
: MATERIAL_TYPE.rollbackMaterialList
552-
553-
return (
554-
<DeployImageModal
555-
appId={appId}
556-
envId={node?.environmentId}
557-
appName={selectedAppName}
558-
stageType={node.type as DeploymentNodeType}
559-
envName={node?.environmentName}
560-
pipelineId={+node.id}
561-
materialType={cdMaterialType}
562-
handleClose={revertToPreviousURL}
563-
handleSuccess={getWorkflowStatusData}
564-
deploymentAppType={node?.deploymentAppType}
565-
isVirtualEnvironment={isVirtualEnv}
566-
showPluginWarningBeforeTrigger={node?.showPluginWarning}
567-
consequence={node?.pluginBlockState}
568-
configurePluginURL={configurePluginURL}
569-
isTriggerBlockedDueToPlugin={node?.showPluginWarning && node?.isTriggerBlocked}
570-
triggerType={node?.triggerType}
571-
parentEnvironmentName={node?.parentEnvironmentName}
572-
/>
573-
)
574-
}
575-
576-
const renderCDMaterial = (): JSX.Element | null => {
577-
if (
578-
location.search.includes(TRIGGER_VIEW_PARAMS.CD_NODE) ||
579-
location.search.includes(TRIGGER_VIEW_PARAMS.ROLLBACK_NODE)
580-
) {
581-
const { node, appId, workflowId, appName, selectedCINode } = getSelectedNodeAndMeta(
582-
filteredWorkflows,
583-
location.search,
584-
)
585-
586-
if (!node?.id) {
587-
return null
588-
}
589-
590-
return renderCDMaterialContent({
591-
node,
592-
appId,
593-
selectedAppName: appName,
594-
workflowId,
595-
doesWorkflowContainsWebhook: selectedCINode?.type === WorkflowNodeType.WEBHOOK,
596-
ciNodeId: selectedCINode?.id,
597-
})
598-
}
599-
600-
return null
601-
}
602-
603530
const renderApprovalMaterial = () => {
604531
if (ApprovalMaterialModal && location.search.includes(TRIGGER_VIEW_PARAMS.APPROVAL_NODE)) {
605532
const { node, appId } = getSelectedNodeAndAppId(filteredWorkflows, location.search)
606533

607-
if (!node?.id || !appId) {
608-
showError('Invalid node id')
609-
return null
610-
}
611-
612534
return (
613535
<ApprovalMaterialModal
614536
isLoading={false}
@@ -617,7 +539,7 @@ const EnvTriggerView = ({ filteredAppIds, isVirtualEnv }: AppGroupDetailDefaultT
617539
stageType={DeploymentNodeType.CD}
618540
closeApprovalModal={closeApprovalModal}
619541
appId={appId}
620-
pipelineId={node.id}
542+
pipelineId={node?.id}
621543
getModuleInfo={getModuleInfo}
622544
ciPipelineId={node?.connectingCiPipelineId}
623545
history={history}
@@ -831,7 +753,11 @@ const EnvTriggerView = ({ filteredAppIds, isVirtualEnv }: AppGroupDetailDefaultT
831753
/>
832754
</Route>
833755
</Switch>
834-
{renderCDMaterial()}
756+
<CDMaterial
757+
workflows={filteredWorkflows}
758+
handleClose={revertToPreviousURL}
759+
handleSuccess={getWorkflowStatusData}
760+
/>
835761
{renderBulkCDMaterial()}
836762
{renderBulkCIMaterial()}
837763
{renderApprovalMaterial()}

src/components/ApplicationGroup/Details/TriggerView/types.ts

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
* limitations under the License.
1515
*/
1616

17-
import { CommonNodeAttr } from '@devtron-labs/devtron-fe-common-lib'
18-
1917
// Legacy components with no props so setting to any
2018
export interface BulkSourceChangeProps {
2119
closePopup: any
@@ -29,12 +27,3 @@ export interface SourceUpdateResponseModalProps {
2927
responseList: any
3028
isLoading: any
3129
}
32-
33-
export interface RenderCDMaterialContentProps {
34-
node: CommonNodeAttr
35-
appId: number
36-
selectedAppName: string
37-
workflowId: string
38-
doesWorkflowContainsWebhook: boolean
39-
ciNodeId: string
40-
}

src/components/ApplicationGroup/Details/TriggerView/utils.ts

Lines changed: 1 addition & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
import { CommonNodeAttr, DeploymentNodeType, WorkflowNodeType, WorkflowType } from '@devtron-labs/devtron-fe-common-lib'
17+
import { CommonNodeAttr, DeploymentNodeType, WorkflowType } from '@devtron-labs/devtron-fe-common-lib'
1818

1919
import { DeployImageContentProps } from '@Components/app/details/triggerView/DeployImageModal/types'
2020
import { getNodeIdAndTypeFromSearch } from '@Components/app/details/triggerView/TriggerView.utils'
@@ -56,45 +56,6 @@ export const getSelectedAppListForBulkStrategy = (
5656
return appList.filter(({ pipelineId }) => feasiblePipelineIds.has(pipelineId))
5757
}
5858

59-
export const getSelectedNodeAndMeta = (
60-
workflows: WorkflowType[],
61-
search: string,
62-
): { node: CommonNodeAttr; workflowId: string; appId: number; appName: string; selectedCINode: CommonNodeAttr } => {
63-
const { cdNodeId, nodeType } = getNodeIdAndTypeFromSearch(search)
64-
65-
const result = workflows.reduce(
66-
(acc, workflow) => {
67-
if (acc.node) return acc
68-
const foundNode = workflow.nodes.find((node) => cdNodeId === node.id && node.type === nodeType)
69-
70-
if (foundNode) {
71-
const selectedCINode = workflow.nodes.find(
72-
(node) => node.type === WorkflowNodeType.CI || node.type === WorkflowNodeType.WEBHOOK,
73-
)
74-
return {
75-
node: foundNode,
76-
workflowId: workflow.id,
77-
appId: workflow.appId,
78-
appName: workflow.name,
79-
selectedCINode,
80-
}
81-
}
82-
return acc
83-
},
84-
{ node: undefined, workflowId: undefined, appId: undefined, appName: undefined, selectedCINode: undefined },
85-
)
86-
87-
return (
88-
result || {
89-
node: undefined,
90-
workflowId: undefined,
91-
appId: undefined,
92-
appName: undefined,
93-
selectedCINode: undefined,
94-
}
95-
)
96-
}
97-
9859
export const getSelectedNodeAndAppId = (
9960
workflows: WorkflowType[],
10061
search: string,
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { useLocation } from 'react-router-dom'
2+
3+
import { CommonNodeAttr, DeploymentNodeType } from '@devtron-labs/devtron-fe-common-lib'
4+
5+
import { getCDPipelineURL } from '@Components/common'
6+
7+
import { TRIGGER_VIEW_PARAMS } from './Constants'
8+
import { DeployImageModal } from './DeployImageModal'
9+
import { getSelectedNodeFromWorkflows } from './TriggerView.utils'
10+
import { CDMaterialProps, MATERIAL_TYPE } from './types'
11+
12+
const CDMaterial = ({ workflows, handleClose, handleSuccess }: CDMaterialProps) => {
13+
const location = useLocation()
14+
15+
if (
16+
location.search.includes(TRIGGER_VIEW_PARAMS.CD_NODE) ||
17+
location.search.includes(TRIGGER_VIEW_PARAMS.ROLLBACK_NODE)
18+
) {
19+
const cdNode: CommonNodeAttr = getSelectedNodeFromWorkflows(workflows, location.search)
20+
21+
const materialType = location.search.includes(TRIGGER_VIEW_PARAMS.CD_NODE)
22+
? MATERIAL_TYPE.inputMaterialList
23+
: MATERIAL_TYPE.rollbackMaterialList
24+
25+
const selectedWorkflow = workflows.find((wf) => wf.nodes.some((node) => node.id === cdNode.id))
26+
const selectedCINode = selectedWorkflow?.nodes.find((node) => node.type === 'CI' || node.type === 'WEBHOOK')
27+
const doesWorkflowContainsWebhook = selectedCINode?.type === 'WEBHOOK'
28+
29+
const { appId } = selectedWorkflow
30+
31+
const configurePluginURL = getCDPipelineURL(
32+
String(appId),
33+
selectedWorkflow?.id || '0',
34+
doesWorkflowContainsWebhook ? '0' : selectedCINode?.id,
35+
doesWorkflowContainsWebhook,
36+
cdNode.id || '0',
37+
true,
38+
)
39+
40+
return (
41+
<DeployImageModal
42+
materialType={materialType}
43+
appId={+appId}
44+
envId={cdNode.environmentId}
45+
appName={selectedWorkflow.name}
46+
stageType={cdNode.type as DeploymentNodeType}
47+
envName={cdNode.environmentName}
48+
pipelineId={Number(cdNode.id)}
49+
handleClose={handleClose}
50+
handleSuccess={handleSuccess}
51+
deploymentAppType={cdNode.deploymentAppType}
52+
isVirtualEnvironment={cdNode.isVirtualEnvironment}
53+
showPluginWarningBeforeTrigger={cdNode.showPluginWarning}
54+
consequence={cdNode.pluginBlockState}
55+
configurePluginURL={configurePluginURL}
56+
isTriggerBlockedDueToPlugin={cdNode.showPluginWarning && cdNode.isTriggerBlocked}
57+
triggerType={cdNode.triggerType}
58+
parentEnvironmentName={cdNode.parentEnvironmentName}
59+
/>
60+
)
61+
}
62+
63+
return null
64+
}
65+
66+
export default CDMaterial

0 commit comments

Comments
 (0)