mirror of
https://github.com/gnmyt/LicenseAPI.git
synced 2026-01-10 10:11:47 +00:00
Create MetaCreationDialog component
This commit is contained in:
@ -0,0 +1,178 @@
|
||||
import {
|
||||
Alert,
|
||||
Button, ButtonGroup,
|
||||
Dialog,
|
||||
DialogActions,
|
||||
DialogContent,
|
||||
DialogTitle, Stack, Switch,
|
||||
TextField, Typography
|
||||
} from "@mui/material";
|
||||
import {patchRequest, putRequest} from "@/common/utils/RequestUtil.js";
|
||||
import {useContext, useEffect, useState} from "react";
|
||||
import {ProjectContext} from "@/states/Dashboard/contexts/Project";
|
||||
import {Description, TextFields, ToggleOn, LooksOneRounded, TableChart, Public} from "@mui/icons-material";
|
||||
|
||||
export const MetaCreationDialog = ({open, onClose, fetchPermissions, editItem, setEditItem}) => {
|
||||
const {currentProject} = useContext(ProjectContext);
|
||||
|
||||
const [type, setType] = useState("TEXT");
|
||||
const [name, setName] = useState("");
|
||||
const [description, setDescription] = useState("");
|
||||
const [defaultValue, setDefaultValue] = useState("");
|
||||
const [isPublic, setPublic] = useState(false);
|
||||
|
||||
const [creationError, setCreationError] = useState("");
|
||||
|
||||
const updateName = async (event) => {
|
||||
setCreationError("");
|
||||
setName(event.target.value);
|
||||
}
|
||||
|
||||
const updateDescription = async (event) => {
|
||||
setCreationError("");
|
||||
setDescription(event.target.value);
|
||||
}
|
||||
|
||||
const updateDefaultValue = async (event) => {
|
||||
setCreationError("");
|
||||
setDefaultValue(event.target.value);
|
||||
}
|
||||
|
||||
const closeDialog = () => {
|
||||
onClose();
|
||||
|
||||
setType("TEXT");
|
||||
setName("");
|
||||
setDescription("");
|
||||
setDefaultValue("");
|
||||
setPublic(false);
|
||||
|
||||
setEditItem(null);
|
||||
setCreationError("");
|
||||
}
|
||||
|
||||
const createMetaItem = async () => {
|
||||
try {
|
||||
await putRequest(`/meta/${currentProject.id}`, {
|
||||
name, type, description, defaultValue,
|
||||
public: isPublic
|
||||
});
|
||||
fetchPermissions();
|
||||
|
||||
closeDialog();
|
||||
} catch (e) {
|
||||
setCreationError(e.message);
|
||||
}
|
||||
}
|
||||
|
||||
const updateMetaItem = async () => {
|
||||
try {
|
||||
await patchRequest(`/meta/${currentProject.id}/${editItem.name}`, {
|
||||
name, description, defaultValue, public: isPublic
|
||||
});
|
||||
fetchPermissions();
|
||||
|
||||
closeDialog();
|
||||
} catch (e) {
|
||||
setCreationError(e.message);
|
||||
}
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
if (!editItem) setDefaultValue(type === "BOOLEAN" ? "false" : type === "NUMBER" ? "0" : "-");
|
||||
}, [type]);
|
||||
|
||||
useEffect(() => {
|
||||
if (editItem) {
|
||||
setType(editItem.type);
|
||||
setName(editItem.name);
|
||||
setDescription(editItem.description);
|
||||
setDefaultValue(editItem.defaultValue);
|
||||
setPublic(editItem.public);
|
||||
}
|
||||
}, [editItem]);
|
||||
|
||||
const onKeyUp = (event) => {
|
||||
if (event.key === "Enter") {
|
||||
if (editItem) updateMetaItem();
|
||||
else createMetaItem();
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<Dialog open={open} onClose={closeDialog} onKeyUp={onKeyUp}>
|
||||
<DialogTitle>{editItem ? "Update" : "Create"} meta data</DialogTitle>
|
||||
<DialogContent sx={{maxWidth: 350}}>
|
||||
<Stack gap={1}>
|
||||
{creationError && <Alert severity="error" sx={{mb: 1}}>{creationError}</Alert>}
|
||||
{!editItem && <ButtonGroup fullWidth sx={{mb: 1}}>
|
||||
<Button onClick={() => setType("BOOLEAN")}
|
||||
variant={type === "BOOLEAN" ? "contained" : "outlined"}>
|
||||
<ToggleOn/>
|
||||
Boolean
|
||||
</Button>
|
||||
<Button onClick={() => setType("TEXT")} variant={type === "TEXT" ? "contained" : "outlined"}>
|
||||
<TextFields/>
|
||||
Text
|
||||
</Button>
|
||||
<Button onClick={() => setType("NUMBER")}
|
||||
variant={type === "NUMBER" ? "contained" : "outlined"}>
|
||||
<LooksOneRounded/>
|
||||
Number
|
||||
</Button>
|
||||
|
||||
</ButtonGroup>}
|
||||
|
||||
<TextField variant="outlined" fullWidth label="Name" value={name} onChange={updateName} sx={{my: 1}}
|
||||
placeholder="Name"
|
||||
InputProps={{startAdornment: <TableChart sx={{color: "text.secondary", mr: 1}}/>}}/>
|
||||
<TextField variant="outlined" fullWidth label="Description" value={description}
|
||||
onChange={updateDescription} placeholder="Description"
|
||||
sx={{mb: 1}}
|
||||
InputProps={{startAdornment: <Description sx={{color: "text.secondary", mr: 1}}/>}}/>
|
||||
|
||||
{type === "TEXT" && <TextField variant="outlined" fullWidth label="Default value" value={defaultValue}
|
||||
onChange={updateDefaultValue} sx={{mb: 1}}
|
||||
placeholder="Default value"
|
||||
InputProps={{
|
||||
startAdornment: <TextFields
|
||||
sx={{color: "text.secondary", mr: 1}}/>
|
||||
}}/>}
|
||||
{type === "NUMBER" && <TextField variant="outlined" fullWidth label="Default value"
|
||||
value={defaultValue}
|
||||
onChange={updateDefaultValue} sx={{mb: 1}} type="number"
|
||||
placeholder="Default value"
|
||||
InputProps={{
|
||||
startAdornment: <LooksOneRounded
|
||||
sx={{color: "text.secondary", mr: 1}}/>
|
||||
}}/>}
|
||||
{type === "BOOLEAN" &&
|
||||
<Stack direction="row" alignItems="center" justifyContent="space-between" sx={{mx: 1}}>
|
||||
|
||||
<Stack direction="row" alignItems="center" gap={1}>
|
||||
<ToggleOn/>
|
||||
<Typography>Default state</Typography>
|
||||
</Stack>
|
||||
|
||||
<Switch checked={defaultValue === "true"} onChange={(event) => setDefaultValue(String(event.target.checked))}/>
|
||||
</Stack>}
|
||||
|
||||
<Stack direction="row" alignItems="center" justifyContent="space-between" sx={{mx: 1}}>
|
||||
<Stack direction="row" alignItems="center" gap={1}>
|
||||
<Public/>
|
||||
<Typography>Public</Typography>
|
||||
</Stack>
|
||||
<Switch checked={isPublic} onChange={(event) => setPublic(event.target.checked)}/>
|
||||
</Stack>
|
||||
|
||||
</Stack>
|
||||
</DialogContent>
|
||||
<DialogActions>
|
||||
<Button onClick={closeDialog}>Cancel</Button>
|
||||
<Button onClick={editItem ? updateMetaItem : createMetaItem} color="primary">
|
||||
{editItem ? "Update" : "Create"}
|
||||
</Button>
|
||||
</DialogActions>
|
||||
</Dialog>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user