Browse Source

Jeeeede Menge updates.

Daniel 1 year ago
parent
commit
dbf004b0b0
100 changed files with 45298 additions and 105 deletions
  1. 54 0
      app/Http/Controllers/Auth/AuthenticatedSessionController.php
  2. 44 0
      app/Http/Controllers/Auth/ConfirmablePasswordController.php
  3. 27 0
      app/Http/Controllers/Auth/EmailVerificationNotificationController.php
  4. 23 0
      app/Http/Controllers/Auth/EmailVerificationPromptController.php
  5. 65 0
      app/Http/Controllers/Auth/NewPasswordController.php
  6. 47 0
      app/Http/Controllers/Auth/PasswordResetLinkController.php
  7. 54 0
      app/Http/Controllers/Auth/RegisteredUserController.php
  8. 30 0
      app/Http/Controllers/Auth/VerifyEmailController.php
  9. 75 0
      app/Http/Helpers/TmdbProvider.php
  10. 93 0
      app/Http/Requests/Auth/LoginRequest.php
  11. 19 0
      app/Models/Comment.php
  12. 74 0
      app/Models/Film.php
  13. 15 0
      app/Models/News.php
  14. 19 0
      app/Models/Setting.php
  15. 34 0
      app/Models/User.php
  16. 15 0
      app/Models/Vote.php
  17. 1 1
      app/Providers/RouteServiceProvider.php
  18. 18 0
      app/View/Components/AppLayout.php
  19. 18 0
      app/View/Components/GuestLayout.php
  20. 8 1
      composer.json
  21. 901 99
      composer.lock
  22. 4 3
      config/app.php
  23. 9 0
      config/database.php
  24. 54 0
      config/laravel-migration-generator.php
  25. 13 0
      convert.php
  26. 37 0
      database/migrations/2022_04_14_124548_create_films_table.php
  27. 34 0
      database/migrations/2022_04_14_125158_create_votes_table.php
  28. 34 0
      database/migrations/2022_04_14_125331_create_settings_table.php
  29. 34 0
      database/migrations/2022_04_14_125830_create_news_table.php
  30. 35 0
      database/migrations/2022_04_14_130009_create_comments_table.php
  31. 32 0
      database/migrations/2022_04_21_174444_add_poster_to_films_table.php
  32. 43 0
      database/migrations/2022_05_04_132749_add_user_disabled.php
  33. 16667 0
      package-lock.json
  34. 6 1
      package.json
  35. BIN
      public/avatar/1-php9bfm6g.png
  36. BIN
      public/avatar/1-phpf0qc35.jpeg
  37. BIN
      public/avatar/1-phpfvmxlz.jpeg
  38. BIN
      public/avatar/1-phphhnxad.jpeg
  39. BIN
      public/avatar/1-phpihdoxc.jpeg
  40. BIN
      public/avatar/1-phpmb8yx4.jpeg
  41. BIN
      public/avatar/1-phpqdpn29.jpeg
  42. BIN
      public/avatar/1-phpzc0luz.jpeg
  43. BIN
      public/avatar/17-php0hzsl8.jpeg
  44. BIN
      public/avatar/19-php7k3jgh.jpeg
  45. BIN
      public/avatar/5-php58h557.jpeg
  46. BIN
      public/avatar/6-phpbqunry.jpeg
  47. BIN
      public/avatar/6-phpsafyxc.jpeg
  48. BIN
      public/avatar/6-phpszifxo.jpeg
  49. BIN
      public/avatar/no-avatar.jpg
  50. 1808 0
      public/css/app.css
  51. 1 0
      public/img/IMDb_Logo_Square.svg
  52. BIN
      public/img/no-portrait.png
  53. 1 0
      public/img/tmdb.svg
  54. 22736 0
      public/js/app.js
  55. 4 0
      public/mix-manifest.json
  56. 3 0
      resources/css/app.css
  57. 6 0
      resources/js/app.js
  58. 3 0
      resources/stubs/vendor/laravel-migration-generator/table-create.stub
  59. 3 0
      resources/stubs/vendor/laravel-migration-generator/table-modify.stub
  60. 28 0
      resources/stubs/vendor/laravel-migration-generator/table.stub
  61. 43 0
      resources/stubs/vendor/laravel-migration-generator/view.stub
  62. 92 0
      resources/views/archiv.blade.php
  63. 36 0
      resources/views/auth/confirm-password.blade.php
  64. 36 0
      resources/views/auth/forgot-password.blade.php
  65. 56 0
      resources/views/auth/login.blade.php
  66. 59 0
      resources/views/auth/register.blade.php
  67. 48 0
      resources/views/auth/reset-password.blade.php
  68. 39 0
      resources/views/auth/verify-email.blade.php
  69. 134 0
      resources/views/components/application-logo.blade.php
  70. 9 0
      resources/views/components/auth-card.blade.php
  71. 7 0
      resources/views/components/auth-session-status.blade.php
  72. 15 0
      resources/views/components/auth-validation-errors.blade.php
  73. 3 0
      resources/views/components/button.blade.php
  74. 1 0
      resources/views/components/dropdown-link.blade.php
  75. 43 0
      resources/views/components/dropdown.blade.php
  76. 3 0
      resources/views/components/input.blade.php
  77. 5 0
      resources/views/components/label.blade.php
  78. 11 0
      resources/views/components/nav-link.blade.php
  79. 11 0
      resources/views/components/responsive-nav-link.blade.php
  80. 8 0
      resources/views/components/tab-link.blade.php
  81. 17 0
      resources/views/dashboard.blade.php
  82. 407 0
      resources/views/film.blade.php
  83. 36 0
      resources/views/layouts/app.blade.php
  84. 24 0
      resources/views/layouts/guest.blade.php
  85. 118 0
      resources/views/layouts/navigation.blade.php
  86. 40 0
      resources/views/localsearch.blade.php
  87. 221 0
      resources/views/main.blade.php
  88. 24 0
      resources/views/remotesearch.blade.php
  89. 20 0
      resources/views/suche.blade.php
  90. 46 0
      resources/views/vendor/pagination/bootstrap-4.blade.php
  91. 88 0
      resources/views/vendor/pagination/bootstrap-5.blade.php
  92. 46 0
      resources/views/vendor/pagination/default.blade.php
  93. 36 0
      resources/views/vendor/pagination/semantic-ui.blade.php
  94. 27 0
      resources/views/vendor/pagination/simple-bootstrap-4.blade.php
  95. 29 0
      resources/views/vendor/pagination/simple-bootstrap-5.blade.php
  96. 19 0
      resources/views/vendor/pagination/simple-default.blade.php
  97. 25 0
      resources/views/vendor/pagination/simple-tailwind.blade.php
  98. 106 0
      resources/views/vendor/pagination/tailwind.blade.php
  99. 81 0
      resources/views/vorschlaege.blade.php
  100. 0 0
      resources/views/vorschlag.blade.php

+ 54 - 0
app/Http/Controllers/Auth/AuthenticatedSessionController.php

@@ -0,0 +1,54 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\Http\Controllers\Controller;
+use App\Http\Requests\Auth\LoginRequest;
+use App\Providers\RouteServiceProvider;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+
+class AuthenticatedSessionController extends Controller
+{
+    /**
+     * Display the login view.
+     *
+     * @return \Illuminate\View\View
+     */
+    public function create()
+    {
+        return view('auth.login');
+    }
+
+    /**
+     * Handle an incoming authentication request.
+     *
+     * @param  \App\Http\Requests\Auth\LoginRequest  $request
+     * @return \Illuminate\Http\RedirectResponse
+     */
+    public function store(LoginRequest $request)
+    {
+        $request->authenticate();
+
+        $request->session()->regenerate();
+
+        return redirect()->intended(RouteServiceProvider::HOME);
+    }
+
+    /**
+     * Destroy an authenticated session.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\RedirectResponse
+     */
+    public function destroy(Request $request)
+    {
+        Auth::guard('web')->logout();
+
+        $request->session()->invalidate();
+
+        $request->session()->regenerateToken();
+
+        return redirect('/');
+    }
+}

+ 44 - 0
app/Http/Controllers/Auth/ConfirmablePasswordController.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\Http\Controllers\Controller;
+use App\Providers\RouteServiceProvider;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Validation\ValidationException;
+
+class ConfirmablePasswordController extends Controller
+{
+    /**
+     * Show the confirm password view.
+     *
+     * @return \Illuminate\View\View
+     */
+    public function show()
+    {
+        return view('auth.confirm-password');
+    }
+
+    /**
+     * Confirm the user's password.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return mixed
+     */
+    public function store(Request $request)
+    {
+        if (! Auth::guard('web')->validate([
+            'email' => $request->user()->email,
+            'password' => $request->password,
+        ])) {
+            throw ValidationException::withMessages([
+                'password' => __('auth.password'),
+            ]);
+        }
+
+        $request->session()->put('auth.password_confirmed_at', time());
+
+        return redirect()->intended(RouteServiceProvider::HOME);
+    }
+}

+ 27 - 0
app/Http/Controllers/Auth/EmailVerificationNotificationController.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\Http\Controllers\Controller;
+use App\Providers\RouteServiceProvider;
+use Illuminate\Http\Request;
+
+class EmailVerificationNotificationController extends Controller
+{
+    /**
+     * Send a new email verification notification.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\RedirectResponse
+     */
+    public function store(Request $request)
+    {
+        if ($request->user()->hasVerifiedEmail()) {
+            return redirect()->intended(RouteServiceProvider::HOME);
+        }
+
+        $request->user()->sendEmailVerificationNotification();
+
+        return back()->with('status', 'verification-link-sent');
+    }
+}

+ 23 - 0
app/Http/Controllers/Auth/EmailVerificationPromptController.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\Http\Controllers\Controller;
+use App\Providers\RouteServiceProvider;
+use Illuminate\Http\Request;
+
+class EmailVerificationPromptController extends Controller
+{
+    /**
+     * Display the email verification prompt.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return mixed
+     */
+    public function __invoke(Request $request)
+    {
+        return $request->user()->hasVerifiedEmail()
+                    ? redirect()->intended(RouteServiceProvider::HOME)
+                    : view('auth.verify-email');
+    }
+}

+ 65 - 0
app/Http/Controllers/Auth/NewPasswordController.php

@@ -0,0 +1,65 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\Http\Controllers\Controller;
+use Illuminate\Auth\Events\PasswordReset;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Facades\Password;
+use Illuminate\Support\Str;
+use Illuminate\Validation\Rules;
+
+class NewPasswordController extends Controller
+{
+    /**
+     * Display the password reset view.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\View\View
+     */
+    public function create(Request $request)
+    {
+        return view('auth.reset-password', ['request' => $request]);
+    }
+
+    /**
+     * Handle an incoming new password request.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\RedirectResponse
+     *
+     * @throws \Illuminate\Validation\ValidationException
+     */
+    public function store(Request $request)
+    {
+        $request->validate([
+            'token' => ['required'],
+            'email' => ['required', 'email'],
+            'password' => ['required', 'confirmed', Rules\Password::defaults()],
+        ]);
+
+        // Here we will attempt to reset the user's password. If it is successful we
+        // will update the password on an actual user model and persist it to the
+        // database. Otherwise we will parse the error and return the response.
+        $status = Password::reset(
+            $request->only('email', 'password', 'password_confirmation', 'token'),
+            function ($user) use ($request) {
+                $user->forceFill([
+                    'password' => Hash::make($request->password),
+                    'remember_token' => Str::random(60),
+                ])->save();
+
+                event(new PasswordReset($user));
+            }
+        );
+
+        // If the password was successfully reset, we will redirect the user back to
+        // the application's home authenticated view. If there is an error we can
+        // redirect them back to where they came from with their error message.
+        return $status == Password::PASSWORD_RESET
+                    ? redirect()->route('login')->with('status', __($status))
+                    : back()->withInput($request->only('email'))
+                            ->withErrors(['email' => __($status)]);
+    }
+}

+ 47 - 0
app/Http/Controllers/Auth/PasswordResetLinkController.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\Http\Controllers\Controller;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Password;
+
+class PasswordResetLinkController extends Controller
+{
+    /**
+     * Display the password reset link request view.
+     *
+     * @return \Illuminate\View\View
+     */
+    public function create()
+    {
+        return view('auth.forgot-password');
+    }
+
+    /**
+     * Handle an incoming password reset link request.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\RedirectResponse
+     *
+     * @throws \Illuminate\Validation\ValidationException
+     */
+    public function store(Request $request)
+    {
+        $request->validate([
+            'email' => ['required', 'email'],
+        ]);
+
+        // We will send the password reset link to this user. Once we have attempted
+        // to send the link, we will examine the response then see the message we
+        // need to show to the user. Finally, we'll send out a proper response.
+        $status = Password::sendResetLink(
+            $request->only('email')
+        );
+
+        return $status == Password::RESET_LINK_SENT
+                    ? back()->with('status', __($status))
+                    : back()->withInput($request->only('email'))
+                            ->withErrors(['email' => __($status)]);
+    }
+}

+ 54 - 0
app/Http/Controllers/Auth/RegisteredUserController.php

@@ -0,0 +1,54 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\Http\Controllers\Controller;
+use App\Models\User;
+use App\Providers\RouteServiceProvider;
+use Illuminate\Auth\Events\Registered;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Hash;
+use Illuminate\Validation\Rules;
+
+class RegisteredUserController extends Controller
+{
+    /**
+     * Display the registration view.
+     *
+     * @return \Illuminate\View\View
+     */
+    public function create()
+    {
+        return view('auth.register');
+    }
+
+    /**
+     * Handle an incoming registration request.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\RedirectResponse
+     *
+     * @throws \Illuminate\Validation\ValidationException
+     */
+    public function store(Request $request)
+    {
+        $request->validate([
+            'name' => ['required', 'string', 'max:255'],
+            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
+            'password' => ['required', 'confirmed', Rules\Password::defaults()],
+        ]);
+
+        $user = User::create([
+            'name' => $request->name,
+            'email' => $request->email,
+            'password' => Hash::make($request->password),
+        ]);
+
+        event(new Registered($user));
+
+        Auth::login($user);
+
+        return redirect(RouteServiceProvider::HOME);
+    }
+}

+ 30 - 0
app/Http/Controllers/Auth/VerifyEmailController.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\Http\Controllers\Controller;
+use App\Providers\RouteServiceProvider;
+use Illuminate\Auth\Events\Verified;
+use Illuminate\Foundation\Auth\EmailVerificationRequest;
+
+class VerifyEmailController extends Controller
+{
+    /**
+     * Mark the authenticated user's email address as verified.
+     *
+     * @param  \Illuminate\Foundation\Auth\EmailVerificationRequest  $request
+     * @return \Illuminate\Http\RedirectResponse
+     */
+    public function __invoke(EmailVerificationRequest $request)
+    {
+        if ($request->user()->hasVerifiedEmail()) {
+            return redirect()->intended(RouteServiceProvider::HOME.'?verified=1');
+        }
+
+        if ($request->user()->markEmailAsVerified()) {
+            event(new Verified($request->user()));
+        }
+
+        return redirect()->intended(RouteServiceProvider::HOME.'?verified=1');
+    }
+}

+ 75 - 0
app/Http/Helpers/TmdbProvider.php

@@ -0,0 +1,75 @@
+<?php
+namespace App\Http\Helpers;
+
+use Monolog\Handler\StreamHandler;
+use Monolog\Logger;
+use Tmdb\Client;
+use Tmdb\Event\BeforeRequestEvent;
+use Tmdb\Event\HttpClientExceptionEvent;
+use Tmdb\Event\Listener\Logger\LogApiErrorListener;
+use Tmdb\Event\Listener\Logger\LogHttpMessageListener;
+use Tmdb\Event\Listener\Request\AcceptJsonRequestListener;
+use Tmdb\Event\Listener\Request\ApiTokenRequestListener;
+use Tmdb\Event\Listener\Request\ContentTypeJsonRequestListener;
+use Tmdb\Event\Listener\Request\LanguageFilterRequestListener;
+use Tmdb\Event\Listener\Request\UserAgentRequestListener;
+use Tmdb\Event\Listener\RequestListener;
+use Tmdb\Event\RequestEvent;
+use Tmdb\Event\ResponseEvent;
+use Tmdb\Token\Api\ApiToken;
+
+class TmdbProvider {
+
+    /**
+     * @return Client
+     */
+    public static function getClient() : Client {
+        $key = "b187f8d9c5e72b1faecb741d5d04239a";
+        $token = new ApiToken($key);
+        define('TMDB_API_KEY', $key);
+
+        $ed = new \Symfony\Component\EventDispatcher\EventDispatcher();
+        $logger = new Logger(
+            'php-tmdb',
+            [ new StreamHandler(storage_path('logs/tmdb.log')) ]
+        );
+
+        $client = new Client([
+            'api_token' => $token,
+            //'secure' => true,
+            'base_uri' => Client::TMDB_URI,
+            'event_dispatcher' => [
+                'adapter' => $ed
+            ]
+        ]);
+
+        $requestListener = new RequestListener($client->getHttpClient(), $ed);
+        $ed->addListener(RequestEvent::class, $requestListener);
+
+        $apiTokenListener = new ApiTokenRequestListener($client->getToken());
+        $ed->addListener(BeforeRequestEvent::class, $apiTokenListener);
+
+        $acceptJSONListener = new AcceptJsonRequestListener();
+        $ed->addListener(BeforeRequestEvent::class, $acceptJSONListener);
+
+        $jsonContentTypeListener = new ContentTypeJsonRequestListener();
+        $ed->addListener(BeforeRequestEvent::class, $jsonContentTypeListener);
+
+        $userAgentListener = new UserAgentRequestListener();
+        $ed->addListener(BeforeRequestEvent::class, $userAgentListener);
+
+        $requestLoggerListener = new LogHttpMessageListener(
+            $logger,
+            new \Tmdb\Formatter\HttpMessage\FullHttpMessageFormatter()
+        );
+        $ed->addListener(BeforeRequestEvent::class, $requestLoggerListener);
+        $ed->addListener(ResponseEvent::class, $requestLoggerListener);
+        $ed->addListener(HttpClientExceptionEvent::class, $requestLoggerListener);
+        $ed->addListener(LogApiErrorListener::class, $requestLoggerListener);
+
+        $langFilterListener = new LanguageFilterRequestListener('de-DE');
+        $ed->addListener(BeforeRequestEvent::class, $langFilterListener);
+
+        return $client;
+    }
+}

