296 lines
7.0 KiB
JavaScript
296 lines
7.0 KiB
JavaScript
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
|