diff --git a/app/Http/Controllers/Bo/TicketController.php b/app/Http/Controllers/Bo/TicketController.php index ce4164e..0b4fe66 100644 --- a/app/Http/Controllers/Bo/TicketController.php +++ b/app/Http/Controllers/Bo/TicketController.php @@ -17,6 +17,7 @@ use App\Http\Requests\Bo\UpdateChangeOrderRequest; use App\Http\Requests\Bo\UpdateMessage; use App\Http\Requests\Bo\UpdateTicket; use App\Http\Requests\Bo\LinkTicket; +use App\Http\Requests\Bo\UpdateTicketPriorityRequest; use App\Lib\Helpers\FileStorageHelper; use App\Lib\Helpers\ToolboxHelper; use App\Mail\NewTicket; @@ -878,4 +879,34 @@ class TicketController extends Controller return redirect()->back()->with('success', trans('crud.messages.order_changed')); }); } + + /** + * Update ticket priority. + * + * @param UpdateTicketPriorityRequest $request + * @param Ticket $ticket + * @return void + */ + public function changePriority(UpdateTicketPriorityRequest $request, Ticket $ticket) + { + $newPriority = $request->validated('priority'); + + return DB::transaction(function () use ($ticket, $newPriority) { + // Update all tickets who will be moved with this priority update. + $request = Ticket::query() + ->where('site_id', $ticket->site_id) + ->whereNot('status', TicketStatusEnum::archived) + ->whereNot('id', $ticket->id) + ->whereBetween('order', [min($ticket->order, $newPriority), max($ticket->order, $newPriority)]); + $ticket->order < $newPriority ? $request->decrement('order', 1) : $request->increment('order', 1); + + // Update the ticket. + $ticket->order = $newPriority; + if (!$ticket->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/UpdateTicketPriorityRequest.php b/app/Http/Requests/Bo/UpdateTicketPriorityRequest.php new file mode 100644 index 0000000..f3a5d45 --- /dev/null +++ b/app/Http/Requests/Bo/UpdateTicketPriorityRequest.php @@ -0,0 +1,57 @@ +check(); + } + + /** + * Prepare the data for validation. + * + * @return void + */ + protected function prepareForValidation(): void + { + $this->ticket = $this->route('ticket'); + $max = Ticket::query()->where('site_id', $this->ticket->site_id)->max('order'); + + $this->merge([ + 'priority' => min($this->integer('priority'), $max) + ]); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(): array + { + return [ + 'priority' => [ + 'required', + 'integer', + 'min:1', + function ($attribute, $value, $fail) { + if ($this->ticket && intval($value) === $this->ticket->order) { + $fail("La valeur de {$attribute} doit être différente de la valeur actuelle."); + } + }, + ], + ]; + } +} diff --git a/database/migrations/2025_11_19_142520_reorder_all_tickets.php b/database/migrations/2025_11_19_142520_reorder_all_tickets.php new file mode 100644 index 0000000..56fb9e2 --- /dev/null +++ b/database/migrations/2025_11_19_142520_reorder_all_tickets.php @@ -0,0 +1,36 @@ +each(function (Site $site) { + $tickets = $site->tickets()->whereNot('status', TicketStatusEnum::archived)->orderBy('order')->get(); + $order = 1; + foreach ($tickets as $ticket) { + $ticket->order = $order; + $ticket->saveOrFail(); + $order++; + } + }); + Ticket::query()->where('status', TicketStatusEnum::archived)->update([ + 'order' => 0 + ]); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // Nothing to revert. + } +}; diff --git a/resources/ts/bo/utilities/fontawesome.ts b/resources/ts/bo/utilities/fontawesome.ts index f3568c8..d2efeb3 100644 --- a/resources/ts/bo/utilities/fontawesome.ts +++ b/resources/ts/bo/utilities/fontawesome.ts @@ -66,7 +66,8 @@ import { faUsers, faWandMagic, faXmark, - faLinkSlash + faLinkSlash, + faChevronDown } from "@fortawesome/free-solid-svg-icons"; config.autoReplaceSvg = false; @@ -132,6 +133,7 @@ library.add(faLinkSlash); // Front library.add(faChevronLeft); library.add(faChevronRight); +library.add(faChevronDown); library.add(faBan); library.add(faDownload); library.add(faUsers); diff --git a/resources/views/bo/modules/change-model-order-select.blade.php b/resources/views/bo/modules/change-model-order-select.blade.php new file mode 100644 index 0000000..2b5b48e --- /dev/null +++ b/resources/views/bo/modules/change-model-order-select.blade.php @@ -0,0 +1,23 @@ + +
+ {{ $value ?? '' }} + + +
+ + diff --git a/resources/views/bo/pages/tickets/index.blade.php b/resources/views/bo/pages/tickets/index.blade.php index 8e34379..48dcfad 100644 --- a/resources/views/bo/pages/tickets/index.blade.php +++ b/resources/views/bo/pages/tickets/index.blade.php @@ -256,12 +256,9 @@ {{-- order --}} @if (session('tickets.or')) - @include('bo.modules.change-model-order', [ - 'routeName' => 'ticket', + @include('bo.modules.change-model-order-select', [ 'model' => $ticket, - 'models' => $tickets, 'value' => $key + 1 + ($tickets->currentPage() - 1) * $tickets->perPage(), - 'noRightsVisible' => false, ]) @endif {{-- id --}} diff --git a/routes/web-bo.php b/routes/web-bo.php index 3a78802..bf98ad2 100644 --- a/routes/web-bo.php +++ b/routes/web-bo.php @@ -88,10 +88,10 @@ Route::middleware('admin-secure') ) ->middleware('can:createGitlabIssue,ticket') ->name('ticket.create-issue'); - Route::patch('/tickets/{ticket}/change-order/{direction}', [ + Route::patch('/tickets/{ticket}/change-priority', [ TicketController::class, - 'changeOrder' - ])->where('direction', 'up|down')->name('ticket.change-order'); + 'changePriority' + ])->name('ticket.change-priority'); }); Route::resource('credit_accounts', AccountController::class) ->only(['index'])