+ 93 - 0
app/Http/Requests/Auth/LoginRequest.php

@@ -0,0 +1,93 @@
+<?php
+
+namespace App\Http\Requests\Auth;
+
+use Illuminate\Auth\Events\Lockout;
+use Illuminate\Foundation\Http\FormRequest;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\RateLimiter;
+use Illuminate\Support\Str;
+use Illuminate\Validation\ValidationException;
+
+class LoginRequest extends FormRequest
+{
+    /**
+     * Determine if the user is authorized to make this request.
+     *
+     * @return bool
+     */
+    public function authorize()
+    {
+        return true;
+    }
+
+    /**
+     * Get the validation rules that apply to the request.
+     *
+     * @return array
+     */
+    public function rules()
+    {
+        return [
+            'email' => ['required', 'string', 'email'],
+            'password' => ['required', 'string'],
+        ];
+    }
+
+    /**
+     * Attempt to authenticate the request's credentials.
+     *
+     * @return void
+     *
+     * @throws \Illuminate\Validation\ValidationException
+     */
+    public function authenticate()
+    {
+        $this->ensureIsNotRateLimited();
+
+        if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) {
+            RateLimiter::hit($this->throttleKey());
+
+            throw ValidationException::withMessages([
+                'email' => trans('auth.failed'),
+            ]);
+        }
+
+        RateLimiter::clear($this->throttleKey());
+    }
+
+    /**
+     * Ensure the login request is not rate limited.
+     *
+     * @return void
+     *
+     * @throws \Illuminate\Validation\ValidationException
+     */
+    public function ensureIsNotRateLimited()
+    {
+        if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) {
+            return;
+        }
+
+        event(new Lockout($this));
+
+        $seconds = RateLimiter::availableIn($this->throttleKey());
+
+        throw ValidationException::withMessages([
+            'email' => trans('auth.throttle', [
+                'seconds' => $seconds,
+                'minutes' => ceil($seconds / 60),
+            ]),
+        ]);
+    }
+
+    /**
+     * Get the rate limiting throttle key for the request.
+     *
+     * @return string
+     */
+    public function throttleKey()
+    {
+        return Str::lower($this->input('email')).'|'.$this->ip();
+    }
+}

+ 19 - 0
app/Models/Comment.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class Comment extends Model
+{
+    use HasFactory;
+
+    public function film() {
+        return $this->belongsTo(Film::class, 'film');
+    }
+
+    public function author() {
+        return $this->belongsTo(User::class, 'user');
+    }
+}

+ 74 - 0
app/Models/Film.php

@@ -0,0 +1,74 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\Facades\DB;
+
+class Film extends Model
+{
+    use HasFactory;
+
+    public function comments() {
+        return $this->hasMany(Comment::class, 'film');
+    }
+
+    public function votes()
+    {
+        return $this->hasMany(Vote::class, 'film');
+    }
+
+    public function suggester() {
+        return $this->belongsTo(User::class, 'user');
+    }
+
+    public function getBewertung() {
+        if(!is_null($this->seen)) {
+            $count = Comment::where('film', $this->id)->where('evaluation', '>', 0)->count();
+            return $count > 0 ? Comment::where('film', $this->id)->where('evaluation', '>', 0)->sum('evaluation') / $count : 0;
+        } else return 0;
+    }
+
+    public function activeVotes() {
+        return $this->votes()->leftJoin('users', 'votes.user', '=', 'users.id')->leftJoin('settings', function($join) {
+            $join->on('users.id', '=', 'settings.user')->where('settings.key', '=', 'disabled');
+        })->whereNull('settings.value');
+    }
+
+    public function nextfilm() {
+        $id = Setting::where('key', 'nextfilm')->first()->value;
+        return static::load($id);
+    }
+
+    public function isNext() {
+        $next = Setting::where('key', 'nextfilm')->first()->value;
+        return $next == $this->id;
+    }
+
+    public function scopePopular($query) {
+        $nextfilm = Setting::where('key', 'nextfilm')->first()->value;
+        return $query->addSelect(DB::raw('films.*, COUNT(case when votes.vote IS TRUE then 1 end) as upvotes, COUNT(*) as votes'))
+            ->leftJoin('votes', 'votes.film', '=', 'films.id')
+            ->leftJoin('users', 'users.id', '=', 'votes.user')
+            ->whereNull('seen')->whereNull('rejected')
+            ->whereNot('films.id', '=', $nextfilm)
+            ->whereNot('users.disabled', '=', 1)
+            ->groupBy('films.id')
+            ->orderBy('upvotes', 'DESC')
+            ->orderBy('suggested', 'ASC')
+        ;
+    }
+
+    public function scopeSeen($query) {
+		return $query->whereNull('rejected')->whereNotNull('seen')->orderBy('seen', 'DESC');
+	}
+
+	public function scopeRejected($query) {
+		return $query->whereNull('seen')->whereNotNull('rejected')->orderBy('rejected', 'DESC');
+	}
+
+	public function scopeSuggested($query) {
+		return $query->whereNull('seen')->whereNull('rejected')->orderBy('updated_at', 'DESC');
+	}
+}

+ 15 - 0
app/Models/News.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class News extends Model
+{
+    use HasFactory;
+
+    public function author() {
+        return $this->belongsTo(User::class, 'user');
+    }
+}

+ 19 - 0
app/Models/Setting.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class Setting extends Model
+{
+    use HasFactory;
+
+    public function user() {
+        return $this->belongsTo(User::class, 'user');
+    }
+
+    public function scopeNextFilm($query) {
+        return $query->where('key', 'nextfilm');
+    }
+}

+ 34 - 0
app/Models/User.php

@@ -41,4 +41,38 @@ class User extends Authenticatable
     protected $casts = [
         'email_verified_at' => 'datetime',
     ];
+
+    public function comments() {
+        return $this->hasMany(Comment::class, 'user');
+    }
+
+    public function films() {
+        return $this->hasMany(Film::class, 'user');
+    }
+
+    public function votes() {
+        return $this->hasMany(Vote::class, 'user');
+    }
+
+    public function settings() {
+        return $this->hasMany(Setting::class, 'user');
+    }
+
+    public function news() {
+        return $this->hasMany(News::class, 'user');
+    }
+
+    public function getAvatar() {
+        $settings = $this->settings()->where('key', '=', 'avatar')->first();
+        return is_null($settings) ? "no-avatar.jpg" : $settings->value;
+    }
+
+    public function isActive() {
+        return !$this->disabled;
+    }
+
+    public function isAdmin() {
+        $settings = $this->settings()->where('key', '=', 'admin')->first();
+        return !is_null($settings);
+    }
 }

+ 15 - 0
app/Models/Vote.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class Vote extends Model
+{
+    use HasFactory;
+
+    public function voter() {
+        return $this->belongsTo(User::class, 'user');
+    }
+}

+ 1 - 1
app/Providers/RouteServiceProvider.php

@@ -17,7 +17,7 @@ class RouteServiceProvider extends ServiceProvider
      *
      * @var string
      */
-    public const HOME = '/home';
+    public const HOME = '/dashboard';
 
     /**
      * Define your route model bindings, pattern filters, etc.

+ 18 - 0
app/View/Components/AppLayout.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace App\View\Components;
+
+use Illuminate\View\Component;
+
+class AppLayout extends Component
+{
+    /**
+     * Get the view / contents that represents the component.
+     *
+     * @return \Illuminate\View\View
+     */
+    public function render()
+    {
+        return view('layouts.app');
+    }
+}

+ 18 - 0
app/View/Components/GuestLayout.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace App\View\Components;
+
+use Illuminate\View\Component;
+
+class GuestLayout extends Component
+{
+    /**
+     * Get the view / contents that represents the component.
+     *
+     * @return \Illuminate\View\View
+     */
+    public function render()
+    {
+        return view('layouts.guest');
+    }
+}

+ 8 - 1
composer.json

@@ -4,15 +4,22 @@
     "description": "The Laravel Framework.",
     "keywords": ["framework", "laravel"],
     "license": "MIT",
+    "repositories": [{
+        "type": "vcs",
+        "url": "https://github.com/ascarion/php-tmdb-api"
+    }],
     "require": {
         "php": "^8.0.2",
         "guzzlehttp/guzzle": "^7.2",
         "laravel/framework": "^9.2",
         "laravel/sanctum": "^2.14.1",
-        "laravel/tinker": "^2.7"
+        "laravel/tinker": "^2.7",
+        "php-http/cache-plugin": "^1.7",
+        "php-tmdb/api": "dev-symfony-patch"
     },
     "require-dev": {
         "fakerphp/faker": "^1.9.1",
+        "laravel/breeze": "^1.9",
         "laravel/sail": "^1.0.1",
         "mockery/mockery": "^1.4.4",
         "nunomaduro/collision": "^6.1",

File diff suppressed because it is too large
+ 901 - 99
composer.lock


+ 4 - 3
config/app.php

@@ -69,7 +69,7 @@ return [
     |
     */
 
-    'timezone' => 'UTC',
+    'timezone' => 'Europe/Berlin',
 
     /*
     |--------------------------------------------------------------------------
@@ -82,7 +82,7 @@ return [
     |
     */
 
-    'locale' => 'en',
+    'locale' => 'de',
 
     /*
     |--------------------------------------------------------------------------
@@ -108,7 +108,7 @@ return [
     |
     */
 
-    'faker_locale' => 'en_US',
+    'faker_locale' => 'de_DE',
 
     /*
     |--------------------------------------------------------------------------
@@ -191,6 +191,7 @@ return [
     */
 
     'aliases' => Facade::defaultAliases()->merge([
+        'TmdbProvider' => App\Http\Helpers\TmdbProvider::class,
         // 'ExampleClass' => App\Example\ExampleClass::class,
     ])->toArray(),
 

+ 9 - 0
config/database.php

@@ -57,6 +57,15 @@ return [
             'prefix' => '',
             'prefix_indexes' => true,
             'strict' => true,
+            'modes' => [
+                //'ONLY_FULL_GROUP_BY', // Disable this to allow grouping by one column
+                'STRICT_TRANS_TABLES',
+                'NO_ZERO_IN_DATE',
+                'NO_ZERO_DATE',
+                'ERROR_FOR_DIVISION_BY_ZERO',
+                'NO_AUTO_CREATE_USER',
+                'NO_ENGINE_SUBSTITUTION'
+            ],
             'engine' => null,
             'options' => extension_loaded('pdo_mysql') ? array_filter([
                 PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),

+ 54 - 0
config/laravel-migration-generator.php

@@ -0,0 +1,54 @@
+<?php
+
+return [
+    'run_after_migrations' => env('LMG_RUN_AFTER_MIGRATIONS', false),
+    'clear_output_path'    => env('LMG_CLEAR_OUTPUT_PATH', false),
+    //default configs
+    'table_naming_scheme' => env('LMG_TABLE_NAMING_SCHEME', '[IndexedTimestamp]_create_[TableName]_table.php'),
+    'view_naming_scheme'  => env('LMG_VIEW_NAMING_SCHEME', '[IndexedTimestamp]_create_[ViewName]_view.php'),
+    'path'                => env('LMG_OUTPUT_PATH', 'tests/database/migrations'),
+    'skippable_tables'    => env('LMG_SKIPPABLE_TABLES', 'migrations'),
+    'skip_views'          => env('LMG_SKIP_VIEWS', false),
+    'skippable_views'     => env('LMG_SKIPPABLE_VIEWS', ''),
+    'sort_mode'           => env('LMG_SORT_MODE', 'foreign_key'),
+    'definitions'         => [
+        'prefer_unsigned_prefix'              => env('LMG_PREFER_UNSIGNED_PREFIX', true),
+        'use_defined_index_names'             => env('LMG_USE_DEFINED_INDEX_NAMES', true),
+        'use_defined_foreign_key_index_names' => env('LMG_USE_DEFINED_FOREIGN_KEY_INDEX_NAMES', true),
+        'use_defined_unique_key_index_names'  => env('LMG_USE_DEFINED_UNIQUE_KEY_INDEX_NAMES', true),
+        'use_defined_primary_key_index_names' => env('LMG_USE_DEFINED_PRIMARY_KEY_INDEX_NAMES', true),
+        'with_comments'                       => env('LMG_WITH_COMMENTS', true),
+        'use_defined_datatype_on_timestamp'   => env('LMG_USE_DEFINED_DATATYPE_ON_TIMESTAMP', false),
+    ],
+
+    //now driver specific configs
+    //null = use default
+    'mysql' => [
+        'table_naming_scheme' => env('LMG_MYSQL_TABLE_NAMING_SCHEME', null),
+        'view_naming_scheme'  => env('LMG_MYSQL_VIEW_NAMING_SCHEME', null),
+        'path'                => env('LMG_MYSQL_OUTPUT_PATH', null),
+        'skippable_tables'    => env('LMG_MYSQL_SKIPPABLE_TABLES', null),
+        'skippable_views'     => env('LMG_MYSQL_SKIPPABLE_VIEWS', null),
+    ],
+    'sqlite' => [
+        'table_naming_scheme' => env('LMG_SQLITE_TABLE_NAMING_SCHEME', null),
+        'view_naming_scheme'  => env('LMG_SQLITE_VIEW_NAMING_SCHEME', null),
+        'path'                => env('LMG_SQLITE_OUTPUT_PATH', null),
+        'skippable_tables'    => env('LMG_SQLITE_SKIPPABLE_TABLES', null),
+        'skippable_views'     => env('LMG_SQLITE_SKIPPABLE_VIEWS', null),
+    ],
+    'pgsql' => [
+        'table_naming_scheme' => env('LMG_PGSQL_TABLE_NAMING_SCHEME', null),
+        'view_naming_scheme'  => env('LMG_PGSQL_VIEW_NAMING_SCHEME', null),
+        'path'                => env('LMG_PGSQL_OUTPUT_PATH', null),
+        'skippable_tables'    => env('LMG_PGSQL_SKIPPABLE_TABLES', null),
+        'skippable_views'     => env('LMG_PGSQL_SKIPPABLE_VIEWS', null)
+    ],
+    'sqlsrv' => [
+        'table_naming_scheme' => env('LMG_SQLSRV_TABLE_NAMING_SCHEME', null),
+        'view_naming_scheme'  => env('LMG_SQLSRV_VIEW_NAMING_SCHEME', null),
+        'path'                => env('LMG_SQLSRV_OUTPUT_PATH', null),
+        'skippable_tables'    => env('LMG_SQLSRV_SKIPPABLE_TABLES', null),
+        'skippable_views'     => env('LMG_SQLSRV_SKIPPABLE_VIEWS', null),
+    ],
+];

+ 13 - 0
convert.php

@@ -0,0 +1,13 @@
+<?php
+
+$old = mysqli_connect("localhost","daniel", "ncc74656", "dumbo");
+$new = new PDO('mysql:host=localhost;dbname=dumbo2', "daniel", "ncc74656");
+
+$query = $old->query("SELECT * FROM `film_votes`");
+$target = $new->prepare("INSERT INTO `votes` (`id`, `user`, `film`, `vote`, `created_at`, `updated_at`) VALUES (?, ?, ?, ?, ?, ?); ");
+//$settings = $new->prepare("INSERT INTO `settings` (`user`, `key`, `value`) VALUES (?, ?, ?);");
+
+foreach($query->fetch_all(MYSQLI_ASSOC) as $q) {
+    $target->execute([$q['id'], $q['user'], $q['film'], $q['stimme'], $q['created_at'], $q['updated_at']]);
+
+}

+ 37 - 0
database/migrations/2022_04_14_124548_create_films_table.php

@@ -0,0 +1,37 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('films', function (Blueprint $table) {
+            $table->id();
+            $table->string('name', 255);
+            $table->bigInteger('tvdbid');
+            $table->date('suggested');
+            $table->date('seen')->nullable();
+            $table->date('rejected')->nullable();
+            $table->integer('user');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('films');
+    }
+};

+ 34 - 0
database/migrations/2022_04_14_125158_create_votes_table.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('votes', function (Blueprint $table) {
+            $table->id();
+            $table->integer('film');
+            $table->integer('user');
+            $table->boolean('vote');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('votes');
+    }
+};

+ 34 - 0
database/migrations/2022_04_14_125331_create_settings_table.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('settings', function (Blueprint $table) {
+            $table->id();
+            $table->integer('user')->nullable();
+            $table->string('key');
+            $table->string('value');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('settings');
+    }
+};

+ 34 - 0
database/migrations/2022_04_14_125830_create_news_table.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('news', function (Blueprint $table) {
+            $table->id();
+            $table->integer('user');
+            $table->string('headline', 255);
+            $table->text('body');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('news');
+    }
+};

+ 35 - 0
database/migrations/2022_04_14_130009_create_comments_table.php

@@ -0,0 +1,35 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('comments', function (Blueprint $table) {
+            $table->id();
+            $table->integer('film');
+            $table->integer('user');
+            $table->text('body');
+            $table->tinyInteger('evaluation')->nullable();
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('comments');
+    }
+};

+ 32 - 0
database/migrations/2022_04_21_174444_add_poster_to_films_table.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('films', function (Blueprint $table) {
+            $table->string('poster', '200');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('films', function (Blueprint $table) {
+            $table->dropColumn('poster');
+        });
+    }
+};

+ 43 - 0
database/migrations/2022_05_04_132749_add_user_disabled.php

@@ -0,0 +1,43 @@
+<?php
+
+use App\Models\Setting;
+use App\Models\User;
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('users', function (Blueprint $table) {
+            $table->boolean('disabled');
+        });
+
+        $disabledUsers = Setting::where('key', 'disabled')->where('value', 1)->get();
+
+        foreach($disabledUsers as $u) {
+            $user = User::where('id', $u->user)->first();
+            $user->disabled = true;
+            $user->save();
+        }
+
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('users', function (Blueprint $table) {
+            $table->dropColumn('disabled');
+        });
+    }
+};

File diff suppressed because it is too large
+ 16667 - 0
package-lock.json


+ 6 - 1
package.json

@@ -10,9 +10,14 @@
         "production": "mix --production"
     },
     "devDependencies": {
+        "@tailwindcss/forms": "^0.4.0",
+        "alpinejs": "^3.4.2",
+        "autoprefixer": "^10.4.2",
         "axios": "^0.25",
         "laravel-mix": "^6.0.6",
         "lodash": "^4.17.19",
-        "postcss": "^8.1.14"
+        "postcss": "^8.4.6",
+        "postcss-import": "^14.0.2",
+        "tailwindcss": "^3.0.18"
     }
 }

