Commit the Projects/Tasks/Ideas/TaskComments feature
This was already implemented, migrated, and running live, but had never been committed. Bringing it into git: Project/Task/Idea/ TaskComment models, their JSON API (CRUD + status transitions, task comments, idea<->project linking), Livewire UI pages, and the nav/route wiring for them. All 42 of its own tests pass. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,142 @@
|
||||
<?php
|
||||
|
||||
namespace App\Livewire\TaskComments;
|
||||
|
||||
use App\Models\Task;
|
||||
use App\Models\TaskComment;
|
||||
use Livewire\Attributes\Layout;
|
||||
use Livewire\Component;
|
||||
|
||||
#[Layout('components.layouts.app')]
|
||||
class Index extends Component
|
||||
{
|
||||
public ?int $taskId = null;
|
||||
|
||||
public bool $showForm = false;
|
||||
|
||||
public ?int $editingId = null;
|
||||
|
||||
public string $body = '';
|
||||
|
||||
public string $authorType = 'user';
|
||||
|
||||
public string $authorName = '';
|
||||
|
||||
public function mount()
|
||||
{
|
||||
// Get task_id from query parameters
|
||||
if (request()->has('task_id')) {
|
||||
$this->taskId = (int) request('task_id');
|
||||
}
|
||||
|
||||
// Set default author name for user
|
||||
if (auth()->check()) {
|
||||
$this->authorName = auth()->user()->name ?? 'User';
|
||||
} else {
|
||||
$this->authorName = 'User';
|
||||
}
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
$task = null;
|
||||
$comments = collect();
|
||||
|
||||
if ($this->taskId) {
|
||||
$task = Task::with(['project', 'comments'])->find($this->taskId);
|
||||
$comments = $task ? $task->comments()->orderBy('created_at')->get() : collect();
|
||||
}
|
||||
|
||||
return view('livewire.task-comments.index', [
|
||||
'task' => $task,
|
||||
'comments' => $comments,
|
||||
'authorTypes' => TaskComment::AUTHOR_TYPES,
|
||||
]);
|
||||
}
|
||||
|
||||
public function create(): void
|
||||
{
|
||||
$this->resetForm();
|
||||
$this->showForm = true;
|
||||
}
|
||||
|
||||
public function edit(int $id): void
|
||||
{
|
||||
$comment = TaskComment::findOrFail($id);
|
||||
$this->editingId = $comment->id;
|
||||
$this->body = $comment->body;
|
||||
$this->authorType = $comment->author_type;
|
||||
$this->authorName = $comment->author_name;
|
||||
$this->showForm = true;
|
||||
}
|
||||
|
||||
public function save(): void
|
||||
{
|
||||
if (!$this->taskId) {
|
||||
$this->addError('taskId', 'Task ID is required');
|
||||
return;
|
||||
}
|
||||
|
||||
$validated = $this->validate([
|
||||
'body' => ['required', 'string'],
|
||||
'authorType' => ['required', 'string', 'in:' . implode(',', TaskComment::AUTHOR_TYPES)],
|
||||
'authorName' => ['required', 'string', 'max:255'],
|
||||
]);
|
||||
|
||||
TaskComment::updateOrCreate(['id' => $this->editingId], [
|
||||
'task_id' => $this->taskId,
|
||||
'body' => $validated['body'],
|
||||
'author_type' => $validated['authorType'],
|
||||
'author_name' => $validated['authorName'],
|
||||
]);
|
||||
|
||||
$this->resetForm();
|
||||
$this->showForm = false;
|
||||
}
|
||||
|
||||
public function delete(int $id): void
|
||||
{
|
||||
TaskComment::findOrFail($id)->delete();
|
||||
}
|
||||
|
||||
public function resetForm(): void
|
||||
{
|
||||
$this->editingId = null;
|
||||
$this->body = '';
|
||||
$this->authorType = 'user';
|
||||
// Keep the author name as it was
|
||||
$this->resetValidation();
|
||||
}
|
||||
|
||||
public function getAuthorColor(string $authorType): string
|
||||
{
|
||||
return match ($authorType) {
|
||||
'ai' => 'bg-purple-100 text-purple-800',
|
||||
'system' => 'bg-gray-100 text-gray-800',
|
||||
'user' => 'bg-blue-100 text-blue-800',
|
||||
default => 'bg-gray-100 text-gray-800',
|
||||
};
|
||||
}
|
||||
|
||||
public function setAuthorAsAI(): void
|
||||
{
|
||||
$this->authorType = 'ai';
|
||||
$this->authorName = 'AI Assistant';
|
||||
}
|
||||
|
||||
public function setAuthorAsUser(): void
|
||||
{
|
||||
$this->authorType = 'user';
|
||||
if (auth()->check()) {
|
||||
$this->authorName = auth()->user()->name ?? 'User';
|
||||
} else {
|
||||
$this->authorName = 'User';
|
||||
}
|
||||
}
|
||||
|
||||
public function setAuthorAsSystem(): void
|
||||
{
|
||||
$this->authorType = 'system';
|
||||
$this->authorName = 'System';
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user