Skip to content

Commit 439344b

Browse files
committed
requires name for clone release pipeline
adds modal
1 parent d6c5d42 commit 439344b

4 files changed

Lines changed: 99 additions & 41 deletions

File tree

frontend/common/services/useReleasePipelines.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ export const releasePipelinesService = service
2626
>({
2727
invalidatesTags: [{ id: 'LIST', type: 'ReleasePipelines' }],
2828
query: (query: Req['cloneReleasePipeline']) => ({
29+
body: {
30+
name: query.name,
31+
},
2932
method: 'POST',
3033
url: `projects/${query.projectId}/release-pipelines/${query.pipelineId}/clone/`,
3134
}),

frontend/common/types/requests.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,7 @@ export type Req = {
744744
cloneReleasePipeline: {
745745
projectId: number
746746
pipelineId: number
747+
name: string
747748
}
748749
// END OF TYPES
749750
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import { useEffect, useState } from 'react'
2+
import { useCloneReleasePipelineMutation } from 'common/services/useReleasePipelines'
3+
import Utils from 'common/utils/utils'
4+
import Button from 'components/base/forms/Button'
5+
import InputGroup from 'components/base/forms/InputGroup'
6+
7+
type CloneReleasePipelineModalProps = {
8+
projectId: number
9+
pipelineId: number
10+
}
11+
12+
const CloneReleasePipelineModal = ({
13+
pipelineId,
14+
projectId,
15+
}: CloneReleasePipelineModalProps) => {
16+
const [name, setName] = useState<string>('')
17+
18+
const [
19+
cloneReleasePipeline,
20+
{
21+
error: cloneReleasePipelineError,
22+
isError: isCloningError,
23+
isLoading: isCloning,
24+
isSuccess: isCloningSuccess,
25+
},
26+
] = useCloneReleasePipelineMutation()
27+
28+
useEffect(() => {
29+
if (isCloningSuccess) {
30+
closeModal2()
31+
toast('Release pipeline cloned successfully')
32+
return
33+
}
34+
35+
if (isCloningError) {
36+
toast(
37+
cloneReleasePipelineError?.data?.detail ??
38+
'Error cloning release pipeline',
39+
'danger',
40+
)
41+
return
42+
}
43+
}, [isCloningSuccess, isCloningError, cloneReleasePipelineError])
44+
45+
return (
46+
<div className='p-4'>
47+
{/* <p>Add a name for the cloned release pipeline.</p> */}
48+
<InputGroup
49+
title='New Release Pipeline Name'
50+
inputProps={{
51+
className: 'full-width',
52+
error: !name,
53+
name: 'name',
54+
}}
55+
value={name}
56+
onChange={(event: React.ChangeEvent<HTMLInputElement>) => {
57+
setName(Utils.safeParseEventValue(event))
58+
}}
59+
isValid={name && name.length}
60+
type='text'
61+
name='name'
62+
id='name'
63+
placeholder='E.g. Beta Release'
64+
/>
65+
<div className='text-right mt-4'>
66+
<Button
67+
theme='secondary'
68+
className='mr-2'
69+
onClick={() => closeModal2()}
70+
>
71+
Cancel
72+
</Button>
73+
<Button
74+
onClick={() => cloneReleasePipeline({ name, pipelineId, projectId })}
75+
disabled={isCloning || !name}
76+
>
77+
Clone
78+
</Button>
79+
</div>
80+
</div>
81+
)
82+
}
83+
84+
export type { CloneReleasePipelineModalProps }
85+
export default CloneReleasePipelineModal

frontend/web/components/release-pipelines/ReleasePipelinesList.tsx

Lines changed: 10 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import {
2-
useCloneReleasePipelineMutation,
32
useDeleteReleasePipelineMutation,
43
usePublishReleasePipelineMutation,
54
} from 'common/services/useReleasePipelines'
@@ -11,6 +10,7 @@ import DropdownMenu from 'components/base/DropdownMenu'
1110
import PanelSearch from 'components/PanelSearch'
1211
import Tag from 'components/tags/Tag'
1312
import { useEffect } from 'react'
13+
import CloneReleasePipelineModal from './CloneReleasePipelineModal'
1414

1515
const NoReleasePipelines = ({ projectId }: { projectId: string }) => {
1616
const history = useHistory()
@@ -76,16 +76,6 @@ const ReleasePipelinesList = ({
7676
},
7777
] = useDeleteReleasePipelineMutation()
7878

79-
const [
80-
cloneReleasePipeline,
81-
{
82-
error: cloneReleasePipelineError,
83-
isError: isCloningError,
84-
isLoading: isCloning,
85-
isSuccess: isCloningSuccess,
86-
},
87-
] = useCloneReleasePipelineMutation()
88-
8979
const [
9080
publishReleasePipeline,
9181
{
@@ -102,23 +92,14 @@ const ReleasePipelinesList = ({
10292
return toast('Release pipeline published successfully')
10393
}
10494

105-
if (isCloningSuccess) {
106-
return toast('Release pipeline cloned successfully')
107-
}
108-
10995
if (isPublishingError) {
11096
return toast(
11197
publishReleasePipelineError?.data?.detail ??
11298
'Something went wrong while publishing the release pipeline',
11399
'danger',
114100
)
115101
}
116-
}, [
117-
isPublishingSuccess,
118-
isPublishingError,
119-
publishReleasePipelineError,
120-
isCloningSuccess,
121-
])
102+
}, [isPublishingSuccess, isPublishingError, publishReleasePipelineError])
122103

123104
useEffect(() => {
124105
if (isDeletingSuccess) {
@@ -132,21 +113,7 @@ const ReleasePipelinesList = ({
132113
'danger',
133114
)
134115
}
135-
136-
if (isCloningError) {
137-
return toast(
138-
cloneReleasePipelineError?.data?.detail ??
139-
'Something went wrong while cloning the release pipeline',
140-
'danger',
141-
)
142-
}
143-
}, [
144-
isDeletingSuccess,
145-
isDeletingError,
146-
deleteReleasePipelineError,
147-
isCloningError,
148-
cloneReleasePipelineError,
149-
])
116+
}, [isDeletingSuccess, isDeletingError, deleteReleasePipelineError])
150117

151118
if (isLoading) {
152119
return (
@@ -235,14 +202,16 @@ const ReleasePipelinesList = ({
235202
tooltip: getTooltip('edit'),
236203
},
237204
{
238-
disabled: isCloning,
239205
icon: 'copy' as IconName,
240206
label: 'Clone',
241207
onClick: () =>
242-
cloneReleasePipeline({
243-
pipelineId: id,
244-
projectId: Number(projectId),
245-
}),
208+
openModal2(
209+
'Clone Release Pipeline',
210+
<CloneReleasePipelineModal
211+
pipelineId={id}
212+
projectId={Number(projectId)}
213+
/>,
214+
),
246215
},
247216
...(!isPublished
248217
? [

0 commit comments

Comments
 (0)