BIN
public/avatar/1-php9bfm6g.png


BIN
public/avatar/1-phpf0qc35.jpeg


BIN
public/avatar/1-phpfvmxlz.jpeg


BIN
public/avatar/1-phphhnxad.jpeg


BIN
public/avatar/1-phpihdoxc.jpeg


BIN
public/avatar/1-phpmb8yx4.jpeg


BIN
public/avatar/1-phpqdpn29.jpeg


BIN
public/avatar/1-phpzc0luz.jpeg


BIN
public/avatar/17-php0hzsl8.jpeg


BIN
public/avatar/19-php7k3jgh.jpeg


BIN
public/avatar/5-php58h557.jpeg


BIN
public/avatar/6-phpbqunry.jpeg


BIN
public/avatar/6-phpsafyxc.jpeg


BIN
public/avatar/6-phpszifxo.jpeg


BIN
public/avatar/no-avatar.jpg


File diff suppressed because it is too large
+ 1808 - 0
public/css/app.css


File diff suppressed because it is too large
+ 1 - 0
public/img/IMDb_Logo_Square.svg


BIN
public/img/no-portrait.png


File diff suppressed because it is too large
+ 1 - 0
public/img/tmdb.svg


File diff suppressed because it is too large
+ 22736 - 0
public/js/app.js


+ 4 - 0
public/mix-manifest.json

@@ -0,0 +1,4 @@
+{
+    "/js/app.js": "/js/app.js",
+    "/css/app.css": "/css/app.css"
+}

+ 3 - 0
resources/css/app.css

@@ -0,0 +1,3 @@
+@import 'tailwindcss/base';
+@import 'tailwindcss/components';
+@import 'tailwindcss/utilities';

+ 6 - 0
resources/js/app.js

@@ -1 +1,7 @@
 require('./bootstrap');
+
+import Alpine from 'alpinejs';
+
+window.Alpine = Alpine;
+
+Alpine.start();

+ 3 - 0
resources/stubs/vendor/laravel-migration-generator/table-create.stub

@@ -0,0 +1,3 @@
+Schema::create('[TableName]', function (Blueprint $table) {
+    [Schema]
+});

+ 3 - 0
resources/stubs/vendor/laravel-migration-generator/table-modify.stub

@@ -0,0 +1,3 @@
+Schema::table('[TableName]', function (Blueprint $table) {
+    [Schema]
+});

+ 28 - 0
resources/stubs/vendor/laravel-migration-generator/table.stub

@@ -0,0 +1,28 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class Create[TableName:Studly]Table extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        [TableUp]
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        [TableDown]
+    }
+}

+ 43 - 0
resources/stubs/vendor/laravel-migration-generator/view.stub

@@ -0,0 +1,43 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class Create[ViewName:Studly]View extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        DB::statement($this->dropView());
+        DB::statement($this->createView());
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        DB::statement($this->dropView());
+    }
+
+    private function createView()
+    {
+        return <<<SQL
+            [Schema]
+        SQL;
+    }
+
+    private function dropView()
+    {
+        return <<<SQL
+            DROP VIEW IF EXISTS `[ViewName]`;
+        SQL;
+    }
+}

+ 92 - 0
resources/views/archiv.blade.php

@@ -0,0 +1,92 @@
+<x-app-layout>
+    <x-slot name="header">
+        <h2 class="font-semibold text-xl text-burnt leading-tight">
+            {{ __($title) }}
+        </h2>
+            @if($title == 'Gesehene Filme')
+            <a href="/abgelehnt" class="text-yelmax">&rightarrow; Abgelehnte Filme</a>
+            @else
+            <a href="/gesehen" class="text-yelmax">&rightarrow; Gesehene Filme</a>
+            @endif
+    </x-slot>
+
+    <div class="py-12">
+        <div class="max-w-7xl mx-auto sm:px-6 lg:px-8 text-crayola">
+            <div class="grid grid-cols-3 gap-2 sm:gap-4 my-4 px-2">
+                @foreach ($films as $film)
+                <div>
+                <a href="/film/{{$film->id}}" class="text-yelmax sm:float-left sm:mr-2">
+                    <img src="{{ $film->poster !== '' ? $ihelp->getUrl($film->poster, 'w185') : "/img/no-portrait.png" }}" title="{{ $film->name }}" class="rounded-lg shadow-md shadow-burnt">
+                </a>
+                <a href="/film/{{$film->id}}" class="text-yelmax text-xs leading-3 sm:text-lg">{{$film->name}}</a>
+                <div class="flex sm:text-3xl">
+                    @php
+                        $stimme = is_null(auth()->user()) ? null : $film->votes()->where('user', auth()->user()->id)->first();
+                    @endphp
+                    @if (!is_null($stimme) && $stimme->vote == 0)
+                    <svg title="Deine Stimme: Nicht dafür" xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-red-700 sm:h-8 sm:w-8" viewBox="0 0 20 20" fill="currentColor">
+                        <path d="M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z" />
+                        <path d="M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z" />
+                    </svg> &middot;
+                    @elseif (!is_null($stimme) && $stimme->vote == 1)
+                    <svg title="Deine Stimme: Dafür" xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-green-900 sm:h-8 sm:w-8" viewBox="0 0 20 20" fill="currentColor">
+                        <path d="M9 2a1 1 0 000 2h2a1 1 0 100-2H9z" />
+                        <path fill-rule="evenodd" d="M4 5a2 2 0 012-2 3 3 0 003 3h2a3 3 0 003-3 2 2 0 012 2v11a2 2 0 01-2 2H6a2 2 0 01-2-2V5zm9.707 5.707a1 1 0 00-1.414-1.414L9 12.586l-1.293-1.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd" />
+                    </svg> &middot;
+                    @endif
+                    <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 sm:h-8 sm:w-8" viewBox="0 0 20 20" fill="currentColor">
+                        <path d="M2 5a2 2 0 012-2h7a2 2 0 012 2v4a2 2 0 01-2 2H9l-3 3v-3H4a2 2 0 01-2-2V5z" />
+                        <path d="M15 7v2a4 4 0 01-4 4H9.828l-1.766 1.767c.28.149.599.233.938.233h2l3 3v-3h2a2 2 0 002-2V9a2 2 0 00-2-2h-1z" />
+                      </svg>
+                    {{ $film->comments()->count() }}
+                    @if($film->getBewertung() > 0)
+                        &middot;
+                        <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-burnt sm:h-8 sm:w-8" viewBox="0 0 20 20" fill="currentColor">
+                            <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                          </svg>
+                        {{ number_format($film->getBewertung(), 1, '.', '') }}
+                    @endif
+                </div>
+                @php
+                    $date = $film->seen !== null ? $film->seen : $film->rejected
+                @endphp
+                <div class="text-xs text-field sm:hidden"> {{ \Carbon\Carbon::parse($date)->format('d.m.Y') }} </div>
+                <div class="text-field hidden sm:flex my-2">
+                    @if($film->seen !== null)
+                    <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 mr-2" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
+                        <path stroke-linecap="round" stroke-linejoin="round" d="M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z" />
+                      </svg>
+                    @else
+                    <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 mr-2" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
+                        <path stroke-linecap="round" stroke-linejoin="round" d="M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636" />
+                      </svg>
+                    @endif
+                      {{ \Carbon\Carbon::parse($date)->format('d.m.Y') }}
+                </div>
+                </div>
+
+                @endforeach
+            </div>
+
+            {{ $films->links() }}
+
+            <div class="flex">
+            <svg title="Deine Stimme: Nicht dafür" xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-red-700" viewBox="0 0 20 20" fill="currentColor">
+                <path d="M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z" />
+                <path d="M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z" />
+            </svg> Du bist nicht dafür &middot;
+            <svg title="Deine Stimme: Dafür" xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-green-900" viewBox="0 0 20 20" fill="currentColor">
+                <path d="M9 2a1 1 0 000 2h2a1 1 0 100-2H9z" />
+                <path fill-rule="evenodd" d="M4 5a2 2 0 012-2 3 3 0 003 3h2a3 3 0 003-3 2 2 0 012 2v11a2 2 0 01-2 2H6a2 2 0 01-2-2V5zm9.707 5.707a1 1 0 00-1.414-1.414L9 12.586l-1.293-1.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd" />
+            </svg> Du bist dafür &middot;
+            <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor">
+                <path d="M2 5a2 2 0 012-2h7a2 2 0 012 2v4a2 2 0 01-2 2H9l-3 3v-3H4a2 2 0 01-2-2V5z" />
+                <path d="M15 7v2a4 4 0 01-4 4H9.828l-1.766 1.767c.28.149.599.233.938.233h2l3 3v-3h2a2 2 0 002-2V9a2 2 0 00-2-2h-1z" />
+              </svg> Anzahl Kommentare &middot;
+                <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-burnt" viewBox="0 0 20 20" fill="currentColor">
+                    <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                  </svg> Bewertung
+            </div>
+        </div>
+    </div>
+</x-app-layout>

+ 36 - 0
resources/views/auth/confirm-password.blade.php

@@ -0,0 +1,36 @@
+<x-guest-layout>
+    <x-auth-card>
+        <x-slot name="logo">
+            <a href="/">
+                <x-application-logo class="w-20 h-20 fill-current text-burnt hover:text-yelmax" />
+            </a>
+        </x-slot>
+
+        <div class="mb-4 text-sm text-crayola">
+            {{ __('This is a secure area of the application. Please confirm your password before continuing.') }}
+        </div>
+
+        <!-- Validation Errors -->
+        <x-auth-validation-errors class="mb-4" :errors="$errors" />
+
+        <form method="POST" action="{{ route('password.confirm') }}">
+            @csrf
+
+            <!-- Password -->
+            <div>
+                <x-label for="password" :value="__('Password')" />
+
+                <x-input id="password" class="block mt-1 w-full"
+                                type="password"
+                                name="password"
+                                required autocomplete="current-password" />
+            </div>
+
+            <div class="flex justify-end mt-4">
+                <x-button>
+                    {{ __('Confirm') }}
+                </x-button>
+            </div>
+        </form>
+    </x-auth-card>
+</x-guest-layout>

+ 36 - 0
resources/views/auth/forgot-password.blade.php

@@ -0,0 +1,36 @@
+<x-guest-layout>
+    <x-auth-card>
+        <x-slot name="logo">
+            <a href="/">
+                <x-application-logo class="w-20 h-20 fill-current text-burnt hover:text-yelmax" />
+            </a>
+        </x-slot>
+
+        <div class="mb-4 text-sm text-crayola">
+            {{ __('Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.') }}
+        </div>
+
+        <!-- Session Status -->
+        <x-auth-session-status class="mb-4" :status="session('status')" />
+
+        <!-- Validation Errors -->
+        <x-auth-validation-errors class="mb-4" :errors="$errors" />
+
+        <form method="POST" action="{{ route('password.email') }}">
+            @csrf
+
+            <!-- Email Address -->
+            <div>
+                <x-label for="email" :value="__('Email')" />
+
+                <x-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email')" required autofocus />
+            </div>
+
+            <div class="flex items-center justify-end mt-4">
+                <x-button>
+                    {{ __('Email Password Reset Link') }}
+                </x-button>
+            </div>
+        </form>
+    </x-auth-card>
+</x-guest-layout>

+ 56 - 0
resources/views/auth/login.blade.php

@@ -0,0 +1,56 @@
+<x-guest-layout>
+    <x-auth-card>
+        <x-slot name="logo">
+            <a href="/">
+                <x-application-logo class="w-20 h-20 fill-current text-burnt hover:text-yelmax" />
+            </a>
+        </x-slot>
+
+        <!-- Session Status -->
+        <x-auth-session-status class="mb-4" :status="session('status')" />
+
+        <!-- Validation Errors -->
+        <x-auth-validation-errors class="mb-4" :errors="$errors" />
+
+        <form method="POST" action="{{ route('login') }}">
+            @csrf
+
+            <!-- Email Address -->
+            <div>
+                <x-label for="email" :value="__('Email')" />
+
+                <x-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email')" required autofocus />
+            </div>
+
+            <!-- Password -->
+            <div class="mt-4">
+                <x-label for="password" :value="__('Password')" />
+
+                <x-input id="password" class="block mt-1 w-full"
+                                type="password"
+                                name="password"
+                                required autocomplete="current-password" />
+            </div>
+
+            <!-- Remember Me -->
+            <div class="block mt-4">
+                <label for="remember_me" class="inline-flex items-center">
+                    <input id="remember_me" type="checkbox" class="rounded border-field text-crayola bg-fogra checked:bg-fogra focus:bg-fogra checked:focus:bg-fogra focus:ring-offset-coal focus:ring-burnt hover:bg-fogra" name="remember">
+                    <span class="ml-2 text-sm text-crayola">{{ __('Remember me') }}</span>
+                </label>
+            </div>
+
+            <div class="flex items-center justify-end mt-4">
+                @if (Route::has('password.request'))
+                    <a class="underline text-sm text-yelmax hover:text-crayola" href="{{ route('password.request') }}">
+                        {{ __('Forgot your password?') }}
+                    </a>
+                @endif
+
+                <x-button class="ml-3">
+                    {{ __('Log in') }}
+                </x-button>
+            </div>
+        </form>
+    </x-auth-card>
+</x-guest-layout>

+ 59 - 0
resources/views/auth/register.blade.php

