mirror of
https://github.com/Einundzwanzig-Podcast/einundzwanzig-portal.git
synced 2025-12-11 06:46:47 +00:00
proximity search added
This commit is contained in:
@@ -73,8 +73,16 @@ class CityTable extends DataTableComponent
|
|||||||
->find($id);
|
->find($id);
|
||||||
$query = City::radius($city->latitude, $city->longitude, 100)
|
$query = City::radius($city->latitude, $city->longitude, 100)
|
||||||
->where('id', '!=', $id);
|
->where('id', '!=', $id);
|
||||||
$this->notification()
|
return to_route('search.event', [
|
||||||
->success('Proximity Search', 'Found '.$query->count().' cities. '.$query->pluck('name')
|
'#table',
|
||||||
->implode(', '));
|
'country' => $this->country,
|
||||||
|
'table' => [
|
||||||
|
'filters' => [
|
||||||
|
'stadt' => $query->pluck('name')
|
||||||
|
->push($city->name)
|
||||||
|
->implode(',')
|
||||||
|
],
|
||||||
|
]
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,25 +2,26 @@
|
|||||||
|
|
||||||
namespace App\Http\Livewire\Tables;
|
namespace App\Http\Livewire\Tables;
|
||||||
|
|
||||||
|
use App\Models\Category;
|
||||||
use App\Models\Event;
|
use App\Models\Event;
|
||||||
use Illuminate\Database\Eloquent\Builder;
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
use Rappasoft\LaravelLivewireTables\DataTableComponent;
|
use Rappasoft\LaravelLivewireTables\DataTableComponent;
|
||||||
use Rappasoft\LaravelLivewireTables\Views\Column;
|
use Rappasoft\LaravelLivewireTables\Views\Column;
|
||||||
|
use Rappasoft\LaravelLivewireTables\Views\Filters\MultiSelectFilter;
|
||||||
|
use Rappasoft\LaravelLivewireTables\Views\Filters\TextFilter;
|
||||||
|
|
||||||
class EventTable extends DataTableComponent
|
class EventTable extends DataTableComponent
|
||||||
{
|
{
|
||||||
public string $country;
|
public string $country;
|
||||||
|
|
||||||
protected $model = Event::class;
|
|
||||||
|
|
||||||
public bool $viewingModal = false;
|
public bool $viewingModal = false;
|
||||||
|
|
||||||
public $currentModal;
|
public $currentModal;
|
||||||
|
protected $model = Event::class;
|
||||||
|
|
||||||
public function configure(): void
|
public function configure(): void
|
||||||
{
|
{
|
||||||
$this
|
$this
|
||||||
->setPrimaryKey('id')
|
->setPrimaryKey('id')
|
||||||
|
->setDefaultSort('from', 'asc')
|
||||||
->setAdditionalSelects([
|
->setAdditionalSelects([
|
||||||
'course_id',
|
'course_id',
|
||||||
'venue_id',
|
'venue_id',
|
||||||
@@ -41,6 +42,40 @@ class EventTable extends DataTableComponent
|
|||||||
->setPerPage(50);
|
->setPerPage(50);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function filters(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
TextFilter::make('Stadt')
|
||||||
|
->config([
|
||||||
|
'placeholder' => __('Suche Stadt'),
|
||||||
|
])
|
||||||
|
->filter(function (Builder $builder, string $value) {
|
||||||
|
if (str($value)->contains(',')) {
|
||||||
|
$builder
|
||||||
|
->whereHas('venue.city',
|
||||||
|
function ($query) use ($value) {
|
||||||
|
foreach (str($value)->explode(',') as $item) {
|
||||||
|
$query->orWhere('cities.name', 'ilike', "%$item%");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
$builder->whereHas('venue.city',
|
||||||
|
fn($query) => $query->where('cities.name', 'ilike', "%$value%"));
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
MultiSelectFilter::make('Art')
|
||||||
|
->options(
|
||||||
|
Category::query()
|
||||||
|
->pluck('name', 'id')
|
||||||
|
->toArray()
|
||||||
|
)
|
||||||
|
->filter(function (Builder $builder, array $values) {
|
||||||
|
$builder->whereHas('course.categories',
|
||||||
|
fn($query) => $query->whereIn('categories.id', $values));
|
||||||
|
}),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
public function columns(): array
|
public function columns(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -63,6 +63,18 @@ class DatabaseSeeder extends Seeder
|
|||||||
'latitude' => 47.57143,
|
'latitude' => 47.57143,
|
||||||
'longitude' => 10.70171,
|
'longitude' => 10.70171,
|
||||||
]);
|
]);
|
||||||
|
City::create([
|
||||||
|
'country_id' => 1,
|
||||||
|
'name' => 'Kempten',
|
||||||
|
'latitude' => 47.728569,
|
||||||
|
'longitude' => 10.315784,
|
||||||
|
]);
|
||||||
|
City::create([
|
||||||
|
'country_id' => 1,
|
||||||
|
'name' => 'Pfronten',
|
||||||
|
'latitude' => 47.582359,
|
||||||
|
'longitude' => 10.5598,
|
||||||
|
]);
|
||||||
City::create([
|
City::create([
|
||||||
'country_id' => 2,
|
'country_id' => 2,
|
||||||
'name' => 'Wien',
|
'name' => 'Wien',
|
||||||
@@ -77,8 +89,18 @@ class DatabaseSeeder extends Seeder
|
|||||||
]);
|
]);
|
||||||
Venue::create([
|
Venue::create([
|
||||||
'city_id' => 1,
|
'city_id' => 1,
|
||||||
'name' => 'The Blue Studio Coworking',
|
'name' => 'The Blue Studio Coworking (Füssen)',
|
||||||
'street' => 'Teststraße 12',
|
'street' => 'Teststraße 1',
|
||||||
|
]);
|
||||||
|
Venue::create([
|
||||||
|
'city_id' => 2,
|
||||||
|
'name' => 'The Blue Studio Coworking (Kempten)',
|
||||||
|
'street' => 'Teststraße 2',
|
||||||
|
]);
|
||||||
|
Venue::create([
|
||||||
|
'city_id' => 3,
|
||||||
|
'name' => 'The Blue Studio Coworking (Pfronten)',
|
||||||
|
'street' => 'Teststraße 3',
|
||||||
]);
|
]);
|
||||||
Lecturer::create([
|
Lecturer::create([
|
||||||
'team_id' => 1,
|
'team_id' => 1,
|
||||||
@@ -97,6 +119,12 @@ class DatabaseSeeder extends Seeder
|
|||||||
'lecturer_id' => 1,
|
'lecturer_id' => 1,
|
||||||
'name' => 'Hands on Bitcoin',
|
'name' => 'Hands on Bitcoin',
|
||||||
]);
|
]);
|
||||||
|
$course->categories()
|
||||||
|
->attach($category);
|
||||||
|
$course = Course::create([
|
||||||
|
'lecturer_id' => 1,
|
||||||
|
'name' => 'Bitcoin <> Crypto',
|
||||||
|
]);
|
||||||
$course->categories()
|
$course->categories()
|
||||||
->attach($category);
|
->attach($category);
|
||||||
Participant::create([
|
Participant::create([
|
||||||
@@ -104,11 +132,29 @@ class DatabaseSeeder extends Seeder
|
|||||||
'last_name' => 'Reher',
|
'last_name' => 'Reher',
|
||||||
]);
|
]);
|
||||||
Event::create([
|
Event::create([
|
||||||
'course_id' => 1,
|
'course_id' => 2,
|
||||||
'venue_id' => 1,
|
'venue_id' => 1,
|
||||||
'link' => 'https://einundzwanzig.space',
|
'link' => 'https://einundzwanzig.space',
|
||||||
'from' => now()->startOfDay(),
|
'from' => now()->addDays(14)->startOfDay(),
|
||||||
'to' => now()
|
'to' => now()->addDays(14)
|
||||||
|
->startOfDay()
|
||||||
|
->addHour(),
|
||||||
|
]);
|
||||||
|
Event::create([
|
||||||
|
'course_id' => 1,
|
||||||
|
'venue_id' => 2,
|
||||||
|
'link' => 'https://einundzwanzig.space',
|
||||||
|
'from' => now()->addDays(3)->startOfDay(),
|
||||||
|
'to' => now()->addDays(3)
|
||||||
|
->startOfDay()
|
||||||
|
->addHour(),
|
||||||
|
]);
|
||||||
|
Event::create([
|
||||||
|
'course_id' => 1,
|
||||||
|
'venue_id' => 3,
|
||||||
|
'link' => 'https://einundzwanzig.space',
|
||||||
|
'from' => now()->addDays(4)->startOfDay(),
|
||||||
|
'to' => now()->addDays(4)
|
||||||
->startOfDay()
|
->startOfDay()
|
||||||
->addHour(),
|
->addHour(),
|
||||||
]);
|
]);
|
||||||
|
|||||||
Reference in New Issue
Block a user