From: Daniel Karbach Date: Tue, 29 Jul 2025 07:42:52 +0000 (+0200) Subject: show unconfirmed episodes to privileged users X-Git-Url: http://git.localhorst.tv/?a=commitdiff_plain;h=9420409b00522040039ffa3502ebecc8bd6a7f31;p=alttp.git show unconfirmed episodes to privileged users --- diff --git a/app/Http/Controllers/EpisodeController.php b/app/Http/Controllers/EpisodeController.php index 3e3fd8a..1458f91 100644 --- a/app/Http/Controllers/EpisodeController.php +++ b/app/Http/Controllers/EpisodeController.php @@ -8,6 +8,7 @@ use App\Models\Episode; use App\Models\EpisodeCrew; use App\Models\User; use Carbon\Carbon; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; @@ -228,7 +229,6 @@ class EpisodeController extends Controller { $episodes = Episode::with(['channels', 'event', 'players', 'players.user']) ->select('episodes.*') ->join('events', 'episodes.event_id', '=', 'events.id') - ->where('episodes.confirmed', '=', true) ->where('events.visible', '=', true) ->orderBy('episodes.start', $reverse ? 'DESC' : 'ASC') ->limit(1000); @@ -240,12 +240,24 @@ class EpisodeController extends Controller { if (isset($validatedData['before'])) { $episodes = $episodes->where('episodes.start', '<=', $validatedData['before']); } + $privIDs = $this->getUserPrivilegedEvents($request); + if (!empty($privIDs)) { + $episodes->where(function (Builder $query) use ($privIDs) { + $query->where('episodes.confirmed', '=', true); + $query->orWhereIn('episodes.event_id', $privIDs); + }); + } else { + $episodes->where('episodes.confirmed', '=', true); + } if (!empty($validatedData['event'])) { if (isset($validatedData['eventInvert']) && $validatedData['eventInvert']) { - $episodes = $episodes->whereNotIn('episodes.event_id', $validatedData['event']); + $episodes->whereNotIn('episodes.event_id', $validatedData['event']); + $episodes->where('events.visible', '=', true); } else { $episodes = $episodes->whereIn('episodes.event_id', $validatedData['event']); } + } else { + $episodes->where('events.visible', '=', true); } if (!empty($validatedData['game'])) { if (isset($validatedData['gameInvert']) && $validatedData['gameInvert']) { @@ -285,6 +297,16 @@ class EpisodeController extends Controller { return $episode->toJson(); } + private function getUserPrivilegedEvents(Request $request): array { + if (!$request->user()) { + return []; + } + return $request->user()->event_crews() + ->where('role', '=', 'admin') + ->pluck('event_id') + ->toArray(); + } + private function validateEpisode(Request $request) { return $request->validate([ 'comment' => 'string', diff --git a/resources/js/components/episodes/Item.jsx b/resources/js/components/episodes/Item.jsx index 5b7bd01..401930f 100644 --- a/resources/js/components/episodes/Item.jsx +++ b/resources/js/components/episodes/Item.jsx @@ -34,6 +34,9 @@ const Item = ({ episode }) => { if (isActive(episode)) { classNames.push('is-active'); } + if (!episode.confirmed) { + classNames.push('is-unconfirmed'); + } const style = React.useMemo(() => { if (episode.event && episode.event.corner) { @@ -55,7 +58,10 @@ const Item = ({ episode }) => {
{episode.title || episode.event ?

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

: null} {episode.comment ? @@ -146,6 +152,7 @@ Item.propTypes = { channels: PropTypes.arrayOf(PropTypes.shape({ })), comment: PropTypes.string, + confirmed: PropTypes.bool, crew: PropTypes.arrayOf(PropTypes.shape({ })), event: PropTypes.shape({ diff --git a/resources/js/i18n/de.js b/resources/js/i18n/de.js index 1c3a44a..5b08008 100644 --- a/resources/js/i18n/de.js +++ b/resources/js/i18n/de.js @@ -248,6 +248,7 @@ export default { startTime: '{{ date, LL LT }} Uhr', title: 'Bezeichnung', tracking: 'Tracking', + unconfirmed: '(unbestätigt)', }, error: { 403: { diff --git a/resources/js/i18n/en.js b/resources/js/i18n/en.js index d9443c7..7247360 100644 --- a/resources/js/i18n/en.js +++ b/resources/js/i18n/en.js @@ -248,6 +248,7 @@ export default { startTime: '{{ date, LL LT }}', title: 'Title', tracking: 'Tracking', + unconfirmed: '(unconfirmed)', }, error: { 403: { diff --git a/resources/sass/episodes.scss b/resources/sass/episodes.scss index c53ea10..e8ae7ed 100644 --- a/resources/sass/episodes.scss +++ b/resources/sass/episodes.scss @@ -14,6 +14,7 @@ } .episodes-item { + position: relative; background-size: 6rem auto; background-repeat: no-repeat; background-position: left bottom; @@ -26,6 +27,10 @@ box-shadow: 0 0 0.25rem 0.25rem $success; } + &.is-unconfirmed { + background-color: rgba(255, 255, 255, 0.1); + } + .episode-start { width: 4rem; }