@@ -0,0 +1,59 @@
+<x-guest-layout>
+    <x-auth-card>
+        <x-slot name="logo">
+            <a href="/">
+                <x-application-logo class="w-20 h-20 fill-current text-gray-500" />
+            </a>
+        </x-slot>
+
+        <!-- Validation Errors -->
+        <x-auth-validation-errors class="mb-4" :errors="$errors" />
+
+        <form method="POST" action="{{ route('register') }}">
+            @csrf
+
+            <!-- Name -->
+            <div>
+                <x-label for="name" :value="__('Name')" />
+
+                <x-input id="name" class="block mt-1 w-full" type="text" name="name" :value="old('name')" required autofocus />
+            </div>
+
+            <!-- Email Address -->
+            <div class="mt-4">
+                <x-label for="email" :value="__('Email')" />
+
+                <x-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email')" required />
+            </div>
+
+            <!-- Password -->
+            <div class="mt-4">
+                <x-label for="password" :value="__('Password')" />
+
+                <x-input id="password" class="block mt-1 w-full"
+                                type="password"
+                                name="password"
+                                required autocomplete="new-password" />
+            </div>
+
+            <!-- Confirm Password -->
+            <div class="mt-4">
+                <x-label for="password_confirmation" :value="__('Confirm Password')" />
+
+                <x-input id="password_confirmation" class="block mt-1 w-full"
+                                type="password"
+                                name="password_confirmation" required />
+            </div>
+
+            <div class="flex items-center justify-end mt-4">
+                <a class="underline text-sm text-gray-600 hover:text-gray-900" href="{{ route('login') }}">
+                    {{ __('Already registered?') }}
+                </a>
+
+                <x-button class="ml-4">
+                    {{ __('Register') }}
+                </x-button>
+            </div>
+        </form>
+    </x-auth-card>
+</x-guest-layout>

+ 48 - 0
resources/views/auth/reset-password.blade.php

@@ -0,0 +1,48 @@
+<x-guest-layout>
+    <x-auth-card>
+        <x-slot name="logo">
+            <a href="/">
+                <x-application-logo class="w-20 h-20 fill-current text-burnt hover:text-yelmax" />
+            </a>
+        </x-slot>
+
+        <!-- Validation Errors -->
+        <x-auth-validation-errors class="mb-4" :errors="$errors" />
+
+        <form method="POST" action="{{ route('password.update') }}">
+            @csrf
+
+            <!-- Password Reset Token -->
+            <input type="hidden" name="token" value="{{ $request->route('token') }}">
+
+            <!-- Email Address -->
+            <div>
+                <x-label for="email" :value="__('Email')" />
+
+                <x-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email', $request->email)" required autofocus />
+            </div>
+
+            <!-- Password -->
+            <div class="mt-4">
+                <x-label for="password" :value="__('Password')" />
+
+                <x-input id="password" class="block mt-1 w-full" type="password" name="password" required />
+            </div>
+
+            <!-- Confirm Password -->
+            <div class="mt-4">
+                <x-label for="password_confirmation" :value="__('Confirm Password')" />
+
+                <x-input id="password_confirmation" class="block mt-1 w-full"
+                                    type="password"
+                                    name="password_confirmation" required />
+            </div>
+
+            <div class="flex items-center justify-end mt-4">
+                <x-button>
+                    {{ __('Reset Password') }}
+                </x-button>
+            </div>
+        </form>
+    </x-auth-card>
+</x-guest-layout>

+ 39 - 0
resources/views/auth/verify-email.blade.php

@@ -0,0 +1,39 @@
+<x-guest-layout>
+    <x-auth-card>
+        <x-slot name="logo">
+            <a href="/">
+                <x-application-logo class="w-20 h-20 fill-current text-burnt hover:text-yelmax" />
+            </a>
+        </x-slot>
+
+        <div class="mb-4 text-sm text-crayola">
+            {{ __('Thanks for signing up! Before getting started, could you verify your email address by clicking on the link we just emailed to you? If you didn\'t receive the email, we will gladly send you another.') }}
+        </div>
+
+        @if (session('status') == 'verification-link-sent')
+            <div class="mb-4 font-medium text-sm text-green-600">
+                {{ __('A new verification link has been sent to the email address you provided during registration.') }}
+            </div>
+        @endif
+
+        <div class="mt-4 flex items-center justify-between">
+            <form method="POST" action="{{ route('verification.send') }}">
+                @csrf
+
+                <div>
+                    <x-button>
+                        {{ __('Resend Verification Email') }}
+                    </x-button>
+                </div>
+            </form>
+
+            <form method="POST" action="{{ route('logout') }}">
+                @csrf
+
+                <button type="submit" class="underline text-sm">
+                    {{ __('Log Out') }}
+                </button>
+            </form>
+        </div>
+    </x-auth-card>
+</x-guest-layout>

File diff suppressed because it is too large
+ 134 - 0
resources/views/components/application-logo.blade.php


+ 9 - 0
resources/views/components/auth-card.blade.php

@@ -0,0 +1,9 @@
+<div class="min-h-screen flex flex-col sm:justify-center items-center pt-6 sm:pt-0 bg-fogra">
+    <div>
+        {{ $logo }}
+    </div>
+
+    <div class="w-full sm:max-w-md mt-6 px-6 py-4 bg-coal shadow-md overflow-hidden sm:rounded-lg">
+        {{ $slot }}
+    </div>
+</div>

+ 7 - 0
resources/views/components/auth-session-status.blade.php

@@ -0,0 +1,7 @@
+@props(['status'])
+
+@if ($status)
+    <div {{ $attributes->merge(['class' => 'font-medium text-sm text-green-600']) }}>
+        {{ $status }}
+    </div>
+@endif

+ 15 - 0
resources/views/components/auth-validation-errors.blade.php

@@ -0,0 +1,15 @@
+@props(['errors'])
+
+@if ($errors->any())
+    <div {{ $attributes }}>
+        <div class="font-medium text-red-600">
+            {{ __('Whoops! Something went wrong.') }}
+        </div>
+
+        <ul class="mt-3 list-disc list-inside text-sm text-red-600">
+            @foreach ($errors->all() as $error)
+                <li>{{ $error }}</li>
+            @endforeach
+        </ul>
+    </div>
+@endif

+ 3 - 0
resources/views/components/button.blade.php

@@ -0,0 +1,3 @@
+<button {{ $attributes->merge(['type' => 'submit', 'class' => 'inline-flex items-center px-4 py-2 bg-fogra border border-burnt rounded-md font-semibold text-xs text-white uppercase tracking-widest hover:bg-burnt active:bg-yelmax focus:outline-none disabled:opacity-25 transition ease-in-out duration-150']) }}>
+    {{ $slot }}
+</button>

+ 1 - 0
resources/views/components/dropdown-link.blade.php

@@ -0,0 +1 @@
+<a {{ $attributes->merge(['class' => 'block px-4 py-2 text-sm leading-5 text-crayola hover:text-yelmax hover:bg-field focus:outline-none focus:bg-field transition duration-150 ease-in-out']) }}>{{ $slot }}</a>

+ 43 - 0
resources/views/components/dropdown.blade.php

@@ -0,0 +1,43 @@
+@props(['align' => 'right', 'width' => '48', 'contentClasses' => 'py-1 bg-fogra'])
+
+@php
+switch ($align) {
+    case 'left':
+        $alignmentClasses = 'origin-top-left left-0';
+        break;
+    case 'top':
+        $alignmentClasses = 'origin-top';
+        break;
+    case 'right':
+    default:
+        $alignmentClasses = 'origin-top-right right-0';
+        break;
+}
+
+switch ($width) {
+    case '48':
+        $width = 'w-48';
+        break;
+}
+@endphp
+
+<div class="relative" x-data="{ open: false }" @click.outside="open = false" @close.stop="open = false">
+    <div @click="open = ! open">
+        {{ $trigger }}
+    </div>
+
+    <div x-show="open"
+            x-transition:enter="transition ease-out duration-200"
+            x-transition:enter-start="transform opacity-0 scale-95"
+            x-transition:enter-end="transform opacity-100 scale-100"
+            x-transition:leave="transition ease-in duration-75"
+            x-transition:leave-start="transform opacity-100 scale-100"
+            x-transition:leave-end="transform opacity-0 scale-95"
+            class="absolute z-50 mt-2 {{ $width }} rounded-md shadow-md shadow-burnt {{ $alignmentClasses }}"
+            style="display: none;"
+            @click="open = false">
+        <div class="rounded-md ring-1 ring-black ring-opacity-5 {{ $contentClasses }}">
+            {{ $content }}
+        </div>
+    </div>
+</div>

+ 3 - 0
resources/views/components/input.blade.php

@@ -0,0 +1,3 @@
+@props(['disabled' => false])
+
+<input {{ $disabled ? 'disabled' : '' }} {!! $attributes->merge(['class' => 'rounded-md shadow-sm border-field focus:border-burnt bg-fogra']) !!}>

+ 5 - 0
resources/views/components/label.blade.php

@@ -0,0 +1,5 @@
+@props(['value'])
+
+<label {{ $attributes->merge(['class' => 'block font-medium text-sm text-crayola']) }}>
+    {{ $value ?? $slot }}
+</label>

+ 11 - 0
resources/views/components/nav-link.blade.php

@@ -0,0 +1,11 @@
+@props(['active'])
+
+@php
+$classes = ($active ?? false)
+            ? 'inline-flex items-center px-1 pt-1 border-b-2 border-yelmax text-sm font-medium leading-5 hover:text-yelmax focus:outline-none focus:border-indigo-700 transition duration-150 ease-in-out'
+            : 'inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium leading-5 hover:text-yelmax hover:border-yelmax focus:outline-none focus:text-gray-700 focus:border-gray-300 transition duration-150 ease-in-out';
+@endphp
+
+<a {{ $attributes->merge(['class' => $classes]) }}>
+    {{ $slot }}
+</a>

+ 11 - 0
resources/views/components/responsive-nav-link.blade.php

@@ -0,0 +1,11 @@
+@props(['active'])
+
+@php
+$classes = ($active ?? false)
+            ? 'block pl-3 pr-4 py-2 border-l-4 border-yelmax text-base font-medium text-fogra hover:text-yelmax focus:outline-none focus:text-yelmax transition duration-150 ease-in-out'
+            : 'block pl-3 pr-4 py-2 border-l-4 border-transparent text-base font-medium text-fogra hover:text-yelmax focus:outline-none transition duration-150 ease-in-out';
+@endphp
+
+<a {{ $attributes->merge(['class' => $classes]) }}>
+    {{ $slot }}
+</a>

+ 8 - 0
resources/views/components/tab-link.blade.php

@@ -0,0 +1,8 @@
+@php
+    $classes = "p-6 hover:text-yelmax cursor-pointer"
+@endphp
+
+
+<a {{ $attributes->merge(['class' => $classes]) }}>
+    {{ $slot }}
+</a>

+ 17 - 0
resources/views/dashboard.blade.php

@@ -0,0 +1,17 @@
+<x-app-layout>
+    <x-slot name="header">
+        <h2 class="font-semibold text-xl text-gray-800 leading-tight">
+            {{ __('Dashboard') }}
+        </h2>
+    </x-slot>
+
+    <div class="py-12">
+        <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
+            <div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
+                <div class="p-6 bg-white border-b border-gray-200">
+                    You're logged in!
+                </div>
+            </div>
+        </div>
+    </div>
+</x-app-layout>

+ 407 - 0
resources/views/film.blade.php

