43 lines
1.3 KiB
PHP
43 lines
1.3 KiB
PHP
<?php
|
|
|
|
namespace App\Actions\ProjectBoard;
|
|
|
|
use App\Models\Project;
|
|
use App\Models\TicketStatus;
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
|
|
trait ManagesTicketStatusPositions
|
|
{
|
|
private function nextStatusPosition(Project $project, ?int $boardColumnId): int
|
|
{
|
|
return $this->statusContextQuery($project, $boardColumnId)->count() + 1;
|
|
}
|
|
|
|
private function normalizeStatusPositions(Project $project, ?int $boardColumnId): void
|
|
{
|
|
$this->statusContextQuery($project, $boardColumnId)
|
|
->get()
|
|
->values()
|
|
->each(function (TicketStatus $ticketStatus, int $index): void {
|
|
$ticketStatus->forceFill([
|
|
'position' => $index + 1,
|
|
])->saveQuietly();
|
|
});
|
|
}
|
|
|
|
private function statusContextLabel(TicketStatus $ticketStatus): string
|
|
{
|
|
return $ticketStatus->boardColumn?->name ?? 'Backlog';
|
|
}
|
|
|
|
private function statusContextQuery(Project $project, ?int $boardColumnId): HasMany
|
|
{
|
|
return $project->ticketStatuses()
|
|
->when(
|
|
$boardColumnId === null,
|
|
fn ($query) => $query->whereNull('board_column_id'),
|
|
fn ($query) => $query->where('board_column_id', $boardColumnId),
|
|
);
|
|
}
|
|
}
|