Skip to content

Commit 841b7d4

Browse files
Merge branch 'main' into app_env_filter
2 parents 7c8a076 + ce4b488 commit 841b7d4

File tree

12 files changed

+486
-131
lines changed

12 files changed

+486
-131
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"private": true,
55
"homepage": "/dashboard",
66
"dependencies": {
7-
"@devtron-labs/devtron-fe-common-lib": "0.0.29",
7+
"@devtron-labs/devtron-fe-common-lib": "0.0.30",
88
"@sentry/browser": "^7.3.1",
99
"@sentry/integrations": "^7.3.1",
1010
"@sentry/tracing": "^7.3.1",

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

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,11 @@ export default function BulkCDTrigger({
5656
const [currentAppReleaseTags, setCurrentAppReleaseTags] = useState<string[]>(selectedApp.appReleaseTags)
5757
const [currentAppTagsEditable, setCurrentAppTagsEditable] = useState<boolean>(selectedApp.tagsEditable)
5858
const [hideImageTaggingHardDelete, setHideImageTaggingHardDelete] = useState<boolean>(false)
59+
const [appSearchTextMap, setAppSearchTextMap] = useState<Record<number, string>>({})
5960
const location = useLocation()
6061
const history = useHistory()
6162
const match = useRouteMatch()
63+
6264
const setCurrentAppReleaseTagsWrapper = (appReleaseTags: string[]) => {
6365
setCurrentAppReleaseTags(appReleaseTags)
6466
}
@@ -147,7 +149,7 @@ export default function BulkCDTrigger({
147149
}
148150
}
149151
})
150-
setCurrentAppTagsEditable(_cdMaterialResponse[selectedApp.appId].tagsEditable ?? false)
152+
setCurrentAppTagsEditable(_cdMaterialResponse[selectedApp.appId].tagsEditable ?? false)
151153
setCurrentAppReleaseTags(_cdMaterialResponse[selectedApp.appId].appReleaseTagNames ?? [])
152154
setHideImageTaggingHardDelete(_cdMaterialResponse[selectedApp.appId].hideImageTaggingHardDelete ?? false)
153155
updateBulkInputMaterial(_cdMaterialResponse)
@@ -301,6 +303,42 @@ export default function BulkCDTrigger({
301303
},
302304
}
303305

306+
const handleMaterialFilters = (
307+
searchText: string,
308+
cdNodeId,
309+
nodeType: DeploymentNodeType,
310+
isApprovalNode: boolean = false,
311+
): void => {
312+
setLoading(true)
313+
abortControllerRef.current = new AbortController()
314+
const _cdMaterialResponse: Record<string, CDMaterialResponseType> = {}
315+
getCDMaterialList(cdNodeId, nodeType, abortControllerRef.current.signal, isApprovalNode, searchText)
316+
.then((response) => {
317+
if (response) {
318+
_cdMaterialResponse[selectedApp.appId] = {
319+
approvalUsers: response.approvalUsers,
320+
materials: response.materials,
321+
userApprovalConfig: response.userApprovalConfig,
322+
requestedUserId: response.requestedUserId,
323+
tagsEditable: response.tagsEditable,
324+
appReleaseTagNames: response.appReleaseTagNames,
325+
hideImageTaggingHardDelete: response.hideImageTaggingHardDelete,
326+
}
327+
setCurrentAppTagsEditable(response.tagsEditable ?? false)
328+
setCurrentAppReleaseTags(response.appReleaseTagNames ?? [])
329+
setHideImageTaggingHardDelete(response.hideImageTaggingHardDelete ?? false)
330+
updateBulkInputMaterial(_cdMaterialResponse)
331+
const _appSearchTextMap={...appSearchTextMap}
332+
_appSearchTextMap[selectedApp.appId]=searchText
333+
setAppSearchTextMap(_appSearchTextMap)
334+
}
335+
setLoading(false)
336+
})
337+
.catch((error) => {
338+
showError(error)
339+
})
340+
}
341+
304342
return (
305343
<div className="bulk-ci-trigger">
306344
<div className="sidebar bcn-0 dc__height-inherit dc__overflow-auto">
@@ -397,6 +435,8 @@ export default function BulkCDTrigger({
397435
location={location}
398436
match={match}
399437
isApplicationGroupTrigger={true}
438+
handleMaterialFilters={handleMaterialFilters}
439+
searchImageTag={appSearchTextMap[selectedApp.appId]}
400440
/>
401441
)}
402442
</div>

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

Lines changed: 58 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ import BulkCDTrigger from './BulkCDTrigger'
7373
import BulkCITrigger from './BulkCITrigger'
7474
import {
7575
AppGroupDetailDefaultType,
76-
BulkCDDetailType, BulkCDDetailTypeResponse,
76+
BulkCDDetailType,
77+
BulkCDDetailTypeResponse,
7778
BulkCIDetailType,
7879
ProcessWorkFlowStatusType,
7980
ResponseRowType,
@@ -139,10 +140,11 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
139140
const abortControllerRef = useRef(new AbortController())
140141
const [appReleaseTags, setAppReleaseTags] = useState<string[]>([])
141142
const [tagsEditableVal, setTagsEditable] = useState<boolean>(false)
142-
const [hideImageTaggingHardDelete,setHideImageTaggingHardDelete] = useState<boolean>(false)
143+
const [hideImageTaggingHardDelete, setHideImageTaggingHardDelete] = useState<boolean>(false)
143144
const { queryParams } = useSearchString()
144145
const [isConfigPresent, setConfigPresent] = useState<boolean>(false)
145146
const [isDefaultConfigPresent, setDefaultConfig] = useState<boolean>(false)
147+
const [searchImageTag, setSearchImageTag] = useState<string>('')
146148

147149
const setAppReleaseTagsNames = (appReleaseTags: string[]) => {
148150
setAppReleaseTags(appReleaseTags)
@@ -164,7 +166,7 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
164166
}, [filteredAppIds])
165167

166168
useEffect(() => {
167-
if(location.search.includes('approval-node') && filteredWorkflows?.length) {
169+
if (location.search.includes('approval-node') && filteredWorkflows?.length) {
168170
setShowBulkCDModal(false)
169171
setShowApprovalModal(true)
170172
onClickCDMaterial(queryParams.get('approval-node'), DeploymentNodeType.CD, true)
@@ -173,13 +175,12 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
173175
}, [location.search])
174176

175177
const getConfigs = () => {
176-
getDefaultConfig()
177-
.then((response) => {
178-
let isConfigPresent = response.result.isConfigured
179-
let _isDefaultConfig = response.result.is_default_configured
180-
setDefaultConfig(_isDefaultConfig)
181-
setConfigPresent(isConfigPresent)
182-
})
178+
getDefaultConfig().then((response) => {
179+
let isConfigPresent = response.result.isConfigured
180+
let _isDefaultConfig = response.result.is_default_configured
181+
setDefaultConfig(_isDefaultConfig)
182+
setConfigPresent(isConfigPresent)
183+
})
183184
}
184185

185186
const preserveSelection = (_workflows: WorkflowType[]) => {
@@ -314,7 +315,7 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
314315
preNodeAvailable: false,
315316
postNodeAvailable: false,
316317
appReleaseTags: wf.appReleaseTags,
317-
tagsEditable: wf.tagsEditable
318+
tagsEditable: wf.tagsEditable,
318319
}
319320
for (const node of wf.nodes) {
320321
if (node.environmentId === +envId && node.type === WorkflowNodeType.CD) {
@@ -756,7 +757,12 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
756757
})
757758
}
758759

759-
const onClickCDMaterial = (cdNodeId, nodeType: DeploymentNodeType, isApprovalNode?: boolean) => {
760+
const onClickCDMaterial = (
761+
cdNodeId,
762+
nodeType: DeploymentNodeType,
763+
isApprovalNode: boolean = false,
764+
searchText?: string,
765+
): void => {
760766
ReactGA.event(
761767
isApprovalNode ? ENV_TRIGGER_VIEW_GA_EVENTS.ApprovalNodeClicked : ENV_TRIGGER_VIEW_GA_EVENTS.ImageClicked,
762768
)
@@ -770,6 +776,7 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
770776
isApprovalNode ? DeploymentNodeType.APPROVAL : nodeType,
771777
abortControllerRef.current.signal,
772778
isApprovalNode,
779+
searchText,
773780
)
774781
.then((data) => {
775782
let _selectedNode
@@ -922,6 +929,7 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
922929
setErrorCode(response.code)
923930
preventBodyScroll(false)
924931
getWorkflowStatusData(workflows)
932+
setSearchImageTag('')
925933
}
926934
})
927935
.catch((errors: ServerErrors) => {
@@ -1064,7 +1072,6 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
10641072
setIsBranchChangeLoading(true)
10651073
triggerBranchChange(appIds, +envId, value)
10661074
.then((response: any) => {
1067-
console.log(response)
10681075
const _responseList = []
10691076
response.result.apps.map((res) => {
10701077
_responseList.push({
@@ -1118,7 +1125,10 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
11181125
const nodes = workflow.nodes.map((node) => {
11191126
if (
11201127
(selectedCDDetail && selectedCDDetail.id === +node.id && selectedCDDetail.type === node.type) ||
1121-
(!showBulkCDModal && selectedCDNode && selectedCDNode.id == +node.id && node.type === selectedCDNode.type)
1128+
(!showBulkCDModal &&
1129+
selectedCDNode &&
1130+
selectedCDNode.id == +node.id &&
1131+
node.type === selectedCDNode.type)
11221132
) {
11231133
const artifacts = node[materialType].map((artifact, i) => {
11241134
return {
@@ -1275,13 +1285,14 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
12751285
preventBodyScroll(false)
12761286
setCDLoading(false)
12771287
setShowCDModal(false)
1288+
setSearchImageTag('')
12781289
}
12791290

12801291
const closeApprovalModal = (e): void => {
12811292
preventBodyScroll(false)
12821293
setShowApprovalModal(false)
12831294
history.push({
1284-
search: ''
1295+
search: '',
12851296
})
12861297
}
12871298

@@ -1369,7 +1380,7 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
13691380

13701381
const updateBulkCDInputMaterial = (cdMaterialResponse: Record<string, CDMaterialResponseType>): void => {
13711382
const _workflows = filteredWorkflows.map((wf) => {
1372-
if (wf.isSelected) {
1383+
if (wf.isSelected && cdMaterialResponse[wf.appId]) {
13731384
const _appId = wf.appId
13741385
const _cdNode = wf.nodes.find(
13751386
(node) => node.type === WorkflowNodeType.CD && node.environmentId === +envId,
@@ -1431,7 +1442,7 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
14311442
nodeList.forEach((node, index) => {
14321443
let ciArtifact = null
14331444
node[materialType].forEach((artifact) => {
1434-
if(artifact.isSelected == true)ciArtifact = artifact
1445+
if (artifact.isSelected == true) ciArtifact = artifact
14351446
})
14361447
if (ciArtifact) {
14371448
_CDTriggerPromiseList.push(
@@ -1618,12 +1629,11 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
16181629
filteredWorkflows.forEach((wf) => {
16191630
if (wf.isSelected) {
16201631
//extract unique tags for this workflow
1621-
wf.appReleaseTags?.forEach((tag)=>{
1622-
if(!uniqueTagsSet.has(tag)){
1632+
wf.appReleaseTags?.forEach((tag) => {
1633+
if (!uniqueTagsSet.has(tag)) {
16231634
uniqueReleaseTags.push(tag)
16241635
}
16251636
uniqueTagsSet.add(tag)
1626-
16271637
})
16281638
const _cdNode = wf.nodes.find(
16291639
(node) => node.type === WorkflowNodeType.CD && node.environmentId === +envId,
@@ -1656,7 +1666,7 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
16561666
appReleaseTags: wf.appReleaseTags,
16571667
tagsEditable: wf.tagsEditable,
16581668
ciPipelineId: _selectedNode.connectingCiPipelineId,
1659-
hideImageTaggingHardDelete: wf.hideImageTaggingHardDelete
1669+
hideImageTaggingHardDelete: wf.hideImageTaggingHardDelete,
16601670
})
16611671
} else {
16621672
let warningMessage = ''
@@ -1680,7 +1690,7 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
16801690
_selectedAppWorkflowList.sort((a, b) => sortCallback('name', a, b))
16811691
return {
16821692
bulkCDDetailType: _selectedAppWorkflowList,
1683-
uniqueReleaseTags: uniqueReleaseTags
1693+
uniqueReleaseTags: uniqueReleaseTags,
16841694
}
16851695
}
16861696

@@ -1932,6 +1942,17 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
19321942
)
19331943
}
19341944

1945+
1946+
const handleMaterialFilters = (
1947+
searchText: string,
1948+
cdNodeId,
1949+
nodeType: DeploymentNodeType,
1950+
isApprovalNode: boolean = false,
1951+
) => {
1952+
onClickCDMaterial(cdNodeId, nodeType, isApprovalNode, searchText)
1953+
setSearchImageTag(searchText)
1954+
}
1955+
19351956
const renderBulkSourchChange = (): JSX.Element | null => {
19361957
if (!showBulkSourceChangeModal) {
19371958
return null
@@ -1963,6 +1984,7 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
19631984
}
19641985
}
19651986
const material = node?.[materialType] || []
1987+
19661988
return (
19671989
<VisibleModal className="" parentClassName="dc__overflow-hidden" close={closeCDModal}>
19681990
<div
@@ -2004,16 +2026,18 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
20042026
userApprovalConfig={node?.userApprovalConfig}
20052027
requestedUserId={node?.requestedUserId}
20062028
isVirtualEnvironment={isVirtualEnv}
2007-
ciPipelineId = {node?.connectingCiPipelineId}
2008-
appReleaseTagNames = {appReleaseTags}
2009-
setAppReleaseTagNames = {setAppReleaseTagsNames}
2010-
tagsEditable = {tagsEditableVal}
2011-
setTagsEditable = {setTagsEditableVal}
2012-
hideImageTaggingHardDelete = {hideImageTaggingHardDelete}
2029+
ciPipelineId={node?.connectingCiPipelineId}
2030+
appReleaseTagNames={appReleaseTags}
2031+
setAppReleaseTagNames={setAppReleaseTagsNames}
2032+
tagsEditable={tagsEditableVal}
2033+
setTagsEditable={setTagsEditableVal}
2034+
hideImageTaggingHardDelete={hideImageTaggingHardDelete}
20132035
history={history}
20142036
location={location}
20152037
match={match}
20162038
isApplicationGroupTrigger={true}
2039+
handleMaterialFilters={handleMaterialFilters}
2040+
searchImageTag={searchImageTag}
20172041
/>
20182042
)}
20192043
</div>
@@ -2053,12 +2077,12 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
20532077
onClickCDMaterial={onClickCDMaterial}
20542078
getModuleInfo={getModuleInfo}
20552079
GitCommitInfoGeneric={GitCommitInfoGeneric}
2056-
ciPipelineId = {node?.connectingCiPipelineId}
2057-
appReleaseTagNames = {appReleaseTags}
2058-
setAppReleaseTagNames = {setAppReleaseTagsNames}
2059-
tagsEditable = {tagsEditableVal}
2060-
setTagsEditable = {setTagsEditableVal}
2061-
hideImageTaggingHardDelete = {hideImageTaggingHardDelete}
2080+
ciPipelineId={node?.connectingCiPipelineId}
2081+
appReleaseTagNames={appReleaseTags}
2082+
setAppReleaseTagNames={setAppReleaseTagsNames}
2083+
tagsEditable={tagsEditableVal}
2084+
setTagsEditable={setTagsEditableVal}
2085+
hideImageTaggingHardDelete={hideImageTaggingHardDelete}
20622086
configs={isConfigPresent}
20632087
isDefaultConfigPresent={isDefaultConfigPresent}
20642088
/>

src/components/ClusterNodes/ClusterSelectionList.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ export default function ClusterSelectionList({
145145
/>
146146
</div>
147147
<div>
148-
{clusterData.errorInNodeListing ? (
148+
{errorCount > 0 ? (
149149
<Tippy className="default-tt w-200" arrow={false} content={clusterData.errorInNodeListing}>
150150
<div className="flexbox">
151151
<Error className="mt-2 mb-2 mr-8 icon-dim-18" />

src/components/app/details/triggerView/Constants.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,5 @@ export const EMPTY_STATE = {
100100
title: 'No matching results',
101101
subtitle: 'We couldn’t find any matching images'
102102
}
103+
104+
export const EXCLUDED_IMAGE_TOOLTIP = "This image is excluded for new deployment as it does not match the filter conditions configured for this environment."

0 commit comments

Comments
 (0)