@@ -0,0 +1,407 @@
+<x-app-layout>
+    <x-slot name="header">
+        <div class="float-right flex space-x-2">
+            <a href="https://themoviedb.org/movie/{{ $tmdb->getId() }}"><img src="/img/tmdb.svg" class="max-h-7 w-8"></a>
+            <a href="https://imdb.com/title/{{ $tmdb->getImdbId() }}"><img src="/img/IMDb_Logo_Square.svg" class="max-h-7"></a>
+        </div>
+        <h2 class="font-semibold text-xl text-burnt leading-tight">
+            {{ $tmdb->getTitle() }}
+        </h2>
+        <div class="text-burnt italic mt-2 text-lg">{{ $tmdb->getTagline() }}</div>
+    </x-slot>
+
+    <div class="py-12">
+        <div class="max-w-7xl mx-auto sm:px-6 lg:px-8 text-crayola" x-data="{ tab: 'fact' }">
+             <!-- Session Status -->
+            <x-auth-session-status class="mb-4 border border-burnt p-2 rounded-lg bg-coal mx-auto max-w-xs" :status="session('status')" />
+            @if (!is_null($film->seen))
+            <div id="gesehen" class="border border-burnt p-2 rounded-lg flex mb-6 bg-coal mx-auto max-w-xs sm:ml-0">
+                <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
+                    <path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7" />
+                </svg>
+                Gesehen am {{ \Carbon\Carbon::parse($film->seen)->format('d.m.Y') }}
+            </div>
+            @elseif (!is_null($film->rejected))
+            <div id="gesehen" class="border border-burnt p-2 rounded-lg flex mb-6 bg-coal mx-auto max-w-xs sm:ml-0">
+                <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 mr-1" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
+                    <path stroke-linecap="round" stroke-linejoin="round" d="M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636" />
+                  </svg>
+                Abgelehnt am {{ \Carbon\Carbon::parse($film->rejected)->format('d.m.Y') }}
+            </div>
+            @elseif(!is_null(auth()->user()) && auth()->user()->isAdmin())
+            <div class="flex content-start" x-data="{confseen: false, confdel: false, confnext: false}">
+                @if(!$film->isNext())
+                <div
+                class="border p-2 rounded-lg flex mb-6 bg-coal max-w-xs mr-2 ml-2 sm:ml-0 cursor-pointer hover:text-coal border-burnt"
+                :class="confnext ? 'bg-burnt text-coal hover:bg-crayola' : 'hover:bg-burnt'"
+                @click="confnext ? location.href='/film/mark/{{ $film->id }}/next' : confnext = true"
+                @click.outside="confnext = false"
+            >
+                <span x-text="confnext ? 'Als nächstes sehen?' : ''"></span>
+                <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 mx-1" viewBox="0 0 640 512" stroke="currentColor">
+                    <path fill="currentColor" d="M592 0H48A48 48 0 0 0 0 48v320a48 48 0 0 0 48 48h240v32H112a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H352v-32h240a48 48 0 0 0 48-48V48a48 48 0 0 0-48-48zm-16 352H64V64h512z"/>
+                </svg>
+            </div>
+            @endif
+            <div
+                class="border p-2 rounded-lg flex mb-6 bg-coal max-w-xs mr-2  ml-2 sm:ml-0 cursor-pointer hover:text-coal border-burnt"
+                :class="confseen ? 'bg-burnt text-coal hover:bg-crayola' : 'hover:bg-burnt'"
+                @click="confseen ? location.href='/film/mark/{{ $film->id }}/seen' : confseen = true"
+                @click.outside="confseen = false"
+            >
+                <span x-text="confseen ? 'Wirklich gesehen?' : ''"></span>
+                <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
+                    <path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7" />
+                </svg>
+            </div>
+            <div
+                class="border p-2 rounded-lg flex mb-6 bg-coal max-w-xs mr-2 cursor-pointer hover:text-coal border-burnt"
+                :class="confdel ? 'bg-burnt text-coal hover:bg-crayola' : 'hover:bg-burnt'"
+                @click="confdel ? location.href='/film/mark/{{ $film->id }}/deny' : confdel = true"
+                @click.outside="confdel = false">
+                <span x-text="confdel ? 'Wirklich ablehnen?' : ''"></span>
+                <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
+                    <path stroke-linecap="round" stroke-linejoin="round" d="M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636" />
+                  </svg>
+            </div>
+            </div>
+            @endif
+
+            <img src="{{ $image->getUrl($tmdb->getPosterImage(), 'w342') }}" alt="{{ $tmdb->getTitle() }} Poster" class="rounded-lg mx-auto mb-6 lg:float-right lg:mx-0 lg:ml-6 shadow-md shadow-burnt">
+
+            <div class="sm:rounded-lg bg-coal flex mb-6 px-4">
+                <a class="p-6 hover:text-yelmax cursor-pointer" x-bind:class="tab == 'fact' ? 'border-b-2 border-yelmax' : ''" @@click="tab = 'fact'">Allgemein</a>
+                <a class="p-6 hover:text-yelmax cursor-pointer" x-bind:class="tab == 'cast' ? 'border-b-2 border-yelmax' : ''" @@click="tab = 'cast'">Schauspieler</a>
+                <a class="p-6 hover:text-yelmax cursor-pointer" x-bind:class="tab == 'vids' ? 'border-b-2 border-yelmax' : ''" @@click="tab = 'vids'">Trailer</a>
+            </div>
+
+            <div id="#allgemein" class="px-4 grid grid-cols-2 gap-2" x-show="tab == 'fact'" x-transition>
+                <div class="font-bold">Vorgeschlagen von</div>
+                <div class="flex"><img src="/avatar/{{$film->suggester->getAvatar() }}" class="max-h-7 rounded-lg mr-2"> {{ $film->suggester->name }}</div>
+
+                <div class="font-bold">Originaltitel</div>
+                <div>„{{ $tmdb->getOriginalTitle() }}“ ({{ $tmdb->getOriginalLanguage() }})</div>
+
+                <div class="font-bold">Laufzeit</div>
+                <div>{{ $tmdb->getRuntime() }} Minuten</div>
+
+                <div class="font-bold">Erschienen</div>
+                <div>{{ $tmdb->getReleaseDate()->format('d.m.Y') }} -
+                    @foreach ($tmdb->getProductionCountries() as $co)
+                    <abbr title="{{$co->getName()}}">{{$co->getIso31661()}}</abbr>
+                    @endforeach
+                </div>
+
+                <div class="font-bold">Genre</div>
+                <div class="flex flex-wrap space-x-1">
+                    @foreach ($tmdb->getGenres() as $genre)
+                        <div class="bg-coal rounded-lg p-1">{{ $genre->getName() }}</div>
+                    @endforeach
+                </div>
+
+                <div class="font-bold">TMDB Bewertung</div>
+                <div class="">{{ $tmdb->getVoteAverage() }} von 10</div>
+
+                @if($film->getBewertung() > 0)
+                <div class="font-bold">Dumbo Bewertung</div>
+                <div class="">{{ number_format($film->getBewertung(), 2, '.', '')}} von 10</div>
+                @endif
+
+                <div class="font-bold">Flatrate Stream</div>
+                <div class="flex flex-wrap space-x-1">
+                    @forelse($tmdb->getWatchProviders()->filter(
+                        function($key, $value) {
+                            return $value->getIso31661() == 'DE' && count($value->getFlatrate()) > 0;
+                        }
+                    ) as $wp)
+                    @foreach($wp->getFlatrate() as $p)
+                        <img src="{{ $image->getUrl($p->getLogoPath(), 'w45') }}" title="{{ $p->getName() }}" class="rounded-lg max-h-8">
+                    @endforeach
+                    @empty
+                        <div class="italic">Keine</div>
+                    @endforelse
+                </div>
+
+
+                <div class="font-bold">Kaufen / Leihen</div>
+                <div class="flex flex-wrap space-x-1">
+                    @foreach($tmdb->getWatchProviders()->filter(
+                        function($key, $value) {
+                            return $value->getIso31661() == 'DE' && (count($value->getRent()) > 0 || count($value->getBuy()) > 0);
+                        }
+                    ) as $wp)
+                        @foreach($wp->getRent() as $p)
+                            <img src="{{ $image->getUrl($p->getLogoPath(), 'w45') }}" title="{{ $p->getName() }}" class="rounded-lg max-h-8">
+                        @endforeach
+                    @endforeach
+                </div>
+
+                <div class="col-span-2 font-bold">Handlung</div>
+                <div class="col-span-2 font-serif border-l-4 border-burnt pl-6">{{ $tmdb->getOverview() }}</div>
+
+
+            </div>
+
+            <div id="#schauspieler" class="px-4 grid grid-cols-4 gap-2" x-show="tab == 'cast'" x-transition>
+                @foreach($tmdb->getCredits()->getCast() as $role)
+                    @if ($loop->index > 11)
+                        @break
+                    @endif
+                    <div class="pb-2">
+                        @if ($role->getProfileImage() != "")
+                        <img src="{{ $image->getUrl($role->getProfileImage() , "w185") }}" class="rounded-lg mb-1">
+                        @else
+                        <img src="/img/no-portrait.png" class="rounded-lg mb-1">
+                        @endif
+                        <div class="font-bold">{{ $role->getName() }}</div>
+                        <div class="text-burnt">{{ $role->getCharacter() }}</div>
+                    </div>
+                @endforeach
+            </div>
+
+            <div id="trailer" class="px-4" x-show="tab == 'vids'" x-transition>
+                @foreach ($tmdb->getVideos()->filter(
+                    function($key, $value) {
+                        return $value->getType() == "Trailer";
+                    }
+                ) as $vid)
+                    <div class="font-bold">{{ $vid->getName() }}</div>
+                    <div class="relative overflow-hidden w-full sm:w-[calc(100%-384px)] after:block after:pt-[56.25%]">
+                    <iframe class="absolute top-0 left-0 w-full h-full" src="//www.youtube.com/embed/{{ $vid->getKey() }}" frameborder="0" allowfullscreen></iframe>
+                    </div>
+                @endforeach
+            </div>
+        </div>
+    </div>
+
+    @php
+        $votes = $film->votes()->count();
+        if(!is_null(auth()->user()))
+            $uvote = $film->votes()->where('user', auth()->id())->first();
+    @endphp
+    @if( $votes > 0 || (is_null($film->seen) && is_null($film->rejected)))
+    <div class="py-6 " id="voting">
+        <div class="max-w-7xl mx-auto sm:px-6 lg:px-8 text-crayola ">
+            <h2 class="font-semibold text-xl text-crayola leading-tight sm:rounded-lg bg-coal mb-6 p-4">
+                Abstimmung
+            </h2>
+
+            @if($votes > 0)
+            <div class="px-2">
+                <p>
+                    Insgesamt haben <b>{{ $votes }}</b> Personen abgestimmt.
+                    <b>{{ $film->votes->where('vote', 1)->count() }}</b> waren <i>dafür</i>.
+                    @if(!is_null(auth()->user()))
+                    Du hast {!! is_null($uvote) ? '<i>nicht</i> ab' : ($uvote->vote == 0 ? '<i>nicht dafür</i> ' : '<i>dafür</i> ') !!}gestimmt.
+                    @endif
+                </p>
+                <div class="grid grid-cols-2 gap-2">
+                    <div class="text-burnt">Dafür</div>
+                    <div class="text-burnt">Nicht dafür</div>
+
+                    <div class="flex flex-col sm:flex-row flex-wrap">
+                        @foreach($film->votes->reject( function ($v) { return $v->vote == 0; }) as $vote)
+                        <div class="flex mb-1 mr-1 p-2 border border-burnt rounded-lg {{ $vote->voter->isActive() ? '' : 'italic border-coal text-field' }}"><img src="/avatar/{{$vote->voter->getAvatar() }}" class="max-h-6 rounded-lg mr-1"> {{ $vote->voter->name }}</div>
+                        @endforeach
+                    </div>
+
+                    <div class="flex flex-col sm:flex-row flex-wrap">
+                        @foreach($film->votes->reject( function ($v) { return $v->vote == 1; }) as $vote)
+                        <div class="flex mb-1 mr-1 p-2 border border-burnt rounded-lg {{ $vote->voter->isActive() ? '' : 'italic border-coal text-field' }}"><img src="/avatar/{{$vote->voter->getAvatar() }}" class="max-h-6 rounded-lg mr-1"> {{ $vote->voter->name }}</div>
+                        @endforeach
+                    </div>
+                </div>
+            </div>
+            @endif
+            @if(is_null($film->seen) && is_null($film->rejected) && !is_null(auth()->user()))
+                <div class="py-6">
+                    <div class="flex mx-auto w-80">
+                        <a href="/film/vote/{{ $film->id }}/1" class="flex rounded-l-lg border-2 border-r-0 border-burnt p-4 w-40">
+                            <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-burnt" viewBox="0 0 20 20" fill="currentColor">
+                                <path d="M9 2a1 1 0 000 2h2a1 1 0 100-2H9z" />
+                                <path fill-rule="evenodd" d="M4 5a2 2 0 012-2 3 3 0 003 3h2a3 3 0 003-3 2 2 0 012 2v11a2 2 0 01-2 2H6a2 2 0 01-2-2V5zm9.707 5.707a1 1 0 00-1.414-1.414L9 12.586l-1.293-1.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd" />
+                            </svg>
+                            Dafür
+                        </a>
+                        <a href="/film/vote/{{ $film->id }}/0"  class="flex rounded-r-lg border-2 border-l-1 border-burnt p-4 w-40">
+                            <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-burnt" viewBox="0 0 20 20" fill="currentColor">
+                                <path d="M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z" />
+                                <path d="M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z" />
+                            </svg>
+                            Nicht dafür
+                        </a>
+                    </div>
+                </div>
+            @endif
+        </div>
+    </div>
+    @endif
+
+    <div class="py-6 ">
+        <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-crayola">
+            <h2 class="font-semibold text-xl text-crayola leading-tight  sm:rounded-lg bg-coal mb-6 p-4">
+                Kommentare
+            </h2>
+
+            <div class="px-2">
+            @if (is_null(auth()->user()))
+                <p>Melde Dich an, um diesen Film zu kommentieren.</p>
+            @else
+                <div>
+                    <img src="/avatar/{{ auth()->user()->getAvatar() }}" alt="User Avatar" class="rounded-lg w-16 float-left mr-2">
+                    <div class="">
+                        <h4 class="font-semibold">Neuer Kommentar</h4>
+                        <div class="flex" x-data="{ stars: 0 }">
+                            <input type="hidden" name="vote" id="vote" x-bind:value="stars">
+                            <p @@click="stars = 0">Bewerten: </p>
+                            <div @@click="stars = 1">
+                                <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 1 ? 'text-burnt' : ''">
+                                    <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                  </svg>
+                            </div>
+                            <div @@click="stars = 2">
+                                <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 2 ? 'text-burnt' : ''">
+                                    <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                  </svg>
+                            </div>
+                            <div @@click="stars = 3">
+                                <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 3 ? 'text-burnt' : ''">
+                                    <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                  </svg>
+                            </div>
+                            <div @@click="stars = 4">
+                                <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 4 ? 'text-burnt' : ''">
+                                    <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                  </svg>
+                            </div>
+                            <div @@click="stars = 5">
+                                <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 5 ? 'text-burnt' : ''">
+                                    <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                  </svg>
+                            </div>
+                            <div @@click="stars = 6">
+                                <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 6 ? 'text-burnt' : ''">
+                                    <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                  </svg>
+                            </div>
+                            <div @@click="stars = 7">
+                                <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 7 ? 'text-burnt' : ''">
+                                    <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                  </svg>
+                            </div>
+                            <div @@click="stars = 8">
+                                <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 8 ? 'text-burnt' : ''">
+                                    <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                  </svg>
+                            </div>
+                            <div @@click="stars = 9">
+                                <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 9 ? 'text-burnt' : ''">
+                                    <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                  </svg>
+                            </div>
+                            <div @@click="stars = 10">
+                                <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 10 ? 'text-burnt' : ''">
+                                    <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                  </svg>
+                            </div>
+                        </div>
+                        <textarea class="block w-[calc(100%-4.5rem)] my-1 rounded-lg border-1 border-field bg-coal"></textarea>
+                        <x-button class="ml-[4.5rem]">Absenden</x-button>
+                    </div>
+                </div>
+            @endif
+            @foreach ($film->comments()->orderBy('created_at', 'DESC')->get() as $comment)
+                <div class="clear-left my-2 min-h-[4rem]" x-data="{edit: false}">
+                    <img src="/avatar/{{ $comment->author->getAvatar() }}" alt="{{ $comment->author->name }} Avatar" class="rounded-lg w-16 float-left mr-2">
+                    <h4 class="font-bold">
+                        {{ $comment->author->name }}
+                        <span class="text-sm font-light">
+                            {{ \Carbon\Carbon::parse($comment->created_at)->format('d.m.Y H:i') }}
+                            @if ($comment->updated_at != $comment->created_at)
+                                &mdash; Zuletzt bearbeitet: {{ \Carbon\Carbon::parse($comment->updated_at)->format('d.m.Y H:i') }}
+                            @endif
+                        </span>
+                    </h4>
+                    @if($comment->evaluation > 0)
+                    <div class="flex" title="{{ $comment->evaluation }}" x-show="!edit">
+                        @for ($i = 0; $i < $comment->evaluation; $i++)
+                            <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-burnt" viewBox="0 0 20 20" fill="currentColor">
+                            <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                            </svg>
+                        @endfor
+                    <span>({{$comment->evaluation}})</span>
+                    </div>
+                    @endif
+                    @if(!is_null(auth()->user()) && auth()->user()->id == $comment->author->id)
+                        <button class="text-yelmax float-right" @@click="edit = !edit" x-text="edit ? 'Abbrechen' : 'Bearbeiten'"></button>
+                        <p x-show="!edit" x-transition>{{ $comment->body }}</p>
+                        <div x-show="edit" x-transition>
+                            @if($comment->evaluation > 0)
+                            <div class="flex" x-data="{ stars: {{ $comment->evaluation }} }">
+                                <input type="hidden" name="vote" id="vote" x-bind:value="stars">
+                                <p @@click="stars = 0">Bewerten: </p>
+                                <div @@click="stars = 1">
+                                    <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 1 ? 'text-burnt' : ''">
+                                        <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                      </svg>
+                                </div>
+                                <div @@click="stars = 2">
+                                    <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 2 ? 'text-burnt' : ''">
+                                        <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                      </svg>
+                                </div>
+                                <div @@click="stars = 3">
+                                    <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 3 ? 'text-burnt' : ''">
+                                        <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                      </svg>
+                                </div>
+                                <div @@click="stars = 4">
+                                    <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 4 ? 'text-burnt' : ''">
+                                        <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                      </svg>
+                                </div>
+                                <div @@click="stars = 5">
+                                    <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 5 ? 'text-burnt' : ''">
+                                        <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                      </svg>
+                                </div>
+                                <div @@click="stars = 6">
+                                    <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 6 ? 'text-burnt' : ''">
+                                        <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                      </svg>
+                                </div>
+                                <div @@click="stars = 7">
+                                    <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 7 ? 'text-burnt' : ''">
+                                        <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                      </svg>
+                                </div>
+                                <div @@click="stars = 8">
+                                    <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 8 ? 'text-burnt' : ''">
+                                        <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                      </svg>
+                                </div>
+                                <div @@click="stars = 9">
+                                    <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 9 ? 'text-burnt' : ''">
+                                        <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                      </svg>
+                                </div>
+                                <div @@click="stars = 10">
+                                    <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" x-bind:class="stars >= 10 ? 'text-burnt' : ''">
+                                        <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                      </svg>
+                                </div>
+                            </div>
+                            @endif
+                            <textarea class="block w-[calc(100%-4.5rem)] my-1 rounded-lg border-1 border-field bg-coal">{{ $comment->body }}</textarea>
+                            <x-button class="ml-[4.5rem]">Speichern</x-button>
+                        </div>
+                    @else
+                        <p>{{ $comment->body }}</p>
+                    @endif
+
+                </div>
+            @endforeach
+            </div>
+        </div>
+    </div>
+</x-app-layout>

+ 36 - 0
resources/views/layouts/app.blade.php

@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
+    <head>
+        <meta charset="utf-8">
+        <meta name="viewport" content="width=device-width, initial-scale=1">
+        <meta name="csrf-token" content="{{ csrf_token() }}">
+
+        <title>{{ config('app.name', 'Laravel') }}</title>
+
+        <!-- Fonts -->
+        <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap">
+
+        <!-- Styles -->
+        <link rel="stylesheet" href="{{ asset('css/app.css') }}">
+
+        <!-- Scripts -->
+        <script src="{{ asset('js/app.js') }}" defer></script>
+    </head>
+    <body class="font-sans antialiased">
+        <div class="min-h-screen bg-fogra">
+            @include('layouts.navigation')
+
+            <!-- Page Heading -->
+            <header class="bg-coal shadow">
+                <div class="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8">
+                    {{ $header }}
+                </div>
+            </header>
+
+            <!-- Page Content -->
+            <main>
+                {{ $slot }}
+            </main>
+        </div>
+    </body>
+</html>

+ 24 - 0
resources/views/layouts/guest.blade.php

@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
+    <head>
+        <meta charset="utf-8">
+        <meta name="viewport" content="width=device-width, initial-scale=1">
+        <meta name="csrf-token" content="{{ csrf_token() }}">
+
+        <title>{{ config('app.name', 'Laravel') }}</title>
+
+        <!-- Fonts -->
+        <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap">
+
+        <!-- Styles -->
+        <link rel="stylesheet" href="{{ asset('css/app.css') }}">
+
+        <!-- Scripts -->
+        <script src="{{ asset('js/app.js') }}" defer></script>
+    </head>
+    <body>
+        <div class="font-sans text-crayola antialiased">
+            {{ $slot }}
+        </div>
+    </body>
+</html>

+ 118 - 0
resources/views/layouts/navigation.blade.php

