From ba55f62afa6f89e317a3c544459630e2955bd614 Mon Sep 17 00:00:00 2001 From: HolgerHatGarKeineNode Date: Wed, 2 Aug 2023 14:15:55 +0200 Subject: [PATCH] add dedicated Bindle page --- app/Http/Livewire/Bindle/Gallery.php | 39 ++++++ .../Livewire/Library/Form/LibraryItemForm.php | 116 ++++++++++++------ app/Http/Livewire/Library/LibraryTable.php | 86 ++++++------- config/portal/bonus.php | 6 + public/img/fiat_tracker.jpg | Bin 0 -> 18605 bytes .../views/livewire/bindle/gallery.blade.php | 90 ++++++++++++++ .../frontend/navigation/library.blade.php | 6 + .../library/form/library-item-form.blade.php | 12 +- routes/web.php | 4 + 9 files changed, 273 insertions(+), 86 deletions(-) create mode 100644 app/Http/Livewire/Bindle/Gallery.php create mode 100644 config/portal/bonus.php create mode 100644 public/img/fiat_tracker.jpg create mode 100644 resources/views/livewire/bindle/gallery.blade.php diff --git a/app/Http/Livewire/Bindle/Gallery.php b/app/Http/Livewire/Bindle/Gallery.php new file mode 100644 index 00000000..89c51a03 --- /dev/null +++ b/app/Http/Livewire/Bindle/Gallery.php @@ -0,0 +1,39 @@ +bindles = LibraryItem::query() + ->where('type', 'bindle') + ->get(); + } + + public function deleteBindle($id) + { + LibraryItem::query()->find($id)?->delete(); + + return to_route('bindles'); + } + + public function render() + { + return view('livewire.bindle.gallery') + ->layout('layouts.app', [ + 'SEOData' => new SEOData( + title: __('Bindle Gallery'), + description: __('Die berühmte Bindlesammlung von FiatTracker.'), + image: asset('img/fiat_tracker.jpg'), + ), + ]); + } +} diff --git a/app/Http/Livewire/Library/Form/LibraryItemForm.php b/app/Http/Livewire/Library/Form/LibraryItemForm.php index 8e0040a5..ae9f8098 100644 --- a/app/Http/Livewire/Library/Form/LibraryItemForm.php +++ b/app/Http/Livewire/Library/Form/LibraryItemForm.php @@ -6,7 +6,6 @@ use App\Enums\LibraryItemType; use App\Models\Country; use App\Models\Library; use App\Models\LibraryItem; -use App\Models\Tag; use App\Traits\HasTagsTrait; use Illuminate\Validation\Rule; use Livewire\Component; @@ -33,7 +32,7 @@ class LibraryItemForm extends Component public ?string $fromUrl = ''; protected $queryString = [ - 'fromUrl' => ['except' => ''], + 'fromUrl' => ['except' => ''], 'lecturer' => ['except' => false], ]; @@ -46,11 +45,11 @@ class LibraryItemForm extends Component 'selectedTags' => 'array|min:1', - 'libraryItem.lecturer_id' => 'required', - 'libraryItem.name' => 'required', - 'libraryItem.type' => 'required', - 'libraryItem.language_code' => 'required', - 'libraryItem.value' => [ + 'libraryItem.lecturer_id' => 'required', + 'libraryItem.name' => 'required', + 'libraryItem.type' => 'required', + 'libraryItem.language_code' => 'required', + 'libraryItem.value' => [ 'required', Rule::when( $this->libraryItem->type !== LibraryItemType::MarkdownArticle() @@ -58,11 +57,35 @@ class LibraryItemForm extends Component && $this->libraryItem->type !== LibraryItemType::DownloadableFile(), ['url'] ), ], - 'libraryItem.subtitle' => 'required', - 'libraryItem.excerpt' => 'required', - 'libraryItem.main_image_caption' => 'required', - 'libraryItem.read_time' => 'required', - 'libraryItem.approved' => 'boolean', + 'libraryItem.subtitle' => 'required', + 'libraryItem.excerpt' => + [ + Rule::when( + $this->libraryItem->type !== 'bindle', + 'required', + ) + ], + 'libraryItem.main_image_caption' => + [ + Rule::when( + $this->libraryItem->type !== 'bindle', + 'required', + ) + ], + 'libraryItem.read_time' => + [ + Rule::when( + $this->libraryItem->type !== 'bindle', + 'required', + ) + ], + 'libraryItem.approved' => + [ + Rule::when( + $this->libraryItem->type !== 'bindle', + 'required', + ) + ], ]; } @@ -70,22 +93,22 @@ class LibraryItemForm extends Component { if (!$this->libraryItem) { $this->libraryItem = new LibraryItem([ - 'approved' => true, + 'approved' => true, 'read_time' => 1, - 'value' => '', + 'value' => '', ]); if ($this->lecturer) { $this->library = Library::query() - ->firstWhere('name', '=', 'Dozentenmaterial')?->id; + ->firstWhere('name', '=', 'Dozentenmaterial')?->id; } } else { $this->selectedTags = $this->libraryItem->tags() - ->where('type', 'library_item') - ->get() - ->map(fn($tag) => $tag->name) - ->toArray(); + ->where('type', 'library_item') + ->get() + ->map(fn($tag) => $tag->name) + ->toArray(); $this->library = $this->libraryItem->libraries() - ->first() + ->first() ->id; } if (!$this->fromUrl) { @@ -106,38 +129,55 @@ class LibraryItemForm extends Component if ($this->image) { $this->libraryItem->addMedia($this->image) - ->usingFileName(md5($this->image->getClientOriginalName()).'.'.$this->image->getClientOriginalExtension()) - ->toMediaCollection('main'); + ->usingFileName(md5($this->image->getClientOriginalName()) . '.' . $this->image->getClientOriginalExtension()) + ->toMediaCollection('main'); } if ($this->file) { $this->libraryItem->addMedia($this->file) - ->usingFileName(md5($this->file->getClientOriginalName()).'.'.$this->file->getClientOriginalExtension()) - ->toMediaCollection('single_file'); + ->usingFileName(md5($this->file->getClientOriginalName()) . '.' . $this->file->getClientOriginalExtension()) + ->toMediaCollection('single_file'); } $this->libraryItem->libraries() - ->syncWithoutDetaching([(int) $this->library]); + ->syncWithoutDetaching([(int)$this->library]); + + if ($this->libraryItem->type === 'bindle') { + return to_route('bindles'); + } return to_route('library.table.libraryItems', ['country' => $this->country]); } public function render() { + $types = Options::forEnum(LibraryItemType::class) + ->filter( + fn($type) => $type !== LibraryItemType::PodcastEpisode + && $type !== LibraryItemType::MarkdownArticle + ) + ->toArray(); + $libaries = Library::query() + ->when(auth()->id() !== config('portal.bonus.fiat-tracker-user-id'), + fn($query) => $query->where('name', '!=', 'Bindle') + ) + ->get() + ->map(fn($library) => [ + 'id' => $library->id, + 'name' => $library->name, + ]) + ->toArray(); + + if (auth()->id() === config('portal.bonus.fiat-tracker-user-id')) { + $types = collect($types)->prepend([ + 'label' => 'Bindle', + 'value' => 'bindle', + ]); + } + return view('livewire.library.form.library-item-form', [ - 'types' => Options::forEnum(LibraryItemType::class) - ->filter( - fn($type) => $type !== LibraryItemType::PodcastEpisode - && $type !== LibraryItemType::MarkdownArticle - ) - ->toArray(), - 'libraries' => Library::query() - ->get() - ->map(fn($library) => [ - 'id' => $library->id, - 'name' => $library->name, - ]) - ->toArray(), + 'types' => $types, + 'libraries' => $libaries, ]); } } diff --git a/app/Http/Livewire/Library/LibraryTable.php b/app/Http/Livewire/Library/LibraryTable.php index 6ec2bfa8..e0207f92 100644 --- a/app/Http/Livewire/Library/LibraryTable.php +++ b/app/Http/Livewire/Library/LibraryTable.php @@ -25,8 +25,8 @@ class LibraryTable extends Component protected $queryString = [ 'currentTab' => ['except' => '*'], - 'filters' => ['except' => ''], - 'search' => ['except' => ''], + 'filters' => ['except' => ''], + 'search' => ['except' => ''], ]; public function loadMore() @@ -56,10 +56,11 @@ class LibraryTable extends Component { $shouldBePublic = !$this->isLecturerPage; $libraries = \App\Models\Library::query() - ->whereNull('parent_id') - ->where('is_public', $shouldBePublic) - ->orderBy('name') - ->get(); + ->where('name', '!=', 'Bindle') + ->whereNull('parent_id') + ->where('is_public', $shouldBePublic) + ->orderBy('name') + ->get(); $tabs = collect([ [ 'name' => '*', @@ -73,49 +74,50 @@ class LibraryTable extends Component if ($this->currentTab !== '*') { $parentLibrary = Library::query() - ->where('name', $this->currentTab) - ->first(); + ->where('name', $this->currentTab) + ->first(); } $searchTags = []; if ($this->search) { - $searchTags = Tag::where('name', 'ilike', '%'.$this->search.'%') - ->pluck('id') - ->toArray(); + $searchTags = Tag::where('name', 'ilike', '%' . $this->search . '%') + ->pluck('id') + ->toArray(); } return view('livewire.library.library-table', [ - 'libraries' => $tabs, + 'libraries' => $tabs, 'libraryItems' => LibraryItem::query() - ->with([ - 'lecturer', - 'tags', - ]) - ->when($this->search, fn($query) => $query - ->where('name', 'ilike', '%'.$this->search.'%') - ->orWhere(fn($query) => $query - ->when(count($searchTags) > 0 && count($this->filters) < 1, - fn($query) => $query->whereHas('tags', - fn($query) => $query->whereIn('tags.id', $searchTags))) - ) - ) - ->when($this->currentTab !== '*', fn($query) => $query - ->whereHas('libraries', - fn($query) => $query - ->where('libraries.name', $this->currentTab) - ) - ) - ->when(isset($this->filters['lecturer_id']), - fn($query) => $query->where('library_items.lecturer_id', - $this->filters['lecturer_id']) - ) - ->when(isset($this->filters['tag']), fn($query) => $query->whereHas('tags', - fn($query) => $query->whereIn('tags.id', $this->filters['tag']))) - ->when(isset($this->filters['language']), - fn($query) => $query->whereIn('language_code', $this->filters['language'])) - ->whereHas('libraries', - fn($query) => $query->where('libraries.is_public', $shouldBePublic)) - ->orderByDesc('library_items.created_at') - ->paginate($this->perPage), + ->with([ + 'lecturer', + 'tags', + ]) + ->where('type', '!=', 'bindle') + ->when($this->search, fn($query) => $query + ->where('name', 'ilike', '%' . $this->search . '%') + ->orWhere(fn($query) => $query + ->when(count($searchTags) > 0 && count($this->filters) < 1, + fn($query) => $query->whereHas('tags', + fn($query) => $query->whereIn('tags.id', $searchTags))) + ) + ) + ->when($this->currentTab !== '*', fn($query) => $query + ->whereHas('libraries', + fn($query) => $query + ->where('libraries.name', $this->currentTab) + ) + ) + ->when(isset($this->filters['lecturer_id']), + fn($query) => $query->where('library_items.lecturer_id', + $this->filters['lecturer_id']) + ) + ->when(isset($this->filters['tag']), fn($query) => $query->whereHas('tags', + fn($query) => $query->whereIn('tags.id', $this->filters['tag']))) + ->when(isset($this->filters['language']), + fn($query) => $query->whereIn('language_code', $this->filters['language'])) + ->whereHas('libraries', + fn($query) => $query->where('libraries.is_public', $shouldBePublic)) + ->orderByDesc('library_items.created_at') + ->paginate($this->perPage), ])->layout('layouts.app', [ 'SEOData' => new SEOData( title: __('Library'), diff --git a/config/portal/bonus.php b/config/portal/bonus.php new file mode 100644 index 00000000..e0ae216f --- /dev/null +++ b/config/portal/bonus.php @@ -0,0 +1,6 @@ + env('FIAT_TRACKER_USER_ID', 1), +]; diff --git a/public/img/fiat_tracker.jpg b/public/img/fiat_tracker.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3384589431fe87510c6479610675e513c933475f GIT binary patch literal 18605 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�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 un54dmjgIOirlNrc-XOv=! + {{-- HEADER --}} + + +
+ +
+ +
+
+ @if(auth()->id() === config('portal.bonus.fiat-tracker-user-id')) + + {{ __('Neues Bindle hochladen') }} + + @endif +
+ +
+

Sent from my #₿indle🧡

+ +
    + + @foreach($bindles as $bindle) +
  • +
    +
    + + {{ $bindle->name }} + + +
    +

    {{ $bindle->name }}

    + +
    +
    + @if(auth()->id() === config('portal.bonus.fiat-tracker-user-id')) + + @endif +
    +
  • + @endforeach + +
+
+
+ +
+
+
+ +

value-4-value

+
+ +
+
+ + +
+
+ +
+ +
+ diff --git a/resources/views/livewire/frontend/navigation/library.blade.php b/resources/views/livewire/frontend/navigation/library.blade.php index 7563784a..130039c7 100644 --- a/resources/views/livewire/frontend/navigation/library.blade.php +++ b/resources/views/livewire/frontend/navigation/library.blade.php @@ -57,6 +57,12 @@ {{ __('Podcast Episodes') }} + + + {{ __('Bindles') }} + + @auth diff --git a/resources/views/livewire/library/form/library-item-form.blade.php b/resources/views/livewire/library/form/library-item-form.blade.php index fc889578..8c19f8c6 100644 --- a/resources/views/livewire/library/form/library-item-form.blade.php +++ b/resources/views/livewire/library/form/library-item-form.blade.php @@ -39,13 +39,13 @@ wire:model="libraryItem.lecturer_id" :searchable="true" :async-data="[ - 'api' => route('api.lecturers.index'), - 'method' => 'GET', // default is GET - ]" + 'api' => route('api.lecturers.index'), + 'method' => 'GET', // default is GET + ]" :template="[ - 'name' => 'user-option', - 'config' => ['src' => 'image'] - ]" + 'name' => 'user-option', + 'config' => ['src' => 'image'] + ]" option-label="name" option-value="id" /> diff --git a/routes/web.php b/routes/web.php index 344849f2..0f409f3e 100644 --- a/routes/web.php +++ b/routes/web.php @@ -20,6 +20,10 @@ Route::middleware([]) ->get('/kaninchenbau', \App\Http\Livewire\Helper\FollowTheRabbit::class) ->name('kaninchenbau'); +Route::middleware([]) + ->get('/bindles', \App\Http\Livewire\Bindle\Gallery::class) + ->name('bindles'); + Route::get('/img/{path}', \App\Http\Controllers\ImageController::class) ->where('path', '.*') ->name('img');