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
|
public function columns(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
Column::make(__('Venue'), 'venue.name'),
|
|
||||||
Column::make(__('Title'), 'title')
|
Column::make(__('Title'), 'title')
|
||||||
|
->format(
|
||||||
|
fn($value, $row, Column $column) => view('columns.bitcoin_events.title')->withRow($row)
|
||||||
|
)
|
||||||
->sortable(),
|
->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')
|
Column::make(__('Link'), 'link')
|
||||||
|
->format(
|
||||||
|
fn($value, $row, Column $column) => view('columns.bitcoin_events.link')->withRow($row)
|
||||||
|
)
|
||||||
->sortable(),
|
->sortable(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,11 @@
|
|||||||
|
|
||||||
namespace App\Http\Livewire\Tables;
|
namespace App\Http\Livewire\Tables;
|
||||||
|
|
||||||
|
use App\Models\MeetupEvent;
|
||||||
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
use Rappasoft\LaravelLivewireTables\DataTableComponent;
|
use Rappasoft\LaravelLivewireTables\DataTableComponent;
|
||||||
use Rappasoft\LaravelLivewireTables\Views\Column;
|
use Rappasoft\LaravelLivewireTables\Views\Column;
|
||||||
use App\Models\MeetupEvent;
|
use Rappasoft\LaravelLivewireTables\Views\Filters\TextFilter;
|
||||||
|
|
||||||
class MeetupEventTable extends DataTableComponent
|
class MeetupEventTable extends DataTableComponent
|
||||||
{
|
{
|
||||||
@@ -15,6 +17,7 @@ class MeetupEventTable extends DataTableComponent
|
|||||||
public function configure(): void
|
public function configure(): void
|
||||||
{
|
{
|
||||||
$this->setPrimaryKey('id')
|
$this->setPrimaryKey('id')
|
||||||
|
->setAdditionalSelects(['meetup_events.meetup_id'])
|
||||||
->setThAttributes(function (Column $column) {
|
->setThAttributes(function (Column $column) {
|
||||||
return [
|
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',
|
'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);
|
->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
|
public function columns(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
Column::make(__('Meetup'), 'meetup.name')
|
||||||
|
->format(
|
||||||
|
fn($value, $row, Column $column) => view('columns.meetup_events.name')->withRow($row)
|
||||||
|
)
|
||||||
|
->sortable(),
|
||||||
Column::make(__('Location'), 'location')
|
Column::make(__('Location'), 'location')
|
||||||
->sortable(),
|
->sortable(),
|
||||||
Column::make(__('Start'), 'start')
|
Column::make(__('Start'), 'start')
|
||||||
->sortable(),
|
->format(
|
||||||
|
fn($value, $row, Column $column) => $value->asDateTime()
|
||||||
|
)
|
||||||
|
->sortable(),
|
||||||
Column::make(__('Link'), 'link')
|
Column::make(__('Link'), 'link')
|
||||||
->sortable(),
|
->format(
|
||||||
Column::make("Created at", "created_at")
|
fn($value, $row, Column $column) => view('columns.meetup_events.link')->withRow($row)
|
||||||
->sortable(),
|
)
|
||||||
Column::make("Updated at", "updated_at")
|
->sortable(),
|
||||||
->sortable(),
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function builder(): Builder
|
||||||
|
{
|
||||||
|
return MeetupEvent::query()
|
||||||
|
->with([
|
||||||
|
'meetup',
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
namespace App\Http\Livewire\Tables;
|
namespace App\Http\Livewire\Tables;
|
||||||
|
|
||||||
use App\Models\Meetup;
|
use App\Models\Meetup;
|
||||||
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
use Rappasoft\LaravelLivewireTables\DataTableComponent;
|
use Rappasoft\LaravelLivewireTables\DataTableComponent;
|
||||||
use Rappasoft\LaravelLivewireTables\Views\Column;
|
use Rappasoft\LaravelLivewireTables\Views\Column;
|
||||||
|
|
||||||
@@ -35,9 +36,37 @@ class MeetupTable extends DataTableComponent
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
Column::make(__('Name'), 'name')
|
Column::make(__('Name'), 'name')
|
||||||
|
->format(
|
||||||
|
fn($value, $row, Column $column) => view('columns.meetups.name')->withRow($row)
|
||||||
|
)
|
||||||
->sortable(),
|
->sortable(),
|
||||||
Column::make(__('Link'), 'link')
|
Column::make(__('Link'), 'link')
|
||||||
|
->format(
|
||||||
|
fn($value, $row, Column $column) => view('columns.meetups.link')->withRow($row)
|
||||||
|
)
|
||||||
->sortable(),
|
->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\Factories\HasFactory;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
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 HasFactory;
|
||||||
|
use InteractsWithMedia;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The attributes that aren't mass assignable.
|
* The attributes that aren't mass assignable.
|
||||||
@@ -28,6 +33,24 @@ class BitcoinEvent extends Model
|
|||||||
'to' => 'datetime',
|
'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
|
public function venue(): \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||||
{
|
{
|
||||||
return $this->belongsTo(Venue::class);
|
return $this->belongsTo(Venue::class);
|
||||||
|
|||||||
@@ -4,30 +4,57 @@ namespace App\Models;
|
|||||||
|
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
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 HasFactory;
|
||||||
|
use InteractsWithMedia;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The attributes that aren't mass assignable.
|
* The attributes that aren't mass assignable.
|
||||||
*
|
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $guarded = [];
|
protected $guarded = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The attributes that should be cast to native types.
|
* The attributes that should be cast to native types.
|
||||||
*
|
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $casts = [
|
protected $casts = [
|
||||||
'id' => 'integer',
|
'id' => 'integer',
|
||||||
'city_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
|
public function city(): \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||||
{
|
{
|
||||||
return $this->belongsTo(City::class);
|
return $this->belongsTo(City::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function meetupEvents(): HasMany
|
||||||
|
{
|
||||||
|
return $this->hasMany(MeetupEvent::class);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace App\Nova;
|
namespace App\Nova;
|
||||||
|
|
||||||
|
use Ebess\AdvancedNovaMediaLibrary\Fields\Images;
|
||||||
use Laravel\Nova\Fields\ID;
|
use Laravel\Nova\Fields\ID;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Laravel\Nova\Fields\Text;
|
use Laravel\Nova\Fields\Text;
|
||||||
@@ -45,6 +46,9 @@ class BitcoinEvent extends Resource
|
|||||||
return [
|
return [
|
||||||
ID::make()->sortable(),
|
ID::make()->sortable(),
|
||||||
|
|
||||||
|
Images::make(__('Logo'), 'logo')
|
||||||
|
->conversionOnIndexView('thumb'),
|
||||||
|
|
||||||
DateTime::make('From')
|
DateTime::make('From')
|
||||||
->rules('required'),
|
->rules('required'),
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace App\Nova;
|
namespace App\Nova;
|
||||||
|
|
||||||
|
use Ebess\AdvancedNovaMediaLibrary\Fields\Images;
|
||||||
use Laravel\Nova\Fields\ID;
|
use Laravel\Nova\Fields\ID;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Laravel\Nova\Fields\Text;
|
use Laravel\Nova\Fields\Text;
|
||||||
@@ -44,6 +45,9 @@ class Meetup extends Resource
|
|||||||
return [
|
return [
|
||||||
ID::make()->sortable(),
|
ID::make()->sortable(),
|
||||||
|
|
||||||
|
Images::make(__('Logo'), 'logo')
|
||||||
|
->conversionOnIndexView('thumb'),
|
||||||
|
|
||||||
Text::make('Name')
|
Text::make('Name')
|
||||||
->rules('required', 'string', 'unique:meetups,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">
|
<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"
|
<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') }}">
|
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"
|
<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>
|
||||||
<div class="relative z-10 flex flex-col items-start justify-start w-full px-6 py-7">
|
<div class="relative z-10 flex flex-col items-start justify-start w-full px-6 py-7">
|
||||||
<span
|
<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">
|
<h4 class="text-4xl font-bold tracking-tight text-gray-100 sm:text-3xl md:text-2xl lg:text-3xl">
|
||||||
Meetups
|
Meetups
|
||||||
</h4>
|
</h4>
|
||||||
|
|||||||
Reference in New Issue
Block a user