@@ -0,0 +1,118 @@
+<nav x-data="{ open: false }" class="bg-burnt shadow">
+    <!-- Primary Navigation Menu -->
+    <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
+        <div class="flex justify-between h-16">
+            <div class="flex">
+                <!-- Logo -->
+                <div class="shrink-0 flex items-center">
+                    <a href="{{ route('home') }}">
+                        <x-application-logo class="block h-14 w-auto fill-current text-fogra hover:text-yelmax font-bold" />
+                    </a>
+                </div>
+
+                <!-- Navigation Links -->
+                <div class="hidden space-x-8 sm:-my-px sm:ml-10 sm:flex">
+                    <x-nav-link class="text-fogra"  :href="route('vorschlag')" :active="request()->routeIs('vorschlag')">
+                        {{ __('Vorschläge') }}
+                    </x-nav-link>
+                    <x-nav-link class="text-fogra" :href="route('gesehen')" :active="request()->routeIs('gesehen')">
+                        {{ __('Archiv') }}
+                    </x-nav-link>
+                    <x-nav-link class="text-fogra" :href="route('neu')" :active="request()->routeIs('neu')">
+                        {{ __('Film vorschlagen') }}
+                    </x-nav-link>
+                </div>
+            </div>
+
+            <!-- Settings Dropdown -->
+            <div class="hidden sm:flex sm:items-center sm:ml-6">
+                @if (Auth::check())
+                <x-dropdown align="right" width="48">
+                    <x-slot name="trigger">
+                        <button class="flex items-center text-sm font-medium text-fogra hover:text-yelmax hover:border-yelmax focus:outline-none focus:text-yelmax focus:border-yelmax transition duration-150 ease-in-out">
+                            <div>{{ Auth::user()->name }}</div>
+
+                            <div class="ml-1">
+                                <svg class="fill-current h-4 w-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
+                                    <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd" />
+                                </svg>
+                            </div>
+                        </button>
+                    </x-slot>
+
+                    <x-slot name="content">
+                        <!-- Authentication -->
+                        <form method="POST" action="{{ route('logout') }}">
+                            @csrf
+
+                            <x-dropdown-link :href="route('logout')"
+                                    onclick="event.preventDefault();
+                                                this.closest('form').submit();">
+                                {{ __('Log Out') }}
+                            </x-dropdown-link>
+                        </form>
+                    </x-slot>
+                </x-dropdown>
+                @else
+                <div class="hidden space-x-8 sm:-my-px sm:ml-10 sm:flex">
+                    <x-nav-link :href="route('login')" :active="request()->routeIs('login')">
+                        {{ __('login') }}
+                    </x-nav-link>
+                </div>
+                @endif
+            </div>
+
+            <!-- Hamburger -->
+            <div class="-mr-2 flex items-center sm:hidden">
+                <button @click="open = ! open" class="inline-flex items-center justify-center p-2 rounded-md text-fogra hover:text-yelmax focus:outline-none transition duration-150 ease-in-out">
+                    <svg class="h-6 w-6" stroke="currentColor" fill="none" viewBox="0 0 24 24">
+                        <path :class="{'hidden': open, 'inline-flex': ! open }" class="inline-flex" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
+                        <path :class="{'hidden': ! open, 'inline-flex': open }" class="hidden" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
+                    </svg>
+                </button>
+            </div>
+        </div>
+    </div>
+
+    <!-- Responsive Navigation Menu -->
+    <div :class="{'block': open, 'hidden': ! open}" class="hidden sm:hidden">
+        <div class="pt-2 pb-3 space-y-1">
+            <x-responsive-nav-link :href="route('vorschlag')" :active="request()->routeIs('vorschlag')">
+                {{ __('Vorschläge') }}
+            </x-responsive-nav-link>
+            <x-responsive-nav-link :href="route('neu')" :active="request()->routeIs('neu')">
+                {{ __('Film vorschlagen') }}
+            </x-responsive-nav-link>
+            <x-responsive-nav-link :href="route('gesehen')" :active="request()->routeIs('gesehen')">
+                {{ __('Archiv') }}
+            </x-responsive-nav-link>
+        </div>
+
+        <!-- Responsive Settings Options -->
+        <div class="pt-4 pb-1 border-t border-field">
+            @if (Auth::check())
+            <div class="px-4">
+                <div class="font-medium text-base text-fogra">{{ Auth::user()->name }}</div>
+                <div class="font-medium text-sm text-field">{{ Auth::user()->email }}</div>
+            </div>
+
+            <div class="mt-3 space-y-1">
+                <!-- Authentication -->
+                <form method="POST" action="{{ route('logout') }}">
+                    @csrf
+
+                    <x-responsive-nav-link :href="route('logout')"
+                            onclick="event.preventDefault();
+                                        this.closest('form').submit();">
+                        {{ __('Log Out') }}
+                    </x-responsive-nav-link>
+                </form>
+            </div>
+            @else
+                <x-responsive-nav-link :href="route('login')" :active="request()->routeIs('login')">
+                    {{ __('Login') }}
+                </x-responsive-nav-link>
+            @endif
+        </div>
+    </div>
+</nav>

+ 40 - 0
resources/views/localsearch.blade.php

@@ -0,0 +1,40 @@
+@foreach($filme as $film)
+    @if($loop->first)
+    <div class="sm:rounded-lg bg-coal text-yelmax mt-6 p-4">Gesehene, vorgeschlagene & abgelehnte Filme</div>
+    <div class="flex flex-wrap">
+    @endif
+    <a class="my-4 px-4 w-full md:w-1/3 lg:w-1/4 xl:w-1/5 flex-grow-0 flex-shrink-0 block" href="/film/{{$film->id}}">
+        <img src="{{ $ihelp->getUrl($film->poster, 'w92') }}" alt ="{{$film->title}}" class="rounded-lg shadow-md shadow-burnt float-left mr-2">
+        <div class="text-yelmax font-semibold">{{ $film->name }}</div>
+        @if(!is_null($film->seen))
+            <div class="flex">
+                <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 mr-2 text-green-600" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
+                    <path stroke-linecap="round" stroke-linejoin="round" d="M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z" />
+                  </svg>
+                  {{ \Carbon\Carbon::parse($film->seen)->format('d.m.Y') }}
+            </div>
+        @elseif(!is_null($film->rejected))
+            <div class="flex">
+                <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 mr-2 text-red-600" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
+                    <path stroke-linecap="round" stroke-linejoin="round" d="M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636" />
+                </svg>
+                {{ \Carbon\Carbon::parse($film->rejected)->format('d.m.Y') }}
+            </div>
+        @else
+            <div class="text-field flex my-2">
+                <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 mr-2 text-yelmax" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
+                    <path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />
+                </svg>
+                {{ \Carbon\Carbon::parse($film->suggested)->format('d.m.Y') }}
+            </div>
+        @endif
+        <div class="text-field flex my-2"><img src="/avatar/{{$film->suggester->getAvatar() }}" class="max-h-7 rounded-lg mr-2"> {{ $film->suggester->name }}</div>
+        </a>
+    @if($loop->last)
+        </div>
+    @endif
+@endforeach
+
+@if($count > 12)
+    <div class="w-full text-center italic mt-2">Es gibt weitere Suchergebnisse. Grenze die Suche ein, falls das gewünschte Ergebnis nicht gefunden wurde.</div>
+@endif

+ 221 - 0
resources/views/main.blade.php

