use App\Models\Event;
use Carbon\Carbon;
+use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
class EventController extends Controller
return $event->toJson();
}
+ public function web(Request $request, string $name) {
+ $event = Event::where('name', '=', $name)->first();
+ if ($event) {
+ $view = view('app')
+ ->with('title', $event->getTranslatedTitle())
+ ->with('description', $event->getTranslatedShort());
+ if ($event->banner) {
+ $view = $view->with('image', url($event->banner));
+ }
+ return $view;
+ }
+ throw new ModelNotFoundException();
+ }
+
}
return $this->hasMany(Episode::class);
}
+ public function getTranslatedTitle(): string {
+ if ($this->description) {
+ return $this->description->getTranslatedProperty('title');
+ }
+ return $this->title;
+ }
+
+ public function getTranslatedShort(): string {
+ if ($this->description) {
+ return $this->description->getTranslatedProperty('short');
+ }
+ return '';
+ }
+
protected $casts = [
'end' => 'datetime',
'start' => 'datetime',
</div>
<div className="episode-titlebar">
{episode.title || episode.event ?
- <div className="episode-title fs-5 fs-md-4">
+ <h3 className="episode-title fs-5 fs-md-4">
{episode.title || episode.event.title}
- </div>
+ </h3>
: null}
{episode.comment ?
- <div className="episode-comment">
+ <p className="episode-comment">
{episode.comment}
- </div>
+ </p>
: null}
</div>
<div className="episode-channel-links ms-auto text-end">
</Button>
: null}
</div>
+ {event.banner ?
+ <div className="event-banner-container">
+ <div className="event-banner" style={{ backgroundImage: `url(${event.banner})` }} />
+ </div>
+ : null}
{event.description ?
<RawHTML html={getTranslation(event.description, 'description', i18n.language)} />
: null}
editContent: PropTypes.func,
}),
event: PropTypes.shape({
+ banner: PropTypes.string,
description: PropTypes.shape({
}),
end: PropTypes.string,
</> : null}
</div>
: null}
- {event.description?
- <div>
- <RawHTML
- html={getTranslation(event.description, 'description', i18n.language)}
- />
- </div>
- : null}
+ <div style={{ flexGrow: '1' }}>
+ {event.banner ?
+ <Link to={getLink(event)}>
+ <div className="event-banner-container">
+ <div className="event-banner" style={{ backgroundImage: `url(${event.banner})` }} />
+ </div>
+ </Link>
+ : null}
+ {event.description?
+ <RawHTML
+ html={getTranslation(event.description, 'description', i18n.language)}
+ />
+ : null}
+ </div>
</div>
</li>;
};
Item.propTypes = {
event: PropTypes.shape({
+ banner: PropTypes.string,
corner: PropTypes.string,
description: PropTypes.shape({
}),
content={getTranslation(event.description, 'short', i18n.language)}
/>
</Helmet> : null}
+ {event.banner ? <Helmet>
+ <meta property="og:image" content={event.banner} />
+ <meta property="twitter:image" content={event.banner} />
+ </Helmet> : null}
<CanonicalLinks base={`/events/${event.name}`} />
<Container>
<Detail actions={actions} event={event} />
</Link>
</Col>
<Col sm={6}>
- <Link className="front-panel" to="/tournaments/6">
+ <Link className="front-panel" to="/tournaments/7">
<Image alt="" className="image" src="/media/alttp/front.png" />
<div className="title">
{t('front.circus')}
import Filter from '../components/episodes/Filter';
import List from '../components/episodes/List';
import RestreamDialog from '../components/episodes/RestreamDialog';
-import { invertEventFilter, toggleEventFilter } from '../helpers/Episode';
+import { invertEventFilter } from '../helpers/Episode';
import { useUser } from '../hooks/user';
export const Component = () => {
setRestreamChannel(null);
setRestreamEpisode(null);
setShowRestreamDialog(false);
- } catch (e) {
- toastr.error(t('episodes.restreamDialog.removeError'));
+ } catch (error) {
+ toastr.error(t('episodes.restreamDialog.removeError', { error }));
}
}, []);
...newChannel,
}));
toastr.success(t('episodes.restreamDialog.editSuccess'));
- } catch (e) {
- toastr.error(t('episodes.restreamDialog.editError'));
+ } catch (error) {
+ toastr.error(t('episodes.restreamDialog.editError', { error }));
}
}, []);
...newChannel,
}));
toastr.success(t('episodes.restreamDialog.crewSuccess'));
- } catch (e) {
- toastr.error(t('episodes.restreamDialog.crewError'));
+ } catch (error) {
+ toastr.error(t('episodes.restreamDialog.crewError', { error }));
}
}, []);
background-size: 6rem auto;
background-repeat: no-repeat;
background-position: left bottom;
+ display: flex;
+ flex-direction: column;
min-height: 8rem;
&.is-active {
.episode-start {
width: 4rem;
}
+ .episode-title {
+ font-weight: normal;
+ line-height: var(--bs-body-line-height);
+ }
+ .episode-comment {
+ margin-bottom: 0;
+ }
@include media-breakpoint-up(md) {
.episode-body {
margin-left: 5rem;
img {
max-height: 3rem;
+ height: 3rem;
width: auto;
border-radius: 50%;
margin: 0 0.5rem 0 0;
img {
max-height: 2rem;
+ height: 2rem;
width: auto;
border-radius: 50%;
margin: 0 0.25rem 0 0;
width: 10rem;
}
}
+
+.event-banner-container {
+ position: relative;
+ margin-bottom: 1.5em;
+ padding-top: 25%;
+ @include media-breakpoint-up(md) {
+ padding-top: 20%;
+ }
+}
+.event-banner {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-position: center center;
+ background-size: cover;
+}
Route::get('/sitemap.xml', [SitemapXmlController::class, 'index']);
-Route::get('/dungeons/{name}', function($name) {
+Route::get('/events/{name}', 'App\Http\Controllers\EventController@web');
+
+Route::get('/dungeons/{name}', function ($name) {
return app()->call('App\Http\Controllers\TechniqueController@web', ['type' => 'dungeon', 'name' => $name]);
});
-Route::get('/locations/{name}', function($name) {
+Route::get('/locations/{name}', function ($name) {
return app()->call('App\Http\Controllers\TechniqueController@web', ['type' => 'location', 'name' => $name]);
});
-Route::get('/modes/{name}', function($name) {
+Route::get('/modes/{name}', function ($name) {
return app()->call('App\Http\Controllers\TechniqueController@web', ['type' => 'mode', 'name' => $name]);
});
-Route::get('/rulesets/{name}', function($name) {
+Route::get('/rulesets/{name}', function ($name) {
return app()->call('App\Http\Controllers\TechniqueController@web', ['type' => 'ruleset', 'name' => $name]);
});
-Route::get('/tech/{name}', function($name) {
+Route::get('/tech/{name}', function ($name) {
return app()->call('App\Http\Controllers\TechniqueController@web', ['type' => 'tech', 'name' => $name]);
});