diff --git a/app/Livewire/Project/Shared/Tags.php b/app/Livewire/Project/Shared/Tags.php index 85d5c21dc..42c56d3a1 100644 --- a/app/Livewire/Project/Shared/Tags.php +++ b/app/Livewire/Project/Shared/Tags.php @@ -3,32 +3,63 @@ namespace App\Livewire\Project\Shared; use App\Models\Tag; +use Livewire\Attributes\Validate; use Livewire\Component; +// Refactored ✅ class Tags extends Component { public $resource = null; - public ?string $new_tag = null; + #[Validate('required|string|min:2')] + public string $newTags; public $tags = []; - protected $listeners = [ - 'refresh' => '$refresh', - ]; - - protected $rules = [ - 'resource.tags.*.name' => 'required|string|min:2', - 'new_tag' => 'required|string|min:2', - ]; - - protected $validationAttributes = [ - 'new_tag' => 'tag', - ]; + public $filteredTags = []; public function mount() + { + $this->loadTags(); + } + + public function loadTags() { $this->tags = Tag::ownedByCurrentTeam()->get(); + $this->filteredTags = $this->tags->filter(function ($tag) { + return ! $this->resource->tags->contains($tag); + }); + } + + public function submit() + { + try { + $this->validate(); + $tags = str($this->newTags)->trim()->explode(' '); + foreach ($tags as $tag) { + if (strlen($tag) < 2) { + $this->dispatch('error', 'Invalid tag.', "Tag $tag is invalid. Min length is 2."); + + continue; + } + if ($this->resource->tags()->where('name', $tag)->exists()) { + $this->dispatch('error', 'Duplicate tags.', "Tag $tag already added."); + + continue; + } + $found = Tag::ownedByCurrentTeam()->where(['name' => $tag])->exists(); + if (! $found) { + $found = Tag::create([ + 'name' => $tag, + 'team_id' => currentTeam()->id, + ]); + } + $this->resource->tags()->attach($found->id); + } + $this->refresh(); + } catch (\Exception $e) { + return handleError($e, $this); + } } public function addTag(string $id, string $name) @@ -39,8 +70,9 @@ public function addTag(string $id, string $name) return; } - $this->resource->tags()->syncWithoutDetaching($id); + $this->resource->tags()->attach($id); $this->refresh(); + $this->dispatch('success', 'Tag added.'); } catch (\Exception $e) { return handleError($e, $this); } @@ -51,11 +83,12 @@ public function deleteTag(string $id) try { $this->resource->tags()->detach($id); - $found_more_tags = Tag::where(['id' => $id, 'team_id' => currentTeam()->id])->first(); + $found_more_tags = Tag::ownedByCurrentTeam()->find($id); if ($found_more_tags->applications()->count() == 0 && $found_more_tags->services()->count() == 0) { $found_more_tags->delete(); } $this->refresh(); + $this->dispatch('success', 'Tag deleted.'); } catch (\Exception $e) { return handleError($e, $this); } @@ -63,41 +96,7 @@ public function deleteTag(string $id) public function refresh() { - $this->resource->load(['tags']); - $this->tags = Tag::ownedByCurrentTeam()->get(); - $this->new_tag = null; - } - - public function submit() - { - try { - $this->validate([ - 'new_tag' => 'required|string|min:2', - ]); - $tags = str($this->new_tag)->trim()->explode(' '); - foreach ($tags as $tag) { - if ($this->resource->tags()->where('name', $tag)->exists()) { - $this->dispatch('error', 'Duplicate tags.', "Tag $tag already added."); - - continue; - } - $found = Tag::where(['name' => $tag, 'team_id' => currentTeam()->id])->first(); - if (! $found) { - $found = Tag::create([ - 'name' => $tag, - 'team_id' => currentTeam()->id, - ]); - } - $this->resource->tags()->syncWithoutDetaching($found->id); - } - $this->refresh(); - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.project.shared.tags'); + $this->loadTags(); + $this->reset('newTags'); } } diff --git a/resources/views/livewire/project/shared/tags.blade.php b/resources/views/livewire/project/shared/tags.blade.php index 0de2540fd..683731780 100644 --- a/resources/views/livewire/project/shared/tags.blade.php +++ b/resources/views/livewire/project/shared/tags.blade.php @@ -1,10 +1,18 @@