@@ -0,0 +1,221 @@
+<x-app-layout>
+    <x-slot name="header">
+        <h2 class="font-semibold text-xl text-burnt leading-tight">
+            {{ __('Dumbo Filmabendplaner') }}
+        </h2>
+    </x-slot>
+
+    <div class="py-12">
+        <div class="max-w-7xl mx-auto sm:px-6 lg:px-8 container">
+            <div class="">
+                <a href="/film/{{$feature->id}}">
+                <div class="p-6 sm:rounded-lg h-96 relative" style="
+                    background: linear-gradient(to bottom right, #000000, #000000be, #00000000),
+                     url('{{ $image->getUrl($ftmdb->getBackdropImage(), 'original') }}') center center/cover;">
+
+                     <img src="{{ $image->getUrl($ftmdb->getPosterImage(), 'w342') }}" alt="{{ $ftmdb->getTitle() }} Poster" class="rounded-lg mx-auto mb-6 sm:float-right sm:mx-0 sm:ml-6 shadow-md shadow-burnt h-80 hidden sm:block">
+
+                     <span class="text-crayola">{{ $ftype === 'next' ? 'Nächster Film' : 'Zuletzt gesehen' }}</span>
+                    <h3 class="text-burnt drop-shadow-[0_4px_3px_#684f43] text-4xl">{{ $feature->name }}</h3>
+                    <div class="text-crayola mt-4">
+                        {{$ftmdb->getTagline()}}
+                    </div>
+                    <div class="flex flex-wrap space-x-1 text-crayola mt-4">
+                        @foreach ($ftmdb->getGenres() as $genre)
+                            <div class="bg-coal rounded-lg p-1">{{ $genre->getName() }}</div>
+                        @endforeach
+                    </div>
+                    <div class="text-crayola max-w-md text-justify mt-4 hidden md:block">
+                        {{ substr($ftmdb->getOverview(), 0, 200) }}...
+                    </div>
+                    <div class="text-yelmax">{{ $ftype == 'next' ? 'Klick für Details' : 'Jetzt bewerten!'}}</div>
+                    <div class="absolute bottom-2 flex text-crayola">
+                        <img src="/avatar/{{$feature->suggester->getAvatar() }}" class="max-h-7 rounded-lg mr-2"> {{ $feature->suggester->name }}
+                        @if ($ftype === 'last')
+                            &middot; Gesehen am {{ \Carbon\Carbon::parse($feature->seen)->format('d.m.Y') }}
+                        @endif
+                    </div>
+                </div>
+                </a>
+            </div>
+
+            <div class="grid grid-cols-1 md:grid-cols-2 gap-4 mt-6">
+                <div class="">
+                    <div class="sm:rounded-lg bg-coal text-crayola text-lg p-4">
+                        Beliebte Vorschläge
+                        <a class="text-sm text-yelmax" href="/vorschlaege">Mehr</a>
+                    </div>
+
+                    <div class="grid grid-cols-1 gap-2 mt-2 " x-data="{active: 1}">
+                        @foreach ($popular as $film)
+                        <a href="/film/{{ $film->id }}"  :class="active == {{ $loop->iteration }} ? 'block' : 'hidden'" x-transition>
+                        <div class="rounded-lg p-2 h-40 bg-black ">
+                            <img src="{{ $image->getUrl($film->poster, 'w92') }}" alt="{{ $film->name }}" class="rounded-lg float-left mr-2 shadow-md shadow-burnt">
+                            <div class="text-burnt text-xl">{{ $film->name }}</div>
+                            <div class="text-crayola flex text-xl">
+                                @php
+                                    $stimme = is_null(auth()->user()) ? null : $film->votes()->where('user', auth()->user()->id)->first();
+                                @endphp
+                                @if (!is_null($stimme) && $stimme->vote == 0)
+                                <svg title="Deine Stimme: Nicht dafür" xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-red-700 sm:h-8 sm:w-8" viewBox="0 0 20 20" fill="currentColor">
+                                    <path d="M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z" />
+                                    <path d="M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z" />
+                                </svg> &middot;
+                                @elseif (!is_null($stimme) && $stimme->vote == 1)
+                                <svg title="Deine Stimme: Dafür" xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-green-900 sm:h-8 sm:w-8" viewBox="0 0 20 20" fill="currentColor">
+                                    <path d="M9 2a1 1 0 000 2h2a1 1 0 100-2H9z" />
+                                    <path fill-rule="evenodd" d="M4 5a2 2 0 012-2 3 3 0 003 3h2a3 3 0 003-3 2 2 0 012 2v11a2 2 0 01-2 2H6a2 2 0 01-2-2V5zm9.707 5.707a1 1 0 00-1.414-1.414L9 12.586l-1.293-1.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd" />
+                                </svg> &middot;
+                                @elseif(auth()->user() !== null)
+                                <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-field sm:h-8 sm:w-8" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
+                                    <path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" />
+                                </svg> &middot;
+                                @endif
+                                <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-burnt sm:h-8 sm:w-8" viewBox="0 0 20 20" fill="currentColor">
+                                    <path d="M9 2a1 1 0 000 2h2a1 1 0 100-2H9z" />
+                                    <path fill-rule="evenodd" d="M4 5a2 2 0 012-2 3 3 0 003 3h2a3 3 0 003-3 2 2 0 012 2v11a2 2 0 01-2 2H6a2 2 0 01-2-2V5zm3 4a1 1 0 000 2h.01a1 1 0 100-2H7zm3 0a1 1 0 000 2h3a1 1 0 100-2h-3zm-3 4a1 1 0 100 2h.01a1 1 0 100-2H7zm3 0a1 1 0 100 2h3a1 1 0 100-2h-3z" clip-rule="evenodd" />
+                                </svg>
+                            {{ $film->activeVotes()->where('vote', 1)->count() }}<span class="text-field">/{{ $film->activeVotes()->count() }}</span>
+                            </div>
+                            <div class="text-xs text-field sm:hidden"> {{ \Carbon\Carbon::parse($film->suggested)->format('d.m.Y') }} &middot; {{ $film->suggester->name }}</div>
+                            <div class="text-field hidden sm:flex my-2">
+                                <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 mr-2" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
+                                    <path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />
+                                  </svg>
+                                  {{ \Carbon\Carbon::parse($film->suggested)->format('d.m.Y') }}
+                            </div>
+                            <div class="text-field hidden sm:flex my-2"><img src="/avatar/{{$film->suggester->getAvatar() }}" class="max-h-7 rounded-lg mr-2"> {{ $film->suggester->name }}</div>
+                        </div></a>
+                        @endforeach
+                        <div class="flex justify-center p-2">
+                            @foreach ($popular as $film)
+                                <img @click="active = {{$loop->iteration}}" :class="active == {{$loop->iteration}} && 'shadow-md shadow-burnt'" src="{{ $image->getUrl($film->poster, 'w92') }}" alt="{{ $film->name }}" class="rounded-lg float-left mr-2 cursor-pointer h-20">
+                            @endforeach
+                        </div>
+                    </div>
+                </div>
+
+                <div class="">
+                    <div class="sm:rounded-lg bg-coal text-crayola text-lg p-4">Neue Vorschläge <a class="text-sm text-yelmax" href="/vorschlaege/neu">Mehr</a></div>
+
+                    <div class="grid grid-cols-1 gap-2 mt-2 " x-data="{active: 1}">
+                        @foreach ($new as $film)
+                        <a href="/film/{{ $film->id }}"  :class="active == {{ $loop->iteration }} ? 'block' : 'hidden'" x-transition>
+                        <div class="rounded-lg p-2 h-40 bg-black ">
+                            <img src="{{ $image->getUrl($film->poster, 'w92') }}" alt="{{ $film->name }}" class="rounded-lg float-left mr-2 shadow-md shadow-burnt">
+                            <div class="text-burnt text-xl">{{ $film->name }}</div>
+                            <div class="text-crayola flex text-xl">
+                                @php
+                                    $stimme = is_null(auth()->user()) ? null : $film->votes()->where('user', auth()->user()->id)->first();
+                                @endphp
+                                @if (!is_null($stimme) && $stimme->vote == 0)
+                                <svg title="Deine Stimme: Nicht dafür" xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-red-700 sm:h-8 sm:w-8" viewBox="0 0 20 20" fill="currentColor">
+                                    <path d="M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z" />
+                                    <path d="M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z" />
+                                </svg> &middot;
+                                @elseif (!is_null($stimme) && $stimme->vote == 1)
+                                <svg title="Deine Stimme: Dafür" xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-green-900 sm:h-8 sm:w-8" viewBox="0 0 20 20" fill="currentColor">
+                                    <path d="M9 2a1 1 0 000 2h2a1 1 0 100-2H9z" />
+                                    <path fill-rule="evenodd" d="M4 5a2 2 0 012-2 3 3 0 003 3h2a3 3 0 003-3 2 2 0 012 2v11a2 2 0 01-2 2H6a2 2 0 01-2-2V5zm9.707 5.707a1 1 0 00-1.414-1.414L9 12.586l-1.293-1.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd" />
+                                </svg> &middot;
+                                @elseif(auth()->user() !== null)
+                                <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-field sm:h-8 sm:w-8" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
+                                    <path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" />
+                                </svg> &middot;
+                                @endif
+                                <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-burnt sm:h-8 sm:w-8" viewBox="0 0 20 20" fill="currentColor">
+                                    <path d="M9 2a1 1 0 000 2h2a1 1 0 100-2H9z" />
+                                    <path fill-rule="evenodd" d="M4 5a2 2 0 012-2 3 3 0 003 3h2a3 3 0 003-3 2 2 0 012 2v11a2 2 0 01-2 2H6a2 2 0 01-2-2V5zm3 4a1 1 0 000 2h.01a1 1 0 100-2H7zm3 0a1 1 0 000 2h3a1 1 0 100-2h-3zm-3 4a1 1 0 100 2h.01a1 1 0 100-2H7zm3 0a1 1 0 100 2h3a1 1 0 100-2h-3z" clip-rule="evenodd" />
+                                </svg>
+                            {{ $film->activeVotes()->where('vote', 1)->count() }}<span class="text-field">/{{ $film->activeVotes()->count() }}</span>
+                            </div>
+                            <div class="text-field flex my-2">
+                                <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 mr-2" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
+                                    <path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />
+                                  </svg>
+                                  {{ \Carbon\Carbon::parse($film->suggested)->format('d.m.Y') }}
+                            </div>
+                            <div class="text-field flex my-2"><img src="/avatar/{{$film->suggester->getAvatar() }}" class="max-h-7 rounded-lg mr-2"> {{ $film->suggester->name }}</div>
+                        </div></a>
+                        @endforeach
+                        <div class="flex justify-center p-2">
+                            @foreach ($new as $film)
+                                <img @click="active = {{$loop->iteration}}" :class="active == {{$loop->iteration}} && 'shadow-md shadow-burnt'" src="{{ $image->getUrl($film->poster, 'w92') }}" alt="{{ $film->name }}" class="rounded-lg float-left mr-2 cursor-pointer h-20">
+                            @endforeach
+                        </div>
+                    </div>
+                </div>
+
+                <div class="">
+                    <div class="sm:rounded-lg bg-coal text-crayola text-lg p-4">Gesehene Filme <a class="text-sm text-yelmax" href="/gesehen">Archiv</a> &middot; <a class="text-sm text-yelmax" href="/abgelehnt">Abgelehnt</a></div>
+
+
+                    <div class="grid grid-cols-1 gap-2 mt-2 " x-data="{active: 1}">
+                        @foreach ($seen as $film)
+                        <a href="/film/{{ $film->id }}"  :class="active == {{ $loop->iteration }} ? 'block' : 'hidden'" x-transition>
+                        <div class="rounded-lg p-2 h-40 bg-black ">
+                            <img src="{{ $image->getUrl($film->poster, 'w92') }}" alt="{{ $film->name }}" class="rounded-lg float-left mr-2 shadow-md shadow-burnt">
+                            <div class="text-burnt text-xl">{{ $film->name }}</div>
+                            <div class="flex sm:text-3xl text-crayola">
+                                @php
+                                    $stimme = is_null(auth()->user()) ? null : $film->votes()->where('user', auth()->user()->id)->first();
+                                @endphp
+                                @if (!is_null($stimme) && $stimme->vote == 0)
+                                <svg title="Deine Stimme: Nicht dafür" xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-red-700 sm:h-8 sm:w-8" viewBox="0 0 20 20" fill="currentColor">
+                                    <path d="M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z" />
+                                    <path d="M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z" />
+                                </svg> &middot;
+                                @elseif (!is_null($stimme) && $stimme->vote == 1)
+                                <svg title="Deine Stimme: Dafür" xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-green-900 sm:h-8 sm:w-8" viewBox="0 0 20 20" fill="currentColor">
+                                    <path d="M9 2a1 1 0 000 2h2a1 1 0 100-2H9z" />
+                                    <path fill-rule="evenodd" d="M4 5a2 2 0 012-2 3 3 0 003 3h2a3 3 0 003-3 2 2 0 012 2v11a2 2 0 01-2 2H6a2 2 0 01-2-2V5zm9.707 5.707a1 1 0 00-1.414-1.414L9 12.586l-1.293-1.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd" />
+                                </svg> &middot;
+                                @endif
+                                <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 sm:h-8 sm:w-8" viewBox="0 0 20 20" fill="currentColor">
+                                    <path d="M2 5a2 2 0 012-2h7a2 2 0 012 2v4a2 2 0 01-2 2H9l-3 3v-3H4a2 2 0 01-2-2V5z" />
+                                    <path d="M15 7v2a4 4 0 01-4 4H9.828l-1.766 1.767c.28.149.599.233.938.233h2l3 3v-3h2a2 2 0 002-2V9a2 2 0 00-2-2h-1z" />
+                                  </svg>
+                                {{ $film->comments()->count() }}
+                                @if($film->getBewertung() > 0)
+                                    &middot;
+                                    <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-burnt sm:h-8 sm:w-8" viewBox="0 0 20 20" fill="currentColor">
+                                        <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
+                                      </svg>
+                                    {{ number_format($film->getBewertung(), 1, '.', '') }}
+                                @endif
+                            </div>
+                            <div class="text-field flex my-2">
+                                <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 mr-2" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
+                                    <path stroke-linecap="round" stroke-linejoin="round" d="M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z" />
+                                  </svg>
+                                  {{ \Carbon\Carbon::parse($film->seen)->format('d.m.Y') }}
+                            </div>
+                            <div class="text-field flex my-2"><img src="/avatar/{{$film->suggester->getAvatar() }}" class="max-h-7 rounded-lg mr-2"> {{ $film->suggester->name }}</div>
+                        </div></a>
+                        @endforeach
+                        <div class="flex justify-center p-2">
+                            @foreach ($seen as $film)
+                                <img @click="active = {{$loop->iteration}}" :class="active == {{$loop->iteration}} && 'shadow-md shadow-burnt'" src="{{ $image->getUrl($film->poster, 'w92') }}" alt="{{ $film->name }}" class="rounded-lg float-left mr-2 cursor-pointer h-20">
+                            @endforeach
+                        </div>
+                    </div>
+                </div>
+
+                <div class="">
+                    <div class="sm:rounded-lg bg-coal text-crayola text-lg p-4">News</div>
+
+                    @foreach($news as $n)
+                        <div class="mt-2" x-data="{active: {{ $loop->first ? 'true': 'false' }}}">
+                            <div @click="active = !active" x-transition class="text-yelmax bg-field sm:rounded-lg p-2 cursor-pointer">
+                                {{$n->headline}} <span class="text-crayola text-xs">{{{ $n->created_at === $n->updated_at ? \Carbon\Carbon::parse($n->created_at)->format('d.m.Y H:i') : \Carbon\Carbon::parse($n->updated_at)->format('d.m.Y H:i') . ' (bearbeitet)' }}}</span>
+                                <div class="float-right flex text-crayola"><img src="/avatar/{{$n->author->getAvatar() }}" class="max-h-7 rounded-lg mr-2"> {{ $n->author->name }}</div>
+                            </div>
+                        <div class="p-2 text-crayola text-justify" x-show="active" x-transition>{!! nl2br($n->body) !!}</div>
+                        </div>
+                    @endforeach
+                </div>
+            </div>
+
+        </div>
+    </div>
+</x-app-layout>

+ 24 - 0
resources/views/remotesearch.blade.php

@@ -0,0 +1,24 @@
+@foreach($filme as $film)
+    @if($loop->first)
+    <div class="sm:rounded-lg bg-coal text-yelmax mt-6 p-4">Neue Filme</div>
+    <div class="p-4">
+    @endif
+        <div class="clear-left mb-6">
+            <img src="{{ $image->getUrl($film->getPosterImage(), 'w92') }}" alt="{{ $film->getTitle() }} Poster" class="rounded-lg mx-auto mb-6 float-left mr-2 shadow-md shadow-burnt max-w-[100px]">
+            <div class="text-yelmax">{{ $film->getTitle() }}</div>
+            <a class="rounded-lg border-burnt cursor-pointer float-right ml-2 p-2 border hover:bg-burnt hover:text-coal" href="/vorschlag/{{ $film->getId() }}">Vorschlagen</a>
+            <div class="text-xs">
+                <span class="text-burnt">{{ $film->getReleaseDate() ? $film->getReleaseDate()->format('Y') : $film->getReleaseDate() }}</span>
+                &middot; Original: <span class="italic">{{ $film->getOriginalTitle() }}</span>
+            </div>
+            <div class="font-serif">{{ $film->getOverview() }}</div>
+        </div>
+    @if($loop->last)
+        </div>
+    @endif
+@endforeach
+
+@if($filme->getTotalPages() > 1)
+    <div class="w-full text-center italic mt-2 clear-both">Es gibt weitere Suchergebnisse. Grenze die Suche ein, falls das gewünschte Ergebnis nicht gefunden wurde.</div>
+@endif
+<div class="w-full text-center italic mt-2 clear-both">Daten bereitgestellt von TheMovieDatabase.</div>

+ 20 - 0
resources/views/suche.blade.php

@@ -0,0 +1,20 @@
+<x-app-layout>
+    <x-slot name="header">
+        <h2 class="font-semibold text-xl text-burnt leading-tight">
+            {{ __($title) }}
+        </h2>
+    </x-slot>
+
+    <div class="py-12">
+        <div class="max-w-7xl mx-auto sm:px-6 lg:px-8 text-crayola" x-data="{term: ''}">
+            <div class="w-full sm:rounded-lg bg-coal px-6 py-4 shadow-md overflow-hidden">
+                <label for="suche" class="block font-medium text-sm text-crayola">Suche nach Film</label>
+                <input id="suche" x-model.debounce.500ms="term" type="search" class="rounded-xl shadow-md border-field focus:border-burnt bg-fogra block mt-1 w-full" autofocus="autofocus">            </div>
+
+            <div x-show="term !== ''">
+            <div x-html="(await axios.get('/api/search/' + term)).data"></div>
+            <div x-html="(await axios.get('/api/remotesearch/' + term)).data"></div>
+            </div>
+        </div>
+    </div>
+</x-app-layout>

+ 46 - 0
resources/views/vendor/pagination/bootstrap-4.blade.php

@@ -0,0 +1,46 @@
+@if ($paginator->hasPages())
+    <nav>
+        <ul class="pagination">
+            {{-- Previous Page Link --}}
+            @if ($paginator->onFirstPage())
+                <li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.previous')">
+                    <span class="page-link" aria-hidden="true">&lsaquo;</span>
+                </li>
+            @else
+                <li class="page-item">
+                    <a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')">&lsaquo;</a>
+                </li>
+            @endif
+
+            {{-- Pagination Elements --}}
+            @foreach ($elements as $element)
+                {{-- "Three Dots" Separator --}}
+                @if (is_string($element))
+                    <li class="page-item disabled" aria-disabled="true"><span class="page-link">{{ $element }}</span></li>
+                @endif
+
+                {{-- Array Of Links --}}
+                @if (is_array($element))
+                    @foreach ($element as $page => $url)
+                        @if ($page == $paginator->currentPage())
+                            <li class="page-item active" aria-current="page"><span class="page-link">{{ $page }}</span></li>
+                        @else
+                            <li class="page-item"><a class="page-link" href="{{ $url }}">{{ $page }}</a></li>
+                        @endif
+                    @endforeach
+                @endif
+            @endforeach
+
+            {{-- Next Page Link --}}
+            @if ($paginator->hasMorePages())
+                <li class="page-item">
+                    <a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next" aria-label="@lang('pagination.next')">&rsaquo;</a>
+                </li>
+            @else
+                <li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.next')">
+                    <span class="page-link" aria-hidden="true">&rsaquo;</span>
+                </li>
+            @endif
+        </ul>
+    </nav>
+@endif

+ 88 - 0
resources/views/vendor/pagination/bootstrap-5.blade.php

@@ -0,0 +1,88 @@
+@if ($paginator->hasPages())
+    <nav class="d-flex justify-items-center justify-content-between">
+        <div class="d-flex justify-content-between flex-fill d-sm-none">
+            <ul class="pagination">
+                {{-- Previous Page Link --}}
+                @if ($paginator->onFirstPage())
+                    <li class="page-item disabled" aria-disabled="true">
+                        <span class="page-link">@lang('pagination.previous')</span>
+                    </li>
+                @else
+                    <li class="page-item">
+                        <a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev">@lang('pagination.previous')</a>
+                    </li>
+                @endif
+
+                {{-- Next Page Link --}}
+                @if ($paginator->hasMorePages())
+                    <li class="page-item">
+                        <a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next">@lang('pagination.next')</a>
+                    </li>
+                @else
+                    <li class="page-item disabled" aria-disabled="true">
+                        <span class="page-link">@lang('pagination.next')</span>
+                    </li>
+                @endif
+            </ul>
+        </div>
+
+        <div class="d-none flex-sm-fill d-sm-flex align-items-sm-center justify-content-sm-between">
+            <div>
+                <p class="small text-muted">
+                    {!! __('Showing') !!}
+                    <span class="font-medium">{{ $paginator->firstItem() }}</span>
+                    {!! __('to') !!}
+                    <span class="font-medium">{{ $paginator->lastItem() }}</span>
+                    {!! __('of') !!}
+                    <span class="font-medium">{{ $paginator->total() }}</span>
+                    {!! __('results') !!}
+                </p>
+            </div>
+
+            <div>
+                <ul class="pagination">
+                    {{-- Previous Page Link --}}
+                    @if ($paginator->onFirstPage())
+                        <li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.previous')">
+                            <span class="page-link" aria-hidden="true">&lsaquo;</span>
+                        </li>
+                    @else
+                        <li class="page-item">
+                            <a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')">&lsaquo;</a>
+                        </li>
+                    @endif
+
+                    {{-- Pagination Elements --}}
+                    @foreach ($elements as $element)
+                        {{-- "Three Dots" Separator --}}
+                        @if (is_string($element))
+                            <li class="page-item disabled" aria-disabled="true"><span class="page-link">{{ $element }}</span></li>
+                        @endif
+
+                        {{-- Array Of Links --}}
+                        @if (is_array($element))
+                            @foreach ($element as $page => $url)
+                                @if ($page == $paginator->currentPage())
+                                    <li class="page-item active" aria-current="page"><span class="page-link">{{ $page }}</span></li>
+                                @else
+                                    <li class="page-item"><a class="page-link" href="{{ $url }}">{{ $page }}</a></li>
+                                @endif
+                            @endforeach
+                        @endif
+                    @endforeach
+
+                    {{-- Next Page Link --}}
+                    @if ($paginator->hasMorePages())
+                        <li class="page-item">
+                            <a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next" aria-label="@lang('pagination.next')">&rsaquo;</a>
+                        </li>
+                    @else
+                        <li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.next')">
+                            <span class="page-link" aria-hidden="true">&rsaquo;</span>
+                        </li>
+                    @endif
+                </ul>
+            </div>
+        </div>
+    </nav>
+@endif

+ 46 - 0
resources/views/vendor/pagination/default.blade.php

@@ -0,0 +1,46 @@
+@if ($paginator->hasPages())
+    <nav>
+        <ul class="pagination">
+            {{-- Previous Page Link --}}
+            @if ($paginator->onFirstPage())
+                <li class="disabled" aria-disabled="true" aria-label="@lang('pagination.previous')">
+                    <span aria-hidden="true">&lsaquo;</span>
+                </li>
+            @else
+                <li>
+                    <a href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')">&lsaquo;</a>
+                </li>
+            @endif
+
+            {{-- Pagination Elements --}}
+            @foreach ($elements as $element)
+                {{-- "Three Dots" Separator --}}
+                @if (is_string($element))
+                    <li class="disabled" aria-disabled="true"><span>{{ $element }}</span></li>
+                @endif
+
+                {{-- Array Of Links --}}
+                @if (is_array($element))
+                    @foreach ($element as $page => $url)
+                        @if ($page == $paginator->currentPage())
+                            <li class="active" aria-current="page"><span>{{ $page }}</span></li>
+                        @else
+                            <li><a href="{{ $url }}">{{ $page }}</a></li>
+                        @endif
+                    @endforeach
+                @endif
+            @endforeach
+
+            {{-- Next Page Link --}}
+            @if ($paginator->hasMorePages())
+                <li>
+                    <a href="{{ $paginator->nextPageUrl() }}" rel="next" aria-label="@lang('pagination.next')">&rsaquo;</a>
+                </li>
+            @else
+                <li class="disabled" aria-disabled="true" aria-label="@lang('pagination.next')">
+                    <span aria-hidden="true">&rsaquo;</span>
+                </li>
+            @endif
+        </ul>
+    </nav>
+@endif

+ 36 - 0
resources/views/vendor/pagination/semantic-ui.blade.php

@@ -0,0 +1,36 @@
+@if ($paginator->hasPages())
+    <div class="ui pagination menu" role="navigation">
+        {{-- Previous Page Link --}}
+        @if ($paginator->onFirstPage())
+            <a class="icon item disabled" aria-disabled="true" aria-label="@lang('pagination.previous')"> <i class="left chevron icon"></i> </a>
+        @else
+            <a class="icon item" href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')"> <i class="left chevron icon"></i> </a>
+        @endif
+
+        {{-- Pagination Elements --}}
+        @foreach ($elements as $element)
+            {{-- "Three Dots" Separator --}}
+            @if (is_string($element))
+                <a class="icon item disabled" aria-disabled="true">{{ $element }}</a>
+            @endif
+
+            {{-- Array Of Links --}}
+            @if (is_array($element))
+                @foreach ($element as $page => $url)
+                    @if ($page == $paginator->currentPage())
+                        <a class="item active" href="{{ $url }}" aria-current="page">{{ $page }}</a>
+                    @else
+                        <a class="item" href="{{ $url }}">{{ $page }}</a>
+                    @endif
+                @endforeach
+            @endif
+        @endforeach
+
+        {{-- Next Page Link --}}
+        @if ($paginator->hasMorePages())
+            <a class="icon item" href="{{ $paginator->nextPageUrl() }}" rel="next" aria-label="@lang('pagination.next')"> <i class="right chevron icon"></i> </a>
+        @else
+            <a class="icon item disabled" aria-disabled="true" aria-label="@lang('pagination.next')"> <i class="right chevron icon"></i> </a>
+        @endif
+    </div>
+@endif

+ 27 - 0
resources/views/vendor/pagination/simple-bootstrap-4.blade.php

@@ -0,0 +1,27 @@
+@if ($paginator->hasPages())
+    <nav>
+        <ul class="pagination">
+            {{-- Previous Page Link --}}
+            @if ($paginator->onFirstPage())
+                <li class="page-item disabled" aria-disabled="true">
+                    <span class="page-link">@lang('pagination.previous')</span>
+                </li>
+            @else
+                <li class="page-item">
+                    <a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev">@lang('pagination.previous')</a>
+                </li>
+            @endif
+
+            {{-- Next Page Link --}}
+            @if ($paginator->hasMorePages())
+                <li class="page-item">
+                    <a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next">@lang('pagination.next')</a>
+                </li>
+            @else
+                <li class="page-item disabled" aria-disabled="true">
+                    <span class="page-link">@lang('pagination.next')</span>
+                </li>
+            @endif
+        </ul>
+    </nav>
+@endif

+ 29 - 0
resources/views/vendor/pagination/simple-bootstrap-5.blade.php

@@ -0,0 +1,29 @@
+@if ($paginator->hasPages())
+    <nav role="navigation" aria-label="Pagination Navigation">
+        <ul class="pagination">
+            {{-- Previous Page Link --}}
+            @if ($paginator->onFirstPage())
+                <li class="page-item disabled" aria-disabled="true">
+                    <span class="page-link">{!! __('pagination.previous') !!}</span>
+                </li>
+            @else
+                <li class="page-item">
+                    <a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev">
+                        {!! __('pagination.previous') !!}
+                    </a>
+                </li>
+            @endif
+
+            {{-- Next Page Link --}}
+            @if ($paginator->hasMorePages())
+                <li class="page-item">
+                    <a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next">{!! __('pagination.next') !!}</a>
+                </li>
+            @else
+                <li class="page-item disabled" aria-disabled="true">
+                    <span class="page-link">{!! __('pagination.next') !!}</span>
+                </li>
+            @endif
+        </ul>
+    </nav>
+@endif

+ 19 - 0
resources/views/vendor/pagination/simple-default.blade.php

@@ -0,0 +1,19 @@
+@if ($paginator->hasPages())
+    <nav>
+        <ul class="pagination">
+            {{-- Previous Page Link --}}
+            @if ($paginator->onFirstPage())
+                <li class="disabled" aria-disabled="true"><span>@lang('pagination.previous')</span></li>
+            @else
+                <li><a href="{{ $paginator->previousPageUrl() }}" rel="prev">@lang('pagination.previous')</a></li>
+            @endif
+
+            {{-- Next Page Link --}}
+            @if ($paginator->hasMorePages())
+                <li><a href="{{ $paginator->nextPageUrl() }}" rel="next">@lang('pagination.next')</a></li>
+            @else
+                <li class="disabled" aria-disabled="true"><span>@lang('pagination.next')</span></li>
+            @endif
+        </ul>
+    </nav>
+@endif

+ 25 - 0
resources/views/vendor/pagination/simple-tailwind.blade.php

@@ -0,0 +1,25 @@
+@if ($paginator->hasPages())
+    <nav role="navigation" aria-label="Pagination Navigation" class="flex justify-between">
+        {{-- Previous Page Link --}}
+        @if ($paginator->onFirstPage())
+            <span class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default leading-5 rounded-md">
+                {!! __('pagination.previous') !!}
+            </span>
+        @else
+            <a href="{{ $paginator->previousPageUrl() }}" rel="prev" class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150">
+                {!! __('pagination.previous') !!}
+            </a>
+        @endif
+
+        {{-- Next Page Link --}}
+        @if ($paginator->hasMorePages())
+            <a href="{{ $paginator->nextPageUrl() }}" rel="next" class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150">
+                {!! __('pagination.next') !!}
+            </a>
+        @else
+            <span class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default leading-5 rounded-md">
+                {!! __('pagination.next') !!}
+            </span>
+        @endif
+    </nav>
+@endif

+ 106 - 0
resources/views/vendor/pagination/tailwind.blade.php

@@ -0,0 +1,106 @@
+@if ($paginator->hasPages())
+    <nav role="navigation" aria-label="{{ __('Pagination Navigation') }}" class="flex items-center justify-between">
+        <div class="flex justify-between flex-1 sm:hidden">
+            @if ($paginator->onFirstPage())
+                <span class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-field bg-coal border border-field cursor-default leading-5 rounded-md">
+                    {!! __('pagination.previous') !!}
+                </span>
+            @else
+                <a href="{{ $paginator->previousPageUrl() }}" class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-crayola bg-fogra border border-field leading-5 rounded-md hover:text-yelmax hover:border-burnt hover:bg-coal focus:outline-none focus:ring ring-burnt focus:border-burnt active:bg-field active:text-yelmax transition ease-in-out duration-150">
+                    {!! __('pagination.previous') !!}
+                </a>
+            @endif
+
+            @if ($paginator->hasMorePages())
+                <a href="{{ $paginator->nextPageUrl() }}" class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium text-crayola bg-fogra border border-field leading-5 rounded-md hover:text-yelmax hover:border-burnt hover:bg-coal focus:outline-none focus:ring ring-burnt focus:border-burnt active:bg-field active:text-yelmax transition ease-in-out duration-150">
+                    {!! __('pagination.next') !!}
+                </a>
+            @else
+                <span class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium text-field bg-coal border border-field cursor-default leading-5 rounded-md">
+                    {!! __('pagination.next') !!}
+                </span>
+            @endif
+        </div>
+
+        <div class="hidden sm:flex-1 sm:flex sm:items-center sm:justify-between">
+            <div>
+                <p class="text-sm text-field leading-5">
+                    {!! __('Zeige') !!}
+                    @if ($paginator->firstItem())
+                        <span class="font-medium">{{ $paginator->firstItem() }}</span>
+                        {!! __('bis') !!}
+                        <span class="font-medium">{{ $paginator->lastItem() }}</span>
+                    @else
+                        {{ $paginator->count() }}
+                    @endif
+                    {!! __('von') !!}
+                    <span class="font-medium">{{ $paginator->total() }}</span>
+                    {!! __('Ergebnissen') !!}
+                </p>
+            </div>
+
+            <div>
+                <span class="relative z-0 inline-flex shadow-sm rounded-md">
+                    {{-- Previous Page Link --}}
+                    @if ($paginator->onFirstPage())
+                        <span aria-disabled="true" aria-label="{{ __('pagination.previous') }}">
+                            <span class="relative inline-flex items-center px-2 py-2 text-sm font-medium text-field bg-coal border border-field cursor-default rounded-l-md leading-5" aria-hidden="true">
+                                <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
+                                    <path fill-rule="evenodd" d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" clip-rule="evenodd" />
+                                </svg>
+                            </span>
+                        </span>
+                    @else
+                        <a href="{{ $paginator->previousPageUrl() }}" rel="prev" class="relative inline-flex items-center px-2 py-2 text-sm font-medium text-crayola bg-fogra border border-field rounded-l-md leading-5 hover:text-yelmax hover:border-burnt hover:bg-coal focus:z-10 focus:outline-none focus:ring ring-burnt focus:border-burnt active:bg-field active:text-yelmax transition ease-in-out duration-150" aria-label="{{ __('pagination.previous') }}">
+                            <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
+                                <path fill-rule="evenodd" d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" clip-rule="evenodd" />
+                            </svg>
+                        </a>
+                    @endif
+
+                    {{-- Pagination Elements --}}
+                    @foreach ($elements as $element)
+                        {{-- "Three Dots" Separator --}}
+                        @if (is_string($element))
+                            <span aria-disabled="true">
+                                <span class="relative inline-flex items-center px-4 py-2 -ml-px text-sm font-medium text-crayola bg-fogra border border-field cursor-default leading-5">{{ $element }}</span>
+                            </span>
+                        @endif
+
+                        {{-- Array Of Links --}}
+                        @if (is_array($element))
+                            @foreach ($element as $page => $url)
+                                @if ($page == $paginator->currentPage())
+                                    <span aria-current="page">
+                                        <span class="relative inline-flex items-center px-4 py-2 -ml-px text-sm font-medium text-yelmax bg-coal border border-field cursor-default leading-5">{{ $page }}</span>
+                                    </span>
+                                @else
+                                    <a href="{{ $url }}" class="relative inline-flex items-center px-4 py-2 -ml-px text-sm font-medium text-crayola bg-fogra border border-field leading-5 hover:text-yelmax hover:border-burnt hover:bg-coal focus:z-10 focus:outline-none focus:ring ring-burnt focus:border-burnt active:bg-field active:text-yelmax transition ease-in-out duration-150" aria-label="{{ __('Go to page :page', ['page' => $page]) }}">
+                                        {{ $page }}
+                                    </a>
+                                @endif
+                            @endforeach
+                        @endif
+                    @endforeach
+
+                    {{-- Next Page Link --}}
+                    @if ($paginator->hasMorePages())
+                        <a href="{{ $paginator->nextPageUrl() }}" rel="next" class="relative inline-flex items-center px-2 py-2 -ml-px text-sm font-medium text-crayola bg-fogra border border-field rounded-r-md leading-5 hover:text-yelmax hover:border-burnt hover:bg-coal focus:z-10 focus:outline-none focus:ring ring-burnt focus:border-burnt active:bg-field active:text-yelmax transition ease-in-out duration-150" aria-label="{{ __('pagination.next') }}">
+                            <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
+                                <path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd" />
+                            </svg>
+                        </a>
+                    @else
+                        <span aria-disabled="true" aria-label="{{ __('pagination.next') }}">
+                            <span class="relative inline-flex items-center px-2 py-2 -ml-px text-sm font-medium text-field bg-coal border border-field cursor-default rounded-r-md leading-5" aria-hidden="true">
+                                <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
+                                    <path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd" />
+                                </svg>
+                            </span>
+                        </span>
+                    @endif
+                </span>
+            </div>
+        </div>
+    </nav>
+@endif

+ 81 - 0
resources/views/vorschlaege.blade.php

@@ -0,0 +1,81 @@
+<x-app-layout>
+    <x-slot name="header">
+        <h2 class="font-semibold text-xl text-burnt leading-tight">
+            {{ __('Filmvorschläge ' . $title) }}
+        </h2>
+            @if($title == 'nach Datum')
+            <a href="/vorschlaege" class="text-yelmax">&rightarrow; Vorschläge nach Beliebtheit</a>
+            @else
+            <a href="/vorschlaege/neu" class="text-yelmax">&rightarrow; Vorschläge nach Datum</a>
+            @endif
+    </x-slot>
+
+    <div class="py-12">
+        <div class="max-w-7xl mx-auto sm:px-6 lg:px-8 text-crayola">
+            <div class="grid grid-cols-3 gap-2 sm:gap-4 my-4 px-2">
+                @foreach ($films as $film)
+                <div>
+                <a href="/film/{{$film->id}}" class="text-yelmax sm:float-left sm:mr-2">
+                    <img src="{{ $film->poster !== '' ? $ihelp->getUrl($film->poster, 'w185') : "/img/no-portrait.png" }}" title="{{ $film->name }}" class="rounded-lg shadow-md shadow-burnt">
+                </a>
+                <a href="/film/{{$film->id}}" class="text-yelmax text-xs leading-3 sm:text-lg">{{$film->name}}</a>
+                <div class="flex sm:text-3xl">
+                    @php
+                        $stimme = is_null(auth()->user()) ? null : $film->votes()->where('user', auth()->user()->id)->first();
+                    @endphp
+                    @if (!is_null($stimme) && $stimme->vote == 0)
+                    <svg title="Deine Stimme: Nicht dafür" xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-red-700 sm:h-8 sm:w-8" viewBox="0 0 20 20" fill="currentColor">
+                        <path d="M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z" />
+                        <path d="M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z" />
+                    </svg> &middot;
+                    @elseif (!is_null($stimme) && $stimme->vote == 1)
+                    <svg title="Deine Stimme: Dafür" xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-green-900 sm:h-8 sm:w-8" viewBox="0 0 20 20" fill="currentColor">
+                        <path d="M9 2a1 1 0 000 2h2a1 1 0 100-2H9z" />
+                        <path fill-rule="evenodd" d="M4 5a2 2 0 012-2 3 3 0 003 3h2a3 3 0 003-3 2 2 0 012 2v11a2 2 0 01-2 2H6a2 2 0 01-2-2V5zm9.707 5.707a1 1 0 00-1.414-1.414L9 12.586l-1.293-1.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd" />
+                    </svg> &middot;
+                    @elseif(auth()->user() !== null)
+                    <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-field sm:h-8 sm:w-8" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
+                        <path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" />
+                      </svg> &middot;
+                    @endif
+                    <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-burnt sm:h-8 sm:w-8" viewBox="0 0 20 20" fill="currentColor">
+                        <path d="M9 2a1 1 0 000 2h2a1 1 0 100-2H9z" />
+                        <path fill-rule="evenodd" d="M4 5a2 2 0 012-2 3 3 0 003 3h2a3 3 0 003-3 2 2 0 012 2v11a2 2 0 01-2 2H6a2 2 0 01-2-2V5zm3 4a1 1 0 000 2h.01a1 1 0 100-2H7zm3 0a1 1 0 000 2h3a1 1 0 100-2h-3zm-3 4a1 1 0 100 2h.01a1 1 0 100-2H7zm3 0a1 1 0 100 2h3a1 1 0 100-2h-3z" clip-rule="evenodd" />
+                      </svg>
+                     {{ $film->activeVotes()->where('vote', 1)->sum('vote') }} <span class="text-field"> /{{ $film->activeVotes()->count()}}</span>
+                </div>
+                <div class="text-xs text-field sm:hidden"> {{ \Carbon\Carbon::parse($film->suggested)->format('d.m.Y') }} &middot; {{ $film->suggester->name }}</div>
+                <div class="text-field hidden sm:flex my-2">
+                    <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 mr-2" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
+                        <path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />
+                      </svg>
+                      {{ \Carbon\Carbon::parse($film->suggested)->format('d.m.Y') }}
+                </div>
+                <div class="text-field hidden sm:flex my-2"><img src="/avatar/{{$film->suggester->getAvatar() }}" class="max-h-7 rounded-lg mr-2"> {{ $film->suggester->name }}</div>
+                </div>
+
+                @endforeach
+            </div>
+
+            {{ $films->links() }}
+
+            <div class="flex">
+            <svg title="Deine Stimme: Nicht dafür" xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-red-700" viewBox="0 0 20 20" fill="currentColor">
+                <path d="M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z" />
+                <path d="M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z" />
+            </svg> Du bist nicht dafür &middot;
+            <svg title="Deine Stimme: Dafür" xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-green-900" viewBox="0 0 20 20" fill="currentColor">
+                <path d="M9 2a1 1 0 000 2h2a1 1 0 100-2H9z" />
+                <path fill-rule="evenodd" d="M4 5a2 2 0 012-2 3 3 0 003 3h2a3 3 0 003-3 2 2 0 012 2v11a2 2 0 01-2 2H6a2 2 0 01-2-2V5zm9.707 5.707a1 1 0 00-1.414-1.414L9 12.586l-1.293-1.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd" />
+            </svg> Du bist dafür &middot;
+            <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-field" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
+                <path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" />
+            </svg> Film wartet auf deine Stimme &middot;
+            <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-burnt" viewBox="0 0 20 20" fill="currentColor">
+                <path d="M9 2a1 1 0 000 2h2a1 1 0 100-2H9z" />
+                <path fill-rule="evenodd" d="M4 5a2 2 0 012-2 3 3 0 003 3h2a3 3 0 003-3 2 2 0 012 2v11a2 2 0 01-2 2H6a2 2 0 01-2-2V5zm3 4a1 1 0 000 2h.01a1 1 0 100-2H7zm3 0a1 1 0 000 2h3a1 1 0 100-2h-3zm-3 4a1 1 0 100 2h.01a1 1 0 100-2H7zm3 0a1 1 0 100 2h3a1 1 0 100-2h-3z" clip-rule="evenodd" />
+              </svg> Summe positiver/aller aktiven Stimmen
+            </div>
+        </div>
+    </div>
+</x-app-layout>

+ 0 - 0
resources/views/vorschlag.blade.php


Some files were not shown because too many files changed in this diff