42 lines
1.2 KiB
PHP
42 lines
1.2 KiB
PHP
<?php
|
|
|
|
namespace App\Actions\ProjectTicketMetadata;
|
|
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Support\Collection;
|
|
|
|
trait ReordersProjectMetadata
|
|
{
|
|
/**
|
|
* @param Collection<int, Model> $models
|
|
*/
|
|
private function persistOrderedModels(Collection $models): void
|
|
{
|
|
$temporaryOffset = ((int) $models->max('position')) + $models->count() + 1;
|
|
|
|
$models->each(function (Model $model, int $index) use ($temporaryOffset): void {
|
|
$model->forceFill([
|
|
'position' => $temporaryOffset + $index,
|
|
])->saveQuietly();
|
|
});
|
|
|
|
$models->each(function (Model $model, int $index): void {
|
|
$model->forceFill([
|
|
'position' => $index + 1,
|
|
])->saveQuietly();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* @param Collection<int, Model> $existingModels
|
|
*/
|
|
private function reorderModels(Collection $existingModels, Model $movingModel, int $desiredPosition): void
|
|
{
|
|
$insertAt = max(0, min($desiredPosition - 1, $existingModels->count()));
|
|
|
|
$existingModels->splice($insertAt, 0, [$movingModel]);
|
|
|
|
$this->persistOrderedModels($existingModels->values());
|
|
}
|
|
}
|