From 3c8659349f4e08d1788f9456f22341bcbd0c6b2b Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Wed, 14 Jan 2026 11:46:38 +0100 Subject: [PATCH] delete episode --- app/Http/Controllers/EpisodeController.php | 7 ++ app/Policies/EpisodePolicy.php | 2 +- .../js/components/episodes/DeleteDialog.jsx | 73 +++++++++++++++++++ resources/js/components/episodes/Dialog.jsx | 3 + .../js/components/episodes/Form/index.jsx | 7 ++ resources/js/hooks/episodes.jsx | 37 ++++++++++ resources/js/i18n/de.js | 4 + resources/js/i18n/en.js | 4 + resources/sass/episodes.scss | 12 ++- 9 files changed, 144 insertions(+), 5 deletions(-) create mode 100644 resources/js/components/episodes/DeleteDialog.jsx diff --git a/app/Http/Controllers/EpisodeController.php b/app/Http/Controllers/EpisodeController.php index 9711849..3e529c7 100644 --- a/app/Http/Controllers/EpisodeController.php +++ b/app/Http/Controllers/EpisodeController.php @@ -24,6 +24,13 @@ class EpisodeController extends Controller { return $episode->toArray(); } + public function delete(Request $request, Episode $episode) { + $this->authorize('delete', $episode); + $episode->callOff(); + $episode->delete(); + return $episode->toArray(); + } + public function update(Request $request, Episode $episode) { $this->authorize('update', $episode); $validatedEpisode = $this->validateEpisode($request); diff --git a/app/Policies/EpisodePolicy.php b/app/Policies/EpisodePolicy.php index 1996d21..6216094 100644 --- a/app/Policies/EpisodePolicy.php +++ b/app/Policies/EpisodePolicy.php @@ -64,7 +64,7 @@ class EpisodePolicy */ public function delete(User $user, Episode $episode) { - return false; + return $user->isEventAdmin($episode->event); } /** diff --git a/resources/js/components/episodes/DeleteDialog.jsx b/resources/js/components/episodes/DeleteDialog.jsx new file mode 100644 index 0000000..0ea0021 --- /dev/null +++ b/resources/js/components/episodes/DeleteDialog.jsx @@ -0,0 +1,73 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import { Alert, Button, Modal } from 'react-bootstrap'; +import { useTranslation } from 'react-i18next'; + +import Players from './Players'; + +const Dialog = ({ + episode, + onHide, + onSubmit, + show, +}) => { + const { t } = useTranslation(); + + return + + + {t('episodes.delete')} + + + + {episode.title || episode.event ? +

+ {!episode.confirmed ? + {`${t('episodes.unconfirmed')} `} + : null} + {episode.title || episode.event.title} +

+ : null} +

{t('episodes.startTime', { date: new Date(episode.start) })}

+ {episode.comment ? +

+ {episode.comment} +

+ : null} + {episode.players && episode.players.length ? + + : null} + + {t('episodes.deleteQuestion')} + +
+ + + + +
; +}; + +Dialog.propTypes = { + episode: PropTypes.shape({ + comment: PropTypes.string, + confirmed: PropTypes.bool, + event: PropTypes.shape({ + title: PropTypes.string, + }), + id: PropTypes.number, + players: PropTypes.arrayOf(PropTypes.shape({ + })), + start: PropTypes.string, + title: PropTypes.string, + }), + onHide: PropTypes.func, + onSubmit: PropTypes.func, + show: PropTypes.bool, +}; + +export default Dialog; diff --git a/resources/js/components/episodes/Dialog.jsx b/resources/js/components/episodes/Dialog.jsx index ab59c39..344e48c 100644 --- a/resources/js/components/episodes/Dialog.jsx +++ b/resources/js/components/episodes/Dialog.jsx @@ -9,6 +9,7 @@ const Form = React.lazy(() => import('./Form')); const Dialog = ({ episode, + onDelete, onHide, onSubmit, show, @@ -25,6 +26,7 @@ const Dialog = ({
@@ -35,6 +37,7 @@ Dialog.propTypes = { episode: PropTypes.shape({ id: PropTypes.number, }), + onDelete: PropTypes.func, onHide: PropTypes.func, onSubmit: PropTypes.func, show: PropTypes.bool, diff --git a/resources/js/components/episodes/Form/index.jsx b/resources/js/components/episodes/Form/index.jsx index 9da9464..1d189cd 100644 --- a/resources/js/components/episodes/Form/index.jsx +++ b/resources/js/components/episodes/Form/index.jsx @@ -24,6 +24,7 @@ const EpisodeForm = ({ handleChange, handleSubmit, onCancel, + onDelete, setFieldValue, touched, values, @@ -86,6 +87,11 @@ const EpisodeForm = ({ + {onDelete ? + + : null} {onCancel ?