mirror of
https://github.com/Einundzwanzig-Podcast/einundzwanzig-portal.git
synced 2025-12-11 06:46:47 +00:00
meetup events filters added
This commit is contained in:
@@ -35,10 +35,24 @@ class BitcoinEventTable extends DataTableComponent
|
||||
public function columns(): array
|
||||
{
|
||||
return [
|
||||
Column::make(__('Venue'), 'venue.name'),
|
||||
Column::make(__('Title'), 'title')
|
||||
->format(
|
||||
fn($value, $row, Column $column) => view('columns.bitcoin_events.title')->withRow($row)
|
||||
)
|
||||
->sortable(),
|
||||
Column::make(__('From'), 'from')
|
||||
->format(
|
||||
fn($value, $row, Column $column) => $value->asDateTime()
|
||||
),
|
||||
Column::make(__('To'), 'to')
|
||||
->format(
|
||||
fn($value, $row, Column $column) => $value->asDateTime()
|
||||
),
|
||||
Column::make(__('Venue'), 'venue.name'),
|
||||
Column::make(__('Link'), 'link')
|
||||
->format(
|
||||
fn($value, $row, Column $column) => view('columns.bitcoin_events.link')->withRow($row)
|
||||
)
|
||||
->sortable(),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -2,9 +2,11 @@
|
||||
|
||||
namespace App\Http\Livewire\Tables;
|
||||
|
||||
use App\Models\MeetupEvent;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Rappasoft\LaravelLivewireTables\DataTableComponent;
|
||||
use Rappasoft\LaravelLivewireTables\Views\Column;
|
||||
use App\Models\MeetupEvent;
|
||||
use Rappasoft\LaravelLivewireTables\Views\Filters\TextFilter;
|
||||
|
||||
class MeetupEventTable extends DataTableComponent
|
||||
{
|
||||
@@ -15,6 +17,7 @@ class MeetupEventTable extends DataTableComponent
|
||||
public function configure(): void
|
||||
{
|
||||
$this->setPrimaryKey('id')
|
||||
->setAdditionalSelects(['meetup_events.meetup_id'])
|
||||
->setThAttributes(function (Column $column) {
|
||||
return [
|
||||
'class' => 'px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider dark:bg-gray-800 dark:text-gray-400',
|
||||
@@ -31,19 +34,45 @@ class MeetupEventTable extends DataTableComponent
|
||||
->setPerPage(50);
|
||||
}
|
||||
|
||||
public function filters(): array
|
||||
{
|
||||
return [
|
||||
TextFilter::make('Meetup-Event by ID', 'id')
|
||||
->hiddenFromMenus()
|
||||
->filter(function (Builder $builder, string $value) {
|
||||
$builder->whereIn('meetup_events.id', str($value)->explode(','));
|
||||
}),
|
||||
];
|
||||
}
|
||||
|
||||
public function columns(): array
|
||||
{
|
||||
return [
|
||||
Column::make(__('Meetup'), 'meetup.name')
|
||||
->format(
|
||||
fn($value, $row, Column $column) => view('columns.meetup_events.name')->withRow($row)
|
||||
)
|
||||
->sortable(),
|
||||
Column::make(__('Location'), 'location')
|
||||
->sortable(),
|
||||
->sortable(),
|
||||
Column::make(__('Start'), 'start')
|
||||
->sortable(),
|
||||
->format(
|
||||
fn($value, $row, Column $column) => $value->asDateTime()
|
||||
)
|
||||
->sortable(),
|
||||
Column::make(__('Link'), 'link')
|
||||
->sortable(),
|
||||
Column::make("Created at", "created_at")
|
||||
->sortable(),
|
||||
Column::make("Updated at", "updated_at")
|
||||
->sortable(),
|
||||
->format(
|
||||
fn($value, $row, Column $column) => view('columns.meetup_events.link')->withRow($row)
|
||||
)
|
||||
->sortable(),
|
||||
];
|
||||
}
|
||||
|
||||
public function builder(): Builder
|
||||
{
|
||||
return MeetupEvent::query()
|
||||
->with([
|
||||
'meetup',
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Http\Livewire\Tables;
|
||||
|
||||
use App\Models\Meetup;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Rappasoft\LaravelLivewireTables\DataTableComponent;
|
||||
use Rappasoft\LaravelLivewireTables\Views\Column;
|
||||
|
||||
@@ -35,9 +36,37 @@ class MeetupTable extends DataTableComponent
|
||||
{
|
||||
return [
|
||||
Column::make(__('Name'), 'name')
|
||||
->format(
|
||||
fn($value, $row, Column $column) => view('columns.meetups.name')->withRow($row)
|
||||
)
|
||||
->sortable(),
|
||||
Column::make(__('Link'), 'link')
|
||||
->format(
|
||||
fn($value, $row, Column $column) => view('columns.meetups.link')->withRow($row)
|
||||
)
|
||||
->sortable(),
|
||||
Column::make(__('Actions'),)
|
||||
->label(
|
||||
fn($row, Column $column) => view('columns.meetups.action')->withRow($row)
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
public function builder(): Builder
|
||||
{
|
||||
return Meetup::query()
|
||||
->withCount([
|
||||
'meetupEvents',
|
||||
]);
|
||||
}
|
||||
|
||||
public function meetupEventSearch($id)
|
||||
{
|
||||
return to_route('meetup.table.meetupEvent', [
|
||||
'country' => $this->country,
|
||||
'table' => [
|
||||
'filters' => ['id' => $id],
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,10 +4,15 @@ 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;
|
||||
|
||||
class BitcoinEvent extends Model
|
||||
class BitcoinEvent extends Model implements HasMedia
|
||||
{
|
||||
use HasFactory;
|
||||
use InteractsWithMedia;
|
||||
|
||||
/**
|
||||
* The attributes that aren't mass assignable.
|
||||
@@ -28,6 +33,24 @@ class BitcoinEvent extends Model
|
||||
'to' => 'datetime',
|
||||
];
|
||||
|
||||
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('logo')
|
||||
->useFallbackUrl(asset('img/einundzwanzig-cover-lesestunde.png'));
|
||||
}
|
||||
|
||||
public function venue(): \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Venue::class);
|
||||
|
||||
@@ -4,30 +4,57 @@ namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Spatie\Image\Manipulations;
|
||||
use Spatie\MediaLibrary\HasMedia;
|
||||
use Spatie\MediaLibrary\InteractsWithMedia;
|
||||
use Spatie\MediaLibrary\MediaCollections\Models\Media;
|
||||
|
||||
class Meetup extends Model
|
||||
class Meetup extends Model implements HasMedia
|
||||
{
|
||||
use HasFactory;
|
||||
use InteractsWithMedia;
|
||||
|
||||
/**
|
||||
* The attributes that aren't mass assignable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $guarded = [];
|
||||
|
||||
/**
|
||||
* The attributes that should be cast to native types.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $casts = [
|
||||
'id' => 'integer',
|
||||
'id' => 'integer',
|
||||
'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('logo')
|
||||
->useFallbackUrl(asset('img/einundzwanzig-cover-lesestunde.png'));
|
||||
}
|
||||
|
||||
public function city(): \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||
{
|
||||
return $this->belongsTo(City::class);
|
||||
}
|
||||
|
||||
public function meetupEvents(): HasMany
|
||||
{
|
||||
return $this->hasMany(MeetupEvent::class);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Nova;
|
||||
|
||||
use Ebess\AdvancedNovaMediaLibrary\Fields\Images;
|
||||
use Laravel\Nova\Fields\ID;
|
||||
use Illuminate\Http\Request;
|
||||
use Laravel\Nova\Fields\Text;
|
||||
@@ -45,6 +46,9 @@ class BitcoinEvent extends Resource
|
||||
return [
|
||||
ID::make()->sortable(),
|
||||
|
||||
Images::make(__('Logo'), 'logo')
|
||||
->conversionOnIndexView('thumb'),
|
||||
|
||||
DateTime::make('From')
|
||||
->rules('required'),
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Nova;
|
||||
|
||||
use Ebess\AdvancedNovaMediaLibrary\Fields\Images;
|
||||
use Laravel\Nova\Fields\ID;
|
||||
use Illuminate\Http\Request;
|
||||
use Laravel\Nova\Fields\Text;
|
||||
@@ -44,6 +45,9 @@ class Meetup extends Resource
|
||||
return [
|
||||
ID::make()->sortable(),
|
||||
|
||||
Images::make(__('Logo'), 'logo')
|
||||
->conversionOnIndexView('thumb'),
|
||||
|
||||
Text::make('Name')
|
||||
->rules('required', 'string', 'unique:meetups,name'),
|
||||
|
||||
|
||||
5
resources/views/columns/bitcoin_events/link.blade.php
Normal file
5
resources/views/columns/bitcoin_events/link.blade.php
Normal file
@@ -0,0 +1,5 @@
|
||||
<div>
|
||||
<a href="{{ $row->link }}" target="_blank">
|
||||
<x-badge>{{ $row->link }}</x-badge>
|
||||
</a>
|
||||
</div>
|
||||
6
resources/views/columns/bitcoin_events/title.blade.php
Normal file
6
resources/views/columns/bitcoin_events/title.blade.php
Normal file
@@ -0,0 +1,6 @@
|
||||
<div class="flex items-center space-x-2">
|
||||
<img class="h-12" src="{{ $row->getFirstMediaUrl('logo', 'thumb') }}" alt="{{ $row->title }}">
|
||||
<div>
|
||||
{{ $row->title }}
|
||||
</div>
|
||||
</div>
|
||||
5
resources/views/columns/meetup_events/link.blade.php
Normal file
5
resources/views/columns/meetup_events/link.blade.php
Normal file
@@ -0,0 +1,5 @@
|
||||
<div>
|
||||
<a href="{{ $row->link }}" target="_blank">
|
||||
<x-badge>{{ $row->link }}</x-badge>
|
||||
</a>
|
||||
</div>
|
||||
6
resources/views/columns/meetup_events/name.blade.php
Normal file
6
resources/views/columns/meetup_events/name.blade.php
Normal file
@@ -0,0 +1,6 @@
|
||||
<div class="flex items-center space-x-2">
|
||||
<img class="h-12" src="{{ $row->meetup->getFirstMediaUrl('logo', 'thumb') }}" alt="{{ $row->meetup->name }}">
|
||||
<div>
|
||||
{{ $row->meetup->name }}
|
||||
</div>
|
||||
</div>
|
||||
1
resources/views/columns/meetups/action.blade.php
Normal file
1
resources/views/columns/meetups/action.blade.php
Normal file
@@ -0,0 +1 @@
|
||||
<x-button amber wire:click="meetupEventSearch({{ $row->id }})">Termine anzeigen ({{ $row->meetup_events_count }})</x-button>
|
||||
5
resources/views/columns/meetups/link.blade.php
Normal file
5
resources/views/columns/meetups/link.blade.php
Normal file
@@ -0,0 +1,5 @@
|
||||
<div>
|
||||
<a href="{{ $row->link }}" target="_blank">
|
||||
<x-badge>{{ $row->link }}</x-badge>
|
||||
</a>
|
||||
</div>
|
||||
6
resources/views/columns/meetups/name.blade.php
Normal file
6
resources/views/columns/meetups/name.blade.php
Normal file
@@ -0,0 +1,6 @@
|
||||
<div class="flex items-center space-x-2">
|
||||
<img class="h-12" src="{{ $row->getFirstMediaUrl('logo', 'thumb') }}" alt="{{ $row->name }}">
|
||||
<div>
|
||||
{{ $row->name }}
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,5 +1,5 @@
|
||||
<div class="bg-21gray flex flex-col justify-between">
|
||||
<section class="relative px-10 pt-16 pb-24 sm:py-16">
|
||||
<section class="relative px-10 pt-16 pb-24 sm:py-16 sm:overflow-hidden">
|
||||
<img class="absolute h-43 left-0 z-0 w-3/4 transform -translate-y-1/2 opacity-70 top-1/2"
|
||||
src="{{ asset('img/gradient-blob.svg') }}">
|
||||
<img class="absolute left-0 z-0 object-cover object-center w-full h-full opacity-50 top-24"
|
||||
@@ -26,7 +26,7 @@
|
||||
</div>
|
||||
<div class="relative z-10 flex flex-col items-start justify-start w-full px-6 py-7">
|
||||
<span
|
||||
class="px-2 py-1 mb-3 text-xs font-semibold tracking-tight text-white uppercase bg-amber-500 rounded-md">Get together</span>
|
||||
class="px-2 py-1 mb-3 text-xs font-semibold tracking-tight text-white uppercase bg-amber-500 rounded-md">Plebs together strong</span>
|
||||
<h4 class="text-4xl font-bold tracking-tight text-gray-100 sm:text-3xl md:text-2xl lg:text-3xl">
|
||||
Meetups
|
||||
</h4>
|
||||
|
||||
Reference in New Issue
Block a user