Skip to content

Improve UI: Add more icons and internal links, search in description #32

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Apr 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions app/Http/Controllers/EventController.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public function index(EventFilterRequest $request): View
->withCount([
'documents',
'groups',
'subEvents',
])
->paginate(),
]));
Expand All @@ -52,15 +53,20 @@ public function show(Event $event): View
]),
'documents.reference',
'documents.uploadedByUser',
'eventSeries',
'location',
'organizations',
'parentEvent.subEvents' => static fn (HasMany $query) => $query->withCount([
'documents',
'groups',
]),
'parentEvent.subEvents.eventSeries',
'parentEvent.subEvents.location',
'subEvents' => static fn (HasMany $query) => $query->withCount([
'documents',
'groups',
]),
'subEvents.eventSeries',
'subEvents.location',
])
->loadCount([
Expand Down Expand Up @@ -116,6 +122,8 @@ private function formValues(array $values = []): array
return array_replace([
'events' => Event::query()
->whereNull('parent_event_id')
->orderBy('started_at')
->orderBy('finished_at')
->orderBy('name')
->get(),
], $this->formValuesForFilter($values));
Expand Down
28 changes: 20 additions & 8 deletions app/Http/Controllers/EventSeriesController.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,27 @@ public function show(EventSeries $eventSeries): View

return view('event_series.event_series_show', [
'eventSeries' => $eventSeries->loadMissing([
'events' => fn (HasMany $events) => $events->withCount([
'documents',
'groups',
]),
'documents.reference',
'documents.uploadedByUser',
'events' => fn (HasMany $events) => $events
->withCount([
'documents',
'groups',
]),
'events.location',
'subEventSeries' => fn (HasMany $subEventSeries) => $subEventSeries->withCount([
'documents',
'events',
]),
'events.parentEvent',
'parentEventSeries',
'subEventSeries' => fn (HasMany $subEventSeries) => $subEventSeries
->withCount([
'documents',
'events',
])
->withMin('events', 'started_at')
->withMax('events', 'started_at')
->withCasts([
'events_min_started_at' => 'datetime',
'events_max_started_at' => 'datetime',
]),
]),
]);
}
Expand Down
7 changes: 5 additions & 2 deletions app/Http/Controllers/OrganizationController.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public function index(OrganizationFilterRequest $request): View
'documents',
'events',
])
->paginate(),
->paginate(10),
]));
}

Expand Down Expand Up @@ -56,7 +56,10 @@ public function show(Organization $organization): View
$this->authorize('view', $organization);

return view('organizations.organization_show', [
'organization' => $organization,
'organization' => $organization->loadMissing([
'documents.reference',
'documents.uploadedByUser',
]),
]);
}

