diff --git a/app/Console/Commands/Database/AddTagsToNewsArticles.php b/app/Console/Commands/Database/AddTagsToNewsArticles.php new file mode 100644 index 00000000..ad89943a --- /dev/null +++ b/app/Console/Commands/Database/AddTagsToNewsArticles.php @@ -0,0 +1,33 @@ +where('news', true) + ->get() + ->each(fn(LibraryItem $libraryItem) => $libraryItem->syncTagsWithType(['News'], + 'library_item')); + } +} diff --git a/app/Http/Livewire/Library/Form/LibraryItemForm.php b/app/Http/Livewire/Library/Form/LibraryItemForm.php index 645419f6..8e0040a5 100644 --- a/app/Http/Livewire/Library/Form/LibraryItemForm.php +++ b/app/Http/Livewire/Library/Form/LibraryItemForm.php @@ -7,6 +7,7 @@ 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; use Livewire\WithFileUploads; @@ -14,6 +15,7 @@ use Spatie\LaravelOptions\Options; class LibraryItemForm extends Component { + use HasTagsTrait; use WithFileUploads; public Country $country; @@ -26,8 +28,6 @@ class LibraryItemForm extends Component public $file; - public array $selectedTags = []; - public bool $lecturer = false; public ?string $fromUrl = ''; @@ -122,18 +122,6 @@ class LibraryItemForm extends Component return to_route('library.table.libraryItems', ['country' => $this->country]); } - public function selectTag($name) - { - $selectedTags = collect($this->selectedTags); - if ($selectedTags->contains($name)) { - $selectedTags = $selectedTags->filter(fn($tag) => $tag !== $name); - } else { - $selectedTags->push($name); - } - $this->selectedTags = $selectedTags->values() - ->toArray(); - } - public function render() { return view('livewire.library.form.library-item-form', [ @@ -150,9 +138,6 @@ class LibraryItemForm extends Component 'name' => $library->name, ]) ->toArray(), - 'tags' => Tag::query() - ->where('type', 'library_item') - ->get(), ]); } } diff --git a/app/Http/Livewire/News/Form/NewsArticleForm.php b/app/Http/Livewire/News/Form/NewsArticleForm.php index 6547fca9..7aaed4e7 100644 --- a/app/Http/Livewire/News/Form/NewsArticleForm.php +++ b/app/Http/Livewire/News/Form/NewsArticleForm.php @@ -3,12 +3,14 @@ namespace App\Http\Livewire\News\Form; use App\Models\LibraryItem; +use App\Traits\HasTagsTrait; use Illuminate\Validation\Rule; use Livewire\Component; use Livewire\WithFileUploads; class NewsArticleForm extends Component { + use HasTagsTrait; use WithFileUploads; public ?LibraryItem $libraryItem = null; @@ -36,13 +38,17 @@ class NewsArticleForm extends Component return [ 'image' => [Rule::requiredIf(!$this->libraryItem->id), 'nullable', 'mimes:jpeg,png,jpg,gif', 'max:10240'], + 'selectedTags' => 'array|min:1', + 'libraryItem.lecturer_id' => 'required', 'libraryItem.name' => 'required', 'libraryItem.type' => 'required', 'libraryItem.language_code' => 'required', 'libraryItem.value' => 'required', 'libraryItem.value_to_be_paid' => [Rule::requiredIf($this->libraryItem->sats > 0), 'nullable', 'string',], - 'libraryItem.sats' => [Rule::requiredIf($this->libraryItem->sats > 0), 'nullable', 'numeric',], + 'libraryItem.sats' => [ + Rule::requiredIf($this->libraryItem->sats > 0), 'nullable', 'numeric', + ], 'libraryItem.subtitle' => 'string|nullable', 'libraryItem.excerpt' => 'required', 'libraryItem.main_image_caption' => 'string|nullable', @@ -68,6 +74,7 @@ class NewsArticleForm extends Component 'language_code' => 'de', 'approved' => false, ]); + $this->selectedTags[] = 'News'; } if (!$this->fromUrl) { $this->fromUrl = url()->previous(); @@ -93,6 +100,11 @@ class NewsArticleForm extends Component $this->validate(); $this->libraryItem->save(); + $this->libraryItem->syncTagsWithType( + $this->selectedTags, + 'library_item' + ); + if ($this->image) { $this->libraryItem->addMedia($this->image) ->usingFileName(md5($this->image->getClientOriginalName()).'.'.$this->image->getClientOriginalExtension()) diff --git a/app/Rules/TagUniqueRule.php b/app/Rules/TagUniqueRule.php new file mode 100644 index 00000000..8bc3a0cb --- /dev/null +++ b/app/Rules/TagUniqueRule.php @@ -0,0 +1,34 @@ +type); + if ($tag) { + $fail(__('Tags must be unique', ['attribute' => $attribute])); + } + } +} diff --git a/app/Traits/HasTagsTrait.php b/app/Traits/HasTagsTrait.php new file mode 100644 index 00000000..c17ea3c5 --- /dev/null +++ b/app/Traits/HasTagsTrait.php @@ -0,0 +1,51 @@ +tags = Tag::query() + ->where('type', 'library_item') + ->get() + ->map(fn($tag) => ['id' => $tag->id, 'name' => $tag->name]) + ->toArray(); + } + + public function selectTag($name) + { + $selectedTags = collect($this->selectedTags); + if ($selectedTags->contains($name)) { + $selectedTags = $selectedTags->filter(fn($tag) => $tag !== $name); + } else { + $selectedTags->push($name); + } + $this->selectedTags = $selectedTags->values() + ->toArray(); + } + + public function addTag() + { + $this->validateOnly('newTag', [ + 'newTag' => ['required', 'string', new TagUniqueRule()], + ]); + Tag::create(['name' => $this->newTag, 'type' => 'library_item']); + $this->tags = Tag::query() + ->where('type', 'library_item') + ->get() + ->map(fn($tag) => ['id' => $tag->id, 'name' => $tag->name]) + ->toArray(); + $this->newTag = ''; + $this->addTag = false; + } +} 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 c2de08d8..520dfe65 100644 --- a/resources/views/livewire/library/form/library-item-form.blade.php +++ b/resources/views/livewire/library/form/library-item-form.blade.php @@ -74,19 +74,42 @@ + +
+
+ {{ __('Tags') }} +
+ @if(!$addTag) + + + {{ __('Add') }} + + @else + + + + + @endif +
+
@foreach($tags as $tag)
- @if(collect($selectedTags)->contains($tag->name)) + wire:click="selectTag('{{ $tag['name'] }}')"> + @if(collect($selectedTags)->contains($tag['name'])) - {{ $tag->name }} + {{ $tag['name'] }} @else - {{ $tag->name }} + {{ $tag['name']}} @endif
diff --git a/resources/views/livewire/library/library-table.blade.php b/resources/views/livewire/library/library-table.blade.php index f70869ed..3f5c8e94 100644 --- a/resources/views/livewire/library/library-table.blade.php +++ b/resources/views/livewire/library/library-table.blade.php @@ -93,10 +93,10 @@