Skip to content

Commit 77f91e2

Browse files
authored
Issue#197 : Possible to add/edit ci build id. (#137)
1 parent 4136b59 commit 77f91e2

File tree

4 files changed

+71
-5
lines changed

4 files changed

+71
-5
lines changed

src/components/BuildList/index.tsx

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {
2323
useBuildDispatch,
2424
deleteBuild,
2525
selectBuild,
26+
modifyBuild,
2627
stopBuild,
2728
getBuildList,
2829
useProjectState,
@@ -31,9 +32,10 @@ import { BuildStatusChip } from "../BuildStatusChip";
3132
import { SkeletonList } from "../SkeletonList";
3233
import { formatDateTime } from "../../_helpers/format.helper";
3334
import { useSnackbar } from "notistack";
35+
import { TextValidator } from "react-material-ui-form-validator";
36+
import { Pagination } from "@material-ui/lab";
3437
import { Build } from "../../types";
3538
import { BaseModal } from "../BaseModal";
36-
import { Pagination } from "@material-ui/lab";
3739

3840
const useStyles = makeStyles((theme: Theme) =>
3941
createStyles({
@@ -60,8 +62,10 @@ const BuildList: FunctionComponent = () => {
6062
const { enqueueSnackbar } = useSnackbar();
6163
const { selectedProjectId } = useProjectState();
6264
const [deleteDialogOpen, setDeleteDialogOpen] = React.useState(false);
65+
const [editDialogOpen, setEditDialogOpen] = React.useState(false);
6366
const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);
6467
const [menuBuild, setMenuBuild] = React.useState<Build | null>();
68+
const [newCiBuildId, setNewCiBuildId] = React.useState("");
6569

6670
const handleMenuClick = (
6771
event: React.MouseEvent<HTMLElement>,
@@ -80,6 +84,10 @@ const BuildList: FunctionComponent = () => {
8084
setDeleteDialogOpen(!deleteDialogOpen);
8185
};
8286

87+
const toggleEditDialogOpen = () => {
88+
setEditDialogOpen(!editDialogOpen);
89+
};
90+
8391
React.useEffect(() => {
8492
if (!selectedBuild && buildList.length > 0) {
8593
selectBuild(buildDispatch, buildList[0].id);
@@ -204,9 +212,56 @@ const BuildList: FunctionComponent = () => {
204212
Stop
205213
</MenuItem>
206214
)}
215+
<MenuItem onClick={toggleEditDialogOpen}>Edit CI Build</MenuItem>
207216
<MenuItem onClick={toggleDeleteDialogOpen}>Delete</MenuItem>
208217
</Menu>
209218
)}
219+
{menuBuild && (
220+
<BaseModal
221+
open={editDialogOpen}
222+
title={"Edit CI Build ID"}
223+
submitButtonText={"Edit"}
224+
onCancel={toggleEditDialogOpen}
225+
content={
226+
<React.Fragment>
227+
<Typography>{`Edit the ci build id for build: #${
228+
menuBuild.number || menuBuild.id
229+
}`}</Typography>
230+
<TextValidator
231+
name="newCiBuildId"
232+
validators={["minStringLength:2"]}
233+
errorMessages={["Enter at least two characters."]}
234+
margin="dense"
235+
id="name"
236+
label="New CI Build Id"
237+
type="text"
238+
fullWidth
239+
required
240+
value={newCiBuildId}
241+
inputProps={{
242+
onChange: (event: any) =>
243+
setNewCiBuildId((event.target as HTMLInputElement).value),
244+
"data-testid": "newCiBuildId",
245+
}}
246+
/>
247+
</React.Fragment>
248+
}
249+
onSubmit={() => {
250+
modifyBuild(buildDispatch, menuBuild.id, {
251+
ciBuildId: newCiBuildId,
252+
})
253+
.then((b) => {
254+
toggleEditDialogOpen();
255+
})
256+
.catch((err) =>
257+
enqueueSnackbar(err, {
258+
variant: "error",
259+
})
260+
);
261+
handleMenuClose();
262+
}}
263+
/>
264+
)}
210265
{menuBuild && (
211266
<BaseModal
212267
open={deleteDialogOpen}

src/contexts/build.context.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,12 +174,16 @@ async function deleteBuild(dispatch: Dispatch, id: string) {
174174
}
175175

176176
async function stopBuild(dispatch: Dispatch, id: string) {
177-
return buildsService.stop(id).then((build) => {
177+
return buildsService.update(id, { "isRunning": false }).then((build) => {
178178
dispatch({ type: "update", payload: build });
179179
return build;
180180
});
181181
}
182182

183+
async function modifyBuild(dispatch: Dispatch, id: string, body: object) {
184+
return buildsService.update(id, body);
185+
}
186+
183187
async function selectBuild(dispatch: Dispatch, id: string | null) {
184188
if (id === null) {
185189
dispatch({ type: "select", payload: null });
@@ -207,5 +211,6 @@ export {
207211
selectBuild,
208212
addBuild,
209213
updateBuild,
214+
modifyBuild,
210215
stopBuild,
211216
};

src/services/builds.service.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Build, PaginatedData } from "../types";
22
import { handleResponse, authHeader } from "../_helpers/service.helpers";
33
import { API_URL } from "../_config/env.config";
4+
import {BuildDto} from "../types/dto/build.dto";
45

56
const ENDPOINT_URL = "/builds";
67

@@ -42,10 +43,11 @@ async function remove(id: string): Promise<Build> {
4243
);
4344
}
4445

45-
async function stop(id: string): Promise<Build> {
46+
async function update(id: string, body: BuildDto): Promise<Build> {
4647
const requestOptions = {
4748
method: "PATCH",
48-
headers: authHeader(),
49+
headers: { "Content-Type": "application/json", ...authHeader() },
50+
body: JSON.stringify(body)
4951
};
5052

5153
return fetch(`${API_URL}${ENDPOINT_URL}/${id}`, requestOptions).then(
@@ -70,5 +72,5 @@ export const buildsService = {
7072
getList,
7173
approve,
7274
remove,
73-
stop,
75+
update,
7476
};

src/types/dto/build.dto.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export interface BuildDto {
2+
ciBuildId?: string;
3+
isRunning?: boolean;
4+
}

0 commit comments

Comments
 (0)