diff --git a/api/src/main/java/cz/cvut/fel/sem/controller/QuizController.java b/api/src/main/java/cz/cvut/fel/sem/controller/QuizController.java index cf25325f24fa060a474ced9e8e8754df0acb7dce..a763f9b09647417162b62aa062b3eba2a85bacf1 100644 --- a/api/src/main/java/cz/cvut/fel/sem/controller/QuizController.java +++ b/api/src/main/java/cz/cvut/fel/sem/controller/QuizController.java @@ -31,6 +31,13 @@ public class QuizController { return new ResponseEntity<>(headers, HttpStatus.CREATED); } + @CrossOrigin + @DeleteMapping(value = "/{id}", consumes = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(HttpStatus.NO_CONTENT) + public void deleteQuiz(@PathVariable Long id){ + quizService.deleteQuizById(id); + } + @CrossOrigin @GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) public Quiz getQuiz(@PathVariable Long id) { diff --git a/api/src/main/java/cz/cvut/fel/sem/model/quizQuestion/Quiz.java b/api/src/main/java/cz/cvut/fel/sem/model/quizQuestion/Quiz.java index dd148dd156359b2d4f6fd6974e9a0661a9b5ef02..98df499fbf39e5f3556f0bcba398a48706da9588 100644 --- a/api/src/main/java/cz/cvut/fel/sem/model/quizQuestion/Quiz.java +++ b/api/src/main/java/cz/cvut/fel/sem/model/quizQuestion/Quiz.java @@ -17,7 +17,7 @@ import java.util.List; @Getter @Setter public class Quiz extends AbstractEntity { - @OneToMany(mappedBy = "quiz", cascade = CascadeType.PERSIST) + @OneToMany(mappedBy = "quiz", cascade = CascadeType.ALL) private List<Question> questions; private String name; diff --git a/api/src/main/java/cz/cvut/fel/sem/service/QuizService.java b/api/src/main/java/cz/cvut/fel/sem/service/QuizService.java index fb3703f026d46af5522d860964335c12e14b7836..99dbd0ef77a302e14a9ebc7e7fe7e23a33d509c5 100644 --- a/api/src/main/java/cz/cvut/fel/sem/service/QuizService.java +++ b/api/src/main/java/cz/cvut/fel/sem/service/QuizService.java @@ -51,6 +51,12 @@ public class QuizService { return foundQuiz; } + @Transactional + public void deleteQuizById(Long id){ + Quiz foundQuiz = getQuizById(id); + quizRepository.delete(foundQuiz); + } + @Transactional public List<QuizDto> getAllQuizzes(){ List<Quiz> quizzes = quizRepository.findAll(); diff --git a/ui/src/pages/home/Home.js b/ui/src/pages/home/Home.js index 5ef04598b7be4d12715130cdb8ab0d952e07158a..9eadccef82a845b96469ceb8a9abad76bce41ac4 100644 --- a/ui/src/pages/home/Home.js +++ b/ui/src/pages/home/Home.js @@ -7,20 +7,38 @@ const Home = () => { const [quizes, setQuizes] = useState([]); + const findQuizById = (id) => { + let quizToReturn; + quizes.forEach(quiz => { + if(quiz.id === id){ + quizToReturn = quiz + } + }) + return quizToReturn + } + const location = useLocation(); - const [anchorEl, setAnchorEl] = React.useState(null); - const open = Boolean(anchorEl); + const anchorInitial = { + element: null, + id: 0 + } + + const [anchorEl, setAnchorEl] = React.useState(anchorInitial); + const open = Boolean(anchorEl.element); - const handleOptionsOpen = (event) => { - setAnchorEl(event.currentTarget); + const handleOptionsOpen = (event, idToSet) => { + setAnchorEl({ + element: event.currentTarget, + id: idToSet + }); }; const handleClose = () => { - setAnchorEl(null); + setAnchorEl(anchorInitial); }; - useEffect(() => { + const fetchAllQuizzes = () => { fetch("http://localhost:8080/betterKahoot/quiz", { method: 'GET', headers: { @@ -36,28 +54,29 @@ const Home = () => { setQuizes(quizes); }) .catch(error => console.log(error)); - }, [location]) - - function getTextWidth(text, font = "Roboto") { - text = text.toLowerCase(); - const canvas = document.createElement('canvas'); - const context = canvas.getContext('2d'); - - context.font = font || getComputedStyle(document.body).font; - const neco = context.measureText(text).width; - return neco; } - function reformatText(text){ - let newString = "" - let chars = 30; - while(getTextWidth(text.slice(0, chars)) < 160){ - chars += 1 - } - newString += text.slice(0, chars - 3) + "..."; - return newString + const handleDeleteQuiz = () => { + console.log(anchorEl.id) + fetch("http://localhost:8080/betterKahoot/quiz/" + anchorEl.id, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + } + }) + .then(response => { + if(response.status === 204){ + handleClose() + fetchAllQuizzes() + } + }) + .catch(error => console.log(error)); } + useEffect(() => { + fetchAllQuizzes() + }, [location]) + return ( <Grid container @@ -86,7 +105,9 @@ const Home = () => { </Typography> </Grid> {quizes.map((quiz) => - <Grid item key={quiz.id}> + <Grid + item key={quiz.id} id={quiz.id} + > <TextField id="demo-positioned-button" disabled @@ -94,7 +115,7 @@ const Home = () => { aria-controls={open ? 'demo-positioned-menu' : undefined} aria-haspopup="true" aria-expanded={open ? 'true' : undefined} - onClick={handleOptionsOpen} + onClick={(event) => handleOptionsOpen(event, quiz.id)} color="neutral" size="small" sx={{width: '300px', textTransform: 'none', borderRadius: 0}} @@ -113,7 +134,7 @@ const Home = () => { <Menu id="demo-positioned-menu" aria-labelledby="demo-positioned-button" - anchorEl={anchorEl} + anchorEl={anchorEl.element} open={open} onClose={handleClose} anchorOrigin={{ @@ -126,21 +147,21 @@ const Home = () => { }} > <MenuItem - component={NavLink} + component={NavLink} to={{ pathname:"/quiz", - state: quiz + state: findQuizById(anchorEl.id) }} onClick={handleClose} > Edit </MenuItem> - <MenuItem onClick={handleClose}>Delete</MenuItem> + <MenuItem onClick={handleDeleteQuiz}>Delete</MenuItem> <MenuItem component={NavLink} to={{ pathname:"/startQuiz", - state: quiz + state: findQuizById(anchorEl.id) }} onClick={handleClose} > diff --git a/ui/src/pages/quiz/QuestionCreator.js b/ui/src/pages/quiz/QuestionCreator.js index 16e7e6dd1f1358a9c9aca173ce4a9be6ca351e3b..576c0386167b73e75733a5fbe11a75fdf2b2c291 100644 --- a/ui/src/pages/quiz/QuestionCreator.js +++ b/ui/src/pages/quiz/QuestionCreator.js @@ -201,7 +201,7 @@ const QuestionCreator = (props) => { placeholder="Question name" /> </Grid> - <Grid item xs width={'80%'} sx={{minHeight: '326px'}}> + <Grid item xs width={'80%'} sx={{minHeight: language === languageTypes.PLAINTEXT ? '210px' : '326px' }}> <Grid container direction={"row"}