diff --git a/app/Http/Livewire/Tables/VenueTable.php b/app/Http/Livewire/Tables/VenueTable.php index 4a936675..eabb1091 100644 --- a/app/Http/Livewire/Tables/VenueTable.php +++ b/app/Http/Livewire/Tables/VenueTable.php @@ -6,6 +6,7 @@ use App\Models\Venue; use Illuminate\Database\Eloquent\Builder; use Rappasoft\LaravelLivewireTables\DataTableComponent; use Rappasoft\LaravelLivewireTables\Views\Column; +use Rappasoft\LaravelLivewireTables\Views\Columns\ImageColumn; class VenueTable extends DataTableComponent { @@ -21,6 +22,14 @@ class VenueTable extends DataTableComponent public function columns(): array { return [ + ImageColumn::make('') + ->location( + fn($row) => $row->getFirstMediaUrl('images', 'thumb') + ) + ->attributes(fn($row) => [ + 'class' => 'rounded h-16 w-16', + 'alt' => $row->name.' Avatar', + ]), Column::make("Name", "name") ->sortable(), Column::make("Street", "street") diff --git a/app/Models/Lecturer.php b/app/Models/Lecturer.php index 998e33a0..3b10ca2a 100644 --- a/app/Models/Lecturer.php +++ b/app/Models/Lecturer.php @@ -47,7 +47,8 @@ class Lecturer extends Model implements HasMedia public function registerMediaCollections(): void { $this->addMediaCollection('avatar') - ->singleFile(); + ->singleFile() + ->useFallbackUrl(asset('img/einundzwanzig-cover-lesestunde.png')); } /** diff --git a/app/Models/Venue.php b/app/Models/Venue.php index 1fd7040a..e7f28de8 100644 --- a/app/Models/Venue.php +++ b/app/Models/Venue.php @@ -4,13 +4,20 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Spatie\Image\Manipulations; +use Spatie\MediaLibrary\HasMedia; +use Spatie\MediaLibrary\InteractsWithMedia; +use Spatie\MediaLibrary\MediaCollections\Models\Media; use Spatie\Sluggable\HasSlug; use Spatie\Sluggable\SlugOptions; +use Staudenmeir\EloquentHasManyDeep\HasRelationships; -class Venue extends Model +class Venue extends Model implements HasMedia { use HasFactory; use HasSlug; + use HasRelationships; + use InteractsWithMedia; /** * The attributes that aren't mass assignable. @@ -27,6 +34,24 @@ class Venue extends Model 'city_id' => 'integer', ]; + public function registerMediaConversions(Media $media = null): void + { + $this + ->addMediaConversion('preview') + ->fit(Manipulations::FIT_CROP, 300, 300) + ->nonQueued(); + $this->addMediaConversion('thumb') + ->fit(Manipulations::FIT_CROP, 130, 130) + ->width(130) + ->height(130); + } + + public function registerMediaCollections(): void + { + $this->addMediaCollection('images') + ->useFallbackUrl(asset('img/einundzwanzig-cover-lesestunde.png')); + } + /** * Get the options for generating the slug. */ @@ -43,6 +68,16 @@ class Venue extends Model return $this->belongsTo(City::class); } + public function lecturers() + { + return $this->hasManyDeepFromRelations($this->courses(), (new Course())->lecturer()); + } + + public function courses() + { + return $this->hasManyDeepFromRelations($this->events(), (new Event())->course()); + } + public function events(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(Event::class); diff --git a/app/Nova/Lecturer.php b/app/Nova/Lecturer.php index 580704a1..fda9cff1 100644 --- a/app/Nova/Lecturer.php +++ b/app/Nova/Lecturer.php @@ -7,6 +7,7 @@ use Illuminate\Http\Request; use Laravel\Nova\Fields\BelongsTo; use Laravel\Nova\Fields\Boolean; use Laravel\Nova\Fields\Field; +use Laravel\Nova\Fields\ID; use Laravel\Nova\Fields\Text; use Laravel\Nova\Http\Requests\NovaRequest; @@ -52,9 +53,11 @@ class Lecturer extends Resource public function fields(Request $request) { return [ + ID::make() + ->sortable(), + Images::make('Avatar', 'avatar') // second parameter is the media collection name - ->conversionOnIndexView('thumb') // conversion used to display the image - ->rules('required'), // validation rules + ->conversionOnIndexView('thumb'), // conversion used to display the image Text::make('Name') ->rules('required', 'string'), diff --git a/app/Nova/Venue.php b/app/Nova/Venue.php index acf17216..f24220c8 100644 --- a/app/Nova/Venue.php +++ b/app/Nova/Venue.php @@ -2,6 +2,7 @@ namespace App\Nova; +use Ebess\AdvancedNovaMediaLibrary\Fields\Images; use Illuminate\Http\Request; use Laravel\Nova\Fields\BelongsTo; use Laravel\Nova\Fields\ID; @@ -43,6 +44,9 @@ class Venue extends Resource ID::make() ->sortable(), + Images::make('Bilder', 'images') // second parameter is the media collection name + ->conversionOnIndexView('thumb'), // conversion used to display the image + Text::make('Name') ->rules('required', 'string'), diff --git a/app/Policies/PermissionPolicy.php b/app/Policies/PermissionPolicy.php index f5b993b0..b086f0a0 100644 --- a/app/Policies/PermissionPolicy.php +++ b/app/Policies/PermissionPolicy.php @@ -18,7 +18,7 @@ class PermissionPolicy */ public function viewAny(User $user) { - return true; + return $user->hasRole('super-admin'); } /** @@ -30,7 +30,7 @@ class PermissionPolicy */ public function view(User $user, Permission $permission) { - // + return $user->hasRole('super-admin'); } /** @@ -41,7 +41,7 @@ class PermissionPolicy */ public function create(User $user) { - // + return $user->hasRole('super-admin'); } /** @@ -53,7 +53,7 @@ class PermissionPolicy */ public function update(User $user, Permission $permission) { - // + return $user->hasRole('super-admin'); } /** @@ -65,7 +65,7 @@ class PermissionPolicy */ public function delete(User $user, Permission $permission) { - // + return $user->hasRole('super-admin'); } /** @@ -77,7 +77,7 @@ class PermissionPolicy */ public function restore(User $user, Permission $permission) { - // + return $user->hasRole('super-admin'); } /** @@ -89,6 +89,6 @@ class PermissionPolicy */ public function forceDelete(User $user, Permission $permission) { - // + return $user->hasRole('super-admin'); } } diff --git a/app/Policies/VenuePolicy.php b/app/Policies/VenuePolicy.php index 213f7e94..e08799b6 100644 --- a/app/Policies/VenuePolicy.php +++ b/app/Policies/VenuePolicy.php @@ -14,6 +14,7 @@ class VenuePolicy * Determine whether the user can view any models. * * @param \App\Models\User $user + * * @return \Illuminate\Auth\Access\Response|bool */ public function viewAny(User $user) @@ -26,6 +27,7 @@ class VenuePolicy * * @param \App\Models\User $user * @param \App\Models\Venue $venue + * * @return \Illuminate\Auth\Access\Response|bool */ public function view(User $user, Venue $venue) @@ -37,6 +39,7 @@ class VenuePolicy * Determine whether the user can create models. * * @param \App\Models\User $user + * * @return \Illuminate\Auth\Access\Response|bool */ public function create(User $user) @@ -49,11 +52,13 @@ class VenuePolicy * * @param \App\Models\User $user * @param \App\Models\Venue $venue + * * @return \Illuminate\Auth\Access\Response|bool */ public function update(User $user, Venue $venue) { - // + return $venue->lecturers->where('team_id', $user->current_team_id) + ->isNotEmpty(); } /** @@ -61,6 +66,7 @@ class VenuePolicy * * @param \App\Models\User $user * @param \App\Models\Venue $venue + * * @return \Illuminate\Auth\Access\Response|bool */ public function delete(User $user, Venue $venue) @@ -73,6 +79,7 @@ class VenuePolicy * * @param \App\Models\User $user * @param \App\Models\Venue $venue + * * @return \Illuminate\Auth\Access\Response|bool */ public function restore(User $user, Venue $venue) @@ -85,6 +92,7 @@ class VenuePolicy * * @param \App\Models\User $user * @param \App\Models\Venue $venue + * * @return \Illuminate\Auth\Access\Response|bool */ public function forceDelete(User $user, Venue $venue) diff --git a/composer.json b/composer.json index 04728989..c184ea68 100644 --- a/composer.json +++ b/composer.json @@ -27,6 +27,7 @@ "spatie/laravel-google-fonts": "^1.2", "spatie/laravel-medialibrary": "^10.0.0", "spatie/laravel-sluggable": "^3.4", + "staudenmeir/eloquent-has-many-deep": "^1.7", "stijnvanouplines/blade-country-flags": "^1.0", "symfony/http-client": "^6.2", "symfony/mailgun-mailer": "^6.2", diff --git a/composer.lock b/composer.lock index a6980481..e06cec19 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "02bdf9ef8956ca2e347fc6c467ca4330", + "content-hash": "3b14fa82c7df08a15f0e0584c572402b", "packages": [ { "name": "akuechler/laravel-geoly", @@ -6779,6 +6779,102 @@ ], "time": "2022-08-23T07:15:15+00:00" }, + { + "name": "staudenmeir/eloquent-has-many-deep", + "version": "v1.17", + "source": { + "type": "git", + "url": "https://github.com/staudenmeir/eloquent-has-many-deep.git", + "reference": "435ce579703ac387ecd97caf98502bd511d735f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staudenmeir/eloquent-has-many-deep/zipball/435ce579703ac387ecd97caf98502bd511d735f6", + "reference": "435ce579703ac387ecd97caf98502bd511d735f6", + "shasum": "" + }, + "require": { + "illuminate/database": "^9.0", + "php": "^8.0.2", + "staudenmeir/eloquent-has-many-deep-contracts": "^1.0" + }, + "require-dev": { + "awobaz/compoships": "^2.1", + "illuminate/pagination": "^9.0", + "nesbot/carbon": "^2.62.1", + "phpunit/phpunit": "^9.5", + "staudenmeir/eloquent-eager-limit": "^1.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Staudenmeir\\EloquentHasManyDeep\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonas Staudenmeir", + "email": "mail@jonas-staudenmeir.de" + } + ], + "description": "Laravel Eloquent HasManyThrough relationships with unlimited levels", + "support": { + "issues": "https://github.com/staudenmeir/eloquent-has-many-deep/issues", + "source": "https://github.com/staudenmeir/eloquent-has-many-deep/tree/v1.17" + }, + "funding": [ + { + "url": "https://paypal.me/JonasStaudenmeir", + "type": "custom" + } + ], + "time": "2022-11-16T07:09:47+00:00" + }, + { + "name": "staudenmeir/eloquent-has-many-deep-contracts", + "version": "v1.0", + "source": { + "type": "git", + "url": "https://github.com/staudenmeir/eloquent-has-many-deep-contracts.git", + "reference": "f9589acaaf25f55f38c6dd9d6c1caa6ff62addf6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staudenmeir/eloquent-has-many-deep-contracts/zipball/f9589acaaf25f55f38c6dd9d6c1caa6ff62addf6", + "reference": "f9589acaaf25f55f38c6dd9d6c1caa6ff62addf6", + "shasum": "" + }, + "require": { + "illuminate/database": "^9.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Staudenmeir\\EloquentHasManyDeepContracts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonas Staudenmeir", + "email": "mail@jonas-staudenmeir.de" + } + ], + "description": "Contracts for staudenmeir/eloquent-has-many-deep", + "support": { + "issues": "https://github.com/staudenmeir/eloquent-has-many-deep-contracts/issues", + "source": "https://github.com/staudenmeir/eloquent-has-many-deep-contracts/tree/v1.0" + }, + "time": "2022-09-12T18:34:56+00:00" + }, { "name": "stijnvanouplines/blade-country-flags", "version": "1.0.2", diff --git a/public/img/einundzwanzig-cover-lesestunde.png b/public/img/einundzwanzig-cover-lesestunde.png new file mode 100644 index 00000000..4b7f852b Binary files /dev/null and b/public/img/einundzwanzig-cover-lesestunde.png differ