Expand Down
2 changes: 1 addition & 1 deletion app/Http/Requests/Filters/DocumentFilterRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class DocumentFilterRequest extends FormRequest
public function rules(): array
{
return [
'filter.title' => $this->ruleForText(),
'filter.search' => $this->ruleForText(),
'filter.file_type' => [
'nullable',
FileType::rule(),
Expand Down
2 changes: 1 addition & 1 deletion app/Http/Requests/Filters/EventFilterRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class EventFilterRequest extends FormRequest
public function rules(): array
{
return [
'filter.name' => $this->ruleForText(),
'filter.search' => $this->ruleForText(),
'filter.visibility' => [
'nullable',
Visibility::rule(),
Expand Down
5 changes: 5 additions & 0 deletions app/Http/Requests/Filters/EventSeriesFilterRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use App\Http\Requests\Traits\AuthorizationViaController;
use App\Http\Requests\Traits\FiltersList;
use App\Models\EventSeries;
use App\Options\EventSeriesType;
use App\Policies\EventSeriesPolicy;
use Illuminate\Foundation\Http\FormRequest;

Expand All @@ -25,6 +26,10 @@ public function rules(): array
{
return [
'filter.name' => $this->ruleForText(),
'filter.event_series_type' => [
'nullable',
EventSeriesType::rule(),
],
'sort' => [
'nullable',
EventSeries::sortOptions()->getRule(),
Expand Down
2 changes: 2 additions & 0 deletions app/Models/BookingOption.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace App\Models;

use App\Models\Traits\HasNameAndDescription;
use App\Models\Traits\HasSlugForRouting;
use App\Options\BookingRestriction;
use Carbon\Carbon;
Expand All @@ -28,6 +29,7 @@
*/
class BookingOption extends Model
{
use HasNameAndDescription;
use HasSlugForRouting;

/**
Expand Down
11 changes: 10 additions & 1 deletion app/Models/Document.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
use App\Models\QueryBuilder\BuildsQueryFromRequest;
use App\Models\QueryBuilder\SortOptions;
use App\Models\Traits\HasDocuments;
use App\Models\Traits\Searchable;
use App\Options\ApprovalStatus;
use App\Options\FileType;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\MorphTo;
Expand All @@ -31,6 +33,7 @@
class Document extends Model
{
use BuildsQueryFromRequest;
use Searchable;

protected $casts = [
'file_type' => FileType::class,
Expand Down Expand Up @@ -81,10 +84,16 @@ public function fillAndSave(array $validatedData): bool
return $this->save();
}

public function scopeSearchTitleAndDescription(Builder $query, string ...$searchTerms): Builder
{
return $this->scopeIncludeColumns($query, ['title', 'description'], true, ...$searchTerms);
}

public static function allowedFilters(): array
{
return [
AllowedFilter::partial('title'),
/** @see self::scopeSearchTitleAndDescription() */
AllowedFilter::scope('search', 'searchTitleAndDescription'),
AllowedFilter::exact('file_type'),
AllowedFilter::exact('approval_status'),
];
Expand Down
8 changes: 5 additions & 3 deletions app/Models/Event.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use App\Models\QueryBuilder\SortOptions;
use App\Models\Traits\HasDocuments;
use App\Models\Traits\HasLocation;
use App\Models\Traits\HasNameAndDescription;
use App\Models\Traits\HasSlugForRouting;
use App\Models\Traits\HasWebsite;
use App\Options\EventType;
Expand Down Expand Up @@ -46,6 +47,7 @@ class Event extends Model
use HasDocuments;
use HasFactory;
use HasLocation;
use HasNameAndDescription;
use HasSlugForRouting;
use HasWebsite;

Expand Down Expand Up @@ -208,11 +210,11 @@ public function getStoragePath(): string
public static function allowedFilters(): array
{
return [
AllowedFilter::partial('name'),
/** @see self::scopeSearchNameAndDescription() */
AllowedFilter::scope('search', 'searchNameAndDescription'),
AllowedFilter::exact('visibility'),
/** @see self::scopeDateFrom() */
AllowedFilter::scope('date_from')
->default(Carbon::today()->format('Y-m-d')),
AllowedFilter::scope('date_from'),
/** @see self::scopeDateUntil() */
AllowedFilter::scope('date_until'),
AllowedFilter::exact('location_id'),
Expand Down
25 changes: 23 additions & 2 deletions app/Models/EventSeries.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
use App\Models\QueryBuilder\SortOptions;
use App\Models\Traits\HasDocuments;
use App\Models\Traits\HasSlugForRouting;
use App\Options\EventSeriesType;
use App\Options\Visibility;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
Expand Down Expand Up @@ -57,8 +59,9 @@ class EventSeries extends Model
public function events(): HasMany
{
return $this->hasMany(Event::class, 'event_series_id')
->orderBy('started_at')
->orderBy('finished_at');
->orderByDesc('started_at')
->orderByDesc('finished_at')
->orderBy('name');
}

public function parentEventSeries(): BelongsTo
Expand All @@ -72,6 +75,21 @@ public function subEventSeries(): HasMany
->orderBy('name');
}

public function scopeEventSeriesType(Builder $query, EventSeriesType|string $eventSeriesType): Builder
{
if (is_string($eventSeriesType)) {
$eventSeriesType = EventSeriesType::tryFrom($eventSeriesType);
}

return match ($eventSeriesType) {
EventSeriesType::MainEventSeries => $query->whereNull('parent_event_series_id'),
EventSeriesType::PartOfEventSeries => $query->whereNotNull('parent_event_series_id'),
EventSeriesType::EventSeriesWithParts => $query->whereHas('subEventSeries'),
EventSeriesType::EventSeriesWithoutParts => $query->whereDoesntHave('subEventSeries'),
default => $query,
};
}

public function fillAndSave(array $validatedData): bool
{
$this->fill($validatedData);
Expand All @@ -94,6 +112,9 @@ public static function allowedFilters(): array
{
return [
AllowedFilter::partial('name'),
/** @see self::scopeEventSeriesType() */
AllowedFilter::scope('event_series_type')
->default(EventSeriesType::MainEventSeries->value),
];
}

Expand Down
2 changes: 2 additions & 0 deletions app/Models/Group.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace App\Models;

use App\Models\Traits\HasNameAndDescription;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Concerns\HasTimestamps;
use Illuminate\Database\Eloquent\Factories\HasFactory;
Expand All @@ -21,6 +22,7 @@
class Group extends Model
{
use HasFactory;
use HasNameAndDescription;
use HasTimestamps;

protected $casts = [
Expand Down
4 changes: 2 additions & 2 deletions app/Models/Traits/HasAddress.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,11 @@ trait HasAddress

public function addressBlock(): Attribute
{
return new Attribute(fn () => [
return new Attribute(fn () => array_filter([
$this->streetLine,
$this->cityLine,
$this->country,
]);
], fn (string $line) => trim($line) !== ''));
}

public function addressLine(): Attribute
Expand Down
22 changes: 22 additions & 0 deletions app/Models/Traits/HasNameAndDescription.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace App\Models\Traits;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;

/**
* @property string $name
* @property ?string $description
*
* @mixin Model
*/
trait HasNameAndDescription
{
use Searchable;

public function scopeSearchNameAndDescription(Builder $query, string ...$searchTerms): Builder
{
return $this->scopeIncludeColumns($query, ['name', 'description'], true, ...$searchTerms);
}
}
25 changes: 25 additions & 0 deletions app/Options/EventSeriesType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace App\Options;

use App\Options\Traits\NamedOption;

enum EventSeriesType: string
{
use NamedOption;

case MainEventSeries = 'main_event_series';
case PartOfEventSeries = 'part_of_event_series';
case EventSeriesWithParts = 'event_with_part_series';
case EventSeriesWithoutParts = 'event_without_part_series';

public function getTranslatedName(): string
{
return match ($this) {
self::MainEventSeries => __('main event series'),
self::PartOfEventSeries => __('part of another event series'),
self::EventSeriesWithParts => __('event series with part event series'),
self::EventSeriesWithoutParts => __('event series without part event series'),
};
}
}
1 change: 1 addition & 0 deletions app/Options/FileType.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ public function getExtensions(): array
'wav',
],
self::Image => [
'bmp',
'jpeg',
'jpg',
'png',
Expand Down
3 changes: 2 additions & 1 deletion app/Policies/BookingPolicy.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ private function viewOnlyOwnBooking(User $user, Booking $booking): Response
*/
public function create(User $user): Response
{
return $this->allow();
/** @see BookingOptionPolicy::book() */
return $this->deny();
}

/**
Expand Down
9 changes: 7 additions & 2 deletions lang/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -110,9 +110,12 @@
"End of the period": "Ende des Zeitraums",
"Event": "Veranstaltung",
"Event series": "Veranstaltungsreihen",
"Event series type": "Art der Veranstaltungsreihe",
"event series with part event series": "Veranstaltungsreihe mit Teilveranstaltungsreihen",
"event series without part event series": "Veranstaltungsreihe ohne Teilveranstaltungsreihen",
"Event type": "Art der Veranstaltung",
"event with part events": "Veranstaltung mit Teil-Veranstaltungen",
"event without part events": "Veranstaltung ohne Teil-Veranstaltungen",
"event with part events": "Veranstaltung mit Teilveranstaltungen",
"event without part events": "Veranstaltung ohne Teilveranstaltungen",
"Events": "Veranstaltungen",
"Exclude members of groups": "Mitglieder von Gruppen ausschließen",
"expired": "abgelaufen",
Expand Down Expand Up @@ -165,6 +168,7 @@
"Logout": "Ausloggen",
"long text field": "langes Textfeld",
"main event": "Hauptveranstaltung",
"main event series": "Hauptveranstaltungsreihe",
"Manage booking options of event": "Anmeldeoptionen für Veranstaltung verwalten",
"Manage groups of event": "Gruppen einer Veranstaltung verwalten",
"Manage personal access tokens": "Persönliche Zugriffstoken verwalten",
Expand Down Expand Up @@ -198,6 +202,7 @@
"paid": "bezahlt",
"Paid at": "Bezahlt am",
"part of another event": "Teil einer anderen Veranstaltung",
"part of another event series": "Teil einer anderen Veranstaltungsreihe",
"Part of the event": "Teil der Veranstaltung",
"Part of the event series": "Teil der Veranstaltungsreihe",
"Password": "Passwort",
Expand Down
Loading