From 0a07237aa7f30eaf99f89731c27ccb41765dfd4e Mon Sep 17 00:00:00 2001 From: Corentin Huet Date: Fri, 13 Mar 2026 11:52:48 +0100 Subject: [PATCH] refactor: :recycle: make changeCustomOrder generic --- app/Http/Controllers/Bo/AisleController.php | 36 +------------ .../Requests/Bo/Aisles/UpdateAisleRequest.php | 1 - ...rderRequest.php => UpdateOrderRequest.php} | 22 +++++--- app/Models/Aisle.php | 35 +++++------- app/Traits/Controllers/UpdateModelOrder.php | 44 +++++++++++++++ app/Traits/Models/Orderable.php | 53 +++++++++++++++++++ .../change-model-order-select.blade.php | 4 +- .../bo/pages/aisles/index-list.blade.php | 3 +- .../views/bo/pages/aisles/index.blade.php | 2 +- 9 files changed, 130 insertions(+), 70 deletions(-) rename app/Http/Requests/Bo/{Aisles/UpdateAisleOrderRequest.php => UpdateOrderRequest.php} (62%) create mode 100644 app/Traits/Controllers/UpdateModelOrder.php create mode 100644 app/Traits/Models/Orderable.php diff --git a/app/Http/Controllers/Bo/AisleController.php b/app/Http/Controllers/Bo/AisleController.php index d5ea7ed..acbffb9 100644 --- a/app/Http/Controllers/Bo/AisleController.php +++ b/app/Http/Controllers/Bo/AisleController.php @@ -4,11 +4,10 @@ namespace App\Http\Controllers\Bo; use App\Http\Controllers\Controller; use App\Http\Requests\Bo\Aisles\StoreAisleRequest; -use App\Http\Requests\Bo\Aisles\UpdateAisleOrderRequest; use App\Http\Requests\Bo\Aisles\UpdateAisleRequest; use App\Models\Aisle; use App\Models\Network; -use App\Traits\Controllers\ChangesModelOrder; +use App\Traits\Controllers\UpdateModelOrder; use App\Traits\Controllers\UpdateModelPublished; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; @@ -16,7 +15,7 @@ use Illuminate\Support\Str; class AisleController extends Controller { - use ChangesModelOrder; + use UpdateModelOrder; use UpdateModelPublished; /** @@ -68,7 +67,6 @@ class AisleController extends Controller return view('bo.pages.aisles.index', compact('aisleModels', 'networkModels', 'selectedNetwork', 'search', 'searchFields')); } - /** * Show the form for creating a new resource. * @@ -183,34 +181,4 @@ class AisleController extends Controller { return $this->create($aisle->replicate()); } - - /** - * Update ticket priority. - * - * @param \App\Http\Requests\Bo\Aisles\UpdateAisleOrderRequest $request - * @param \App\Models\Aisle $aisle - * @return void - */ - public function changeCustomOrder(UpdateAisleOrderRequest $request, Aisle $aisle) - { - $newOrder = $request->validated('order'); - - return DB::transaction(function () use ($aisle, $newOrder) { - // Update all tickets who will be moved with this priority update. - $request = Aisle::query() - ->where('network_id', $aisle->network_id) - ->whereNot('id', $aisle->id) - ->whereBetween('order', [min($aisle->order, $newOrder), max($aisle->order, $newOrder)]); - $aisle->order < $newOrder ? $request->decrement('order', 1) : $request->increment('order', 1); - - // Update the aisle. - $aisle->order = $newOrder; - if (!$aisle->saveOrFail()) { - return back()->with('error', trans('crud.messages.order_not_changed')); - }; - - return redirect()->back()->with('success', trans('crud.messages.order_changed')); - }); - } - } diff --git a/app/Http/Requests/Bo/Aisles/UpdateAisleRequest.php b/app/Http/Requests/Bo/Aisles/UpdateAisleRequest.php index 35af4ff..769e82a 100644 --- a/app/Http/Requests/Bo/Aisles/UpdateAisleRequest.php +++ b/app/Http/Requests/Bo/Aisles/UpdateAisleRequest.php @@ -2,7 +2,6 @@ namespace App\Http\Requests\Bo\Aisles; - class UpdateAisleRequest extends StoreAisleRequest { } diff --git a/app/Http/Requests/Bo/Aisles/UpdateAisleOrderRequest.php b/app/Http/Requests/Bo/UpdateOrderRequest.php similarity index 62% rename from app/Http/Requests/Bo/Aisles/UpdateAisleOrderRequest.php rename to app/Http/Requests/Bo/UpdateOrderRequest.php index 991f9d7..9a7fe87 100644 --- a/app/Http/Requests/Bo/Aisles/UpdateAisleOrderRequest.php +++ b/app/Http/Requests/Bo/UpdateOrderRequest.php @@ -1,13 +1,19 @@ aisle = $this->route('aisle'); - $this->max = Aisle::query()->where('network_id', $this->aisle->network_id)->max('order'); + $this->orderableModel = collect($this->route()->parameters()) + ->first(fn($param) => $param instanceof Model); } /** @@ -42,9 +48,9 @@ class UpdateAisleOrderRequest extends FormRequest 'required', 'integer', 'min:1', - sprintf('max:%s', $this->max), + sprintf('max:%s', $this->orderableModel->max('order')), function ($attribute, $value, $fail) { - if ($this->aisle && intval($value) === $this->aisle->order) { + if ($this->orderableModel && intval($value) === $this->orderableModel->order) { $fail("La valeur de {$attribute} doit ĂȘtre diffĂ©rente de la valeur actuelle."); } }, diff --git a/app/Models/Aisle.php b/app/Models/Aisle.php index 82ed110..4f0f897 100644 --- a/app/Models/Aisle.php +++ b/app/Models/Aisle.php @@ -4,6 +4,7 @@ namespace App\Models; use App\Lib\Helpers\FileStorageHelper; use App\Traits\Models\ActivityLog; +use App\Traits\Models\Orderable; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Validation\ValidationException; @@ -12,6 +13,7 @@ class Aisle extends Model { use ActivityLog; use HasFactory; + use Orderable; /** * The attributes that are mass assignable. @@ -81,29 +83,6 @@ class Aisle extends Model $model->picture = FileStorageHelper::storeFile($model, $model->picture, true); } - /** - * Set order after the last element of the list. - * - * @param self $model - * @param boolean $isDeletion - * @return void - */ - private static function setOrder(self $model, bool $isDeletion = false): void - { - $maxOrder = \intval(self::query()->where('network_id', $model->network_id)->max('order')); - - if ($isDeletion) { - $request = Aisle::query() - ->where('network_id', $model->network_id) - ->whereNot('id', $model->id) - ->whereBetween('order', [$model->order, $maxOrder]); - $request->decrement('order', 1); - return; - } - - $model->order = $maxOrder + 1; - } - /** * Check if the limit of published models is reached. * @@ -125,6 +104,16 @@ class Aisle extends Model } } + /** + * Group ordering by network_id. + * + * @return string + */ + public function getOrderGroupField(): string + { + return 'network_id'; + } + // * RELATIONS /** diff --git a/app/Traits/Controllers/UpdateModelOrder.php b/app/Traits/Controllers/UpdateModelOrder.php new file mode 100644 index 0000000..05973b9 --- /dev/null +++ b/app/Traits/Controllers/UpdateModelOrder.php @@ -0,0 +1,44 @@ +validated('order'); + + return DB::transaction(function () use ($model, $newOrder): RedirectResponse { + $groupField = $model->getOrderGroupField(); + + $query = $model::query() + ->whereKeyNot($model) + ->whereBetween('order', [min($model->order, $newOrder), max($model->order, $newOrder)]); + + if ($groupField) { + $query->where($groupField, $model->{$groupField}); + } + + $model->order < $newOrder ? $query->decrement('order', 1) : $query->increment('order', 1); + + $model->order = $newOrder; + if (!$model->saveOrFail()) { + return back()->with('error', trans('crud.messages.order_not_changed')); + }; + + return back()->with('success', trans('crud.messages.order_changed')); + }); + } +} diff --git a/app/Traits/Models/Orderable.php b/app/Traits/Models/Orderable.php new file mode 100644 index 0000000..6f6a0a3 --- /dev/null +++ b/app/Traits/Models/Orderable.php @@ -0,0 +1,53 @@ +getOrderGroupField(); + $maxOrderQuery = $model::query(); + + if ($groupField) { + $maxOrderQuery->where($groupField, $model->{$groupField}); + } + + $maxOrder = \intval($maxOrderQuery->max('order')); + + if ($isDeletion) { + $query = $model::query() + ->whereKeyNot($model) + ->whereBetween('order', [$model->order, $maxOrder]); + + if ($groupField) { + $query->where($groupField, $model->{$groupField}); + } + + $query->decrement('order', 1); + return; + } + + $model->order = $maxOrder + 1; + } +} diff --git a/resources/views/bo/modules/change-model-order-select.blade.php b/resources/views/bo/modules/change-model-order-select.blade.php index 5ebb4bb..313e09c 100644 --- a/resources/views/bo/modules/change-model-order-select.blade.php +++ b/resources/views/bo/modules/change-model-order-select.blade.php @@ -7,11 +7,11 @@