317 lines
8.0 KiB
React
317 lines
8.0 KiB
React
import React, { useEffect } from "react";
|
|
|
|
import Paper from "@material-ui/core/Paper";
|
|
import Grid from "@material-ui/core/Grid";
|
|
import ButtonBase from "@material-ui/core/ButtonBase";
|
|
import Button from "@material-ui/core/Button";
|
|
import List from "@material-ui/core/List";
|
|
import ListItem from "@material-ui/core/ListItem";
|
|
import TextField from "@material-ui/core/TextField";
|
|
import Select from "@material-ui/core/Select";
|
|
import MenuItem from "@material-ui/core/MenuItem";
|
|
|
|
import Dialog from "@material-ui/core/Dialog";
|
|
import DialogTitle from "@material-ui/core/DialogTitle";
|
|
import DialogActions from "@material-ui/core/DialogActions";
|
|
import DialogContent from "@material-ui/core/DialogContent";
|
|
|
|
import WebhookImage from "../assets/img/webhook.png";
|
|
import KafkaImage from "../assets/img/kafka.png";
|
|
|
|
const Webhooks = (props) => {
|
|
const { globalUrl, isLoaded } = props;
|
|
const validtypes = ["webhook"];
|
|
|
|
//const [hooks, setSchedules] = React.useState(hookdata);
|
|
const [hooks, setHooks] = React.useState([]);
|
|
const [modalOpen, setModalOpen] = React.useState(false);
|
|
const [newHookName, setNewHookName] = React.useState("");
|
|
const [newHookDescription, setNewHookDescription] = React.useState("");
|
|
const [newHookType, setNewHookType] = React.useState("");
|
|
const [firstrequest, setFirstrequest] = React.useState(true);
|
|
const [, setModalError] = React.useState("");
|
|
|
|
useEffect(() => {
|
|
if (firstrequest) {
|
|
setFirstrequest(false);
|
|
getAvailableHooks();
|
|
}
|
|
});
|
|
|
|
const newHook = () => {
|
|
if (newHookName.length === 0) {
|
|
setModalError("Missing name in modal");
|
|
return;
|
|
}
|
|
|
|
if (!validtypes.includes(newHookType)) {
|
|
setModalError(
|
|
newHookType + " is not a valid type. Try this: " + validtypes
|
|
);
|
|
}
|
|
|
|
fetch(globalUrl + "/api/v1/hooks/new", {
|
|
method: "POST",
|
|
headers: { "content-type": "application/json" },
|
|
body: JSON.stringify({
|
|
name: newHookName,
|
|
description: newHookDescription,
|
|
type: newHookType,
|
|
}),
|
|
credentials: "include",
|
|
})
|
|
.then((response) => response.json())
|
|
.then((responseJson) => {
|
|
console.log(responseJson);
|
|
setHooks([]);
|
|
})
|
|
.catch((error) => {
|
|
console.log(error);
|
|
});
|
|
};
|
|
|
|
const getAvailableHooks = () => {
|
|
fetch(globalUrl + "/api/v1/hooks", {
|
|
method: "GET",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
Accept: "application/json",
|
|
},
|
|
credentials: "include",
|
|
})
|
|
.then((response) => response.json())
|
|
.then((responseJson) => {
|
|
setHooks(responseJson);
|
|
})
|
|
.catch((error) => {
|
|
console.log(error);
|
|
// window.location.pathname = "/"
|
|
});
|
|
};
|
|
|
|
const deleteHook = (id) => {
|
|
if (id === undefined) {
|
|
return;
|
|
}
|
|
|
|
fetch(globalUrl + "/api/v1/hooks/" + id + "/delete", {
|
|
method: "DELETE",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
Accept: "application/json",
|
|
},
|
|
credentials: "include",
|
|
})
|
|
.then((response) => response.json())
|
|
.then((responseJson) => {
|
|
setHooks([]);
|
|
})
|
|
.catch((error) => {
|
|
console.log(error);
|
|
});
|
|
};
|
|
|
|
const bodyDivStyle = {
|
|
marginLeft: "20px",
|
|
marginRight: "20px",
|
|
width: "1350px",
|
|
minWidth: "1350px",
|
|
maxWidth: "1350px",
|
|
};
|
|
|
|
const hookApp = (app) => {
|
|
// Might be more options, but should be webhook or MQ
|
|
const appPicture =
|
|
app.type === "webhook" ? (
|
|
<img src={WebhookImage} alt="webhook" width="100px" height="100px" />
|
|
) : (
|
|
<img src={KafkaImage} alt="MQ" width="100px" height="100px" />
|
|
);
|
|
|
|
return (
|
|
<Grid container spacing={2} style={{ margin: "10px 10px 10px 10px" }}>
|
|
<Grid item style={{ marginRight: "10px" }}>
|
|
<ButtonBase>{appPicture}</ButtonBase>
|
|
</Grid>
|
|
{splitter}
|
|
<Grid item xs={12} sm container style={{ marginLeft: "10px" }}>
|
|
<Grid item xs container direction="column" spacing={2}>
|
|
<Grid item xs>
|
|
<div>
|
|
<h2>{app.info.name}</h2>
|
|
</div>
|
|
<div>Desc: {app.info.description}</div>
|
|
<div>Status: {app.status}</div>
|
|
</Grid>
|
|
<Grid item>{app.action}</Grid>
|
|
</Grid>
|
|
</Grid>
|
|
</Grid>
|
|
);
|
|
};
|
|
|
|
const splitter = (
|
|
<div
|
|
style={{
|
|
width: "1px",
|
|
backgroundColor: "grey",
|
|
margin: "5px 5px 5px 5px",
|
|
}}
|
|
/>
|
|
);
|
|
|
|
const hrefStyle = {
|
|
color: "#385f71",
|
|
textDecoration: "none",
|
|
};
|
|
|
|
// FIXME - add Schedule modal
|
|
const hookPaper = (hook) => {
|
|
return (
|
|
<div>
|
|
<Paper
|
|
style={{
|
|
maxWidth: "500px",
|
|
display: "flex",
|
|
padding: "10px 10px 10px 10px",
|
|
marginTop: "10px",
|
|
}}
|
|
>
|
|
<div style={{ flex: "5" }}>{hookApp(hook)}</div>
|
|
{splitter}
|
|
<div style={{ flex: "1" }}>
|
|
<List style={{ backgroundColor: "#ffffff" }}>
|
|
<ListItem style={{ flex: "1", textAlign: "center" }}>
|
|
<a href={"/webhooks/" + hook.id} style={hrefStyle}>
|
|
<Button disabled={false} color="primary">
|
|
Edit
|
|
</Button>
|
|
</a>
|
|
</ListItem>
|
|
<ListItem style={{ flex: "1", textAlign: "center" }}>
|
|
<Button
|
|
disabled={false}
|
|
onClick={() => {
|
|
deleteHook(hook.id);
|
|
}}
|
|
color="primary"
|
|
>
|
|
Delete
|
|
</Button>
|
|
</ListItem>
|
|
</List>
|
|
</div>
|
|
</Paper>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
const modalView = modalOpen ? (
|
|
<Dialog
|
|
modal
|
|
open={modalOpen}
|
|
onClose={() => {
|
|
setModalOpen(false);
|
|
}}
|
|
>
|
|
<DialogTitle>Hook configuration</DialogTitle>
|
|
<DialogContent>
|
|
<TextField
|
|
onChange={(event) => {
|
|
setNewHookName(event.target.value);
|
|
}}
|
|
color="primary"
|
|
placeholder="Name"
|
|
margin="dense"
|
|
fullWidth
|
|
/>
|
|
<TextField
|
|
onChange={(event) => {
|
|
setNewHookDescription(event.target.value);
|
|
}}
|
|
color="primary"
|
|
placeholder="Description"
|
|
margin="dense"
|
|
fullWidth
|
|
/>
|
|
|
|
<Select
|
|
value={newHookType}
|
|
onChange={(event) => {
|
|
setNewHookType(event.target.value);
|
|
}}
|
|
fullWidth="true"
|
|
>
|
|
{validtypes.map((data) => (
|
|
<MenuItem value={data}>{data}</MenuItem>
|
|
))}
|
|
</Select>
|
|
</DialogContent>
|
|
<DialogActions>
|
|
<Button onClick={() => setModalOpen(false)} color="primary">
|
|
Cancel
|
|
</Button>
|
|
<Button
|
|
disabled={
|
|
newHookName.length === 0 || !validtypes.includes(newHookType)
|
|
}
|
|
onClick={() => {
|
|
newHook();
|
|
setModalOpen(false);
|
|
}}
|
|
color="primary"
|
|
>
|
|
Submit
|
|
</Button>
|
|
</DialogActions>
|
|
</Dialog>
|
|
) : null;
|
|
|
|
const hookmap =
|
|
hooks.length > 0 ? (
|
|
<div>{hooks.map((data) => hookPaper(data))}</div>
|
|
) : (
|
|
<div style={{ marginTop: "10%", marginLeft: "50%" }}>
|
|
<Button
|
|
disabled={false}
|
|
onClick={() => {
|
|
setModalOpen(true);
|
|
}}
|
|
variant="outlined"
|
|
color="primary"
|
|
>
|
|
CREATE NEW HOOK
|
|
</Button>
|
|
</div>
|
|
);
|
|
|
|
const hookView = (
|
|
<div style={bodyDivStyle}>
|
|
<Button
|
|
disabled={false}
|
|
onClick={() => {
|
|
setModalOpen(true);
|
|
}}
|
|
color="primary"
|
|
>
|
|
New
|
|
</Button>
|
|
{hookmap}
|
|
</div>
|
|
);
|
|
|
|
const loadedCheck = isLoaded ? (
|
|
<div>
|
|
{modalView}
|
|
{hookView}
|
|
</div>
|
|
) : (
|
|
<div></div>
|
|
);
|
|
|
|
// Maybe use gridview or something, idk
|
|
return <div>{loadedCheck}</div>;
|
|
};
|
|
|
|
export default Webhooks;
|