diff --git a/app/Http/Controllers/Bo/TicketController.php b/app/Http/Controllers/Bo/TicketController.php index b73629c..c158ef7 100644 --- a/app/Http/Controllers/Bo/TicketController.php +++ b/app/Http/Controllers/Bo/TicketController.php @@ -13,6 +13,7 @@ use App\Http\Requests\Bo\ChangeTicketStatus; use App\Http\Requests\Bo\CreateMessage; use App\Http\Requests\Bo\SortTickets; use App\Http\Requests\Bo\StoreTicket; +use App\Http\Requests\Bo\UpdateChangeOrderRequest; use App\Http\Requests\Bo\UpdateMessage; use App\Http\Requests\Bo\UpdateTicket; use App\Lib\Helpers\FileStorageHelper; @@ -29,12 +30,10 @@ use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Session; use Illuminate\Support\Str; -use App\Traits\Controllers\ChangesModelOrder; +use Illuminate\Support\Arr; class TicketController extends Controller { - use ChangesModelOrder; - /** * TicketController */ @@ -508,6 +507,7 @@ class TicketController extends Controller Session::remove('tickets.st'); Session::remove('tickets.pr'); Session::remove('tickets.ty'); + Session::remove('tickets.or'); Session::remove('tickets.search'); } if ($request->assr) { @@ -522,11 +522,15 @@ class TicketController extends Controller if ($request->tys) { Session::remove('tickets.ty'); } + if ($request->ord) { + Session::remove('tickets.or'); + } if ($request->pr) { Session::put('tickets.pr', $request->pr); } if ($request->st) { Session::put('tickets.st', $request->st); + Session::remove('tickets.or'); } if ($request->ty) { Session::put('tickets.ty', $request->ty); @@ -534,6 +538,9 @@ class TicketController extends Controller if ($request->ass) { Session::put('tickets.ass', $request->ass); } + if ($request->or && Session::has('tickets.pr')) { + Session::put('tickets.or', $request->or); + } Session::save(); if (Session::has('tickets.pr')) { @@ -553,6 +560,13 @@ class TicketController extends Controller if (Session::has('tickets.ty')) { $tickets->where('type', Session::get('tickets.ty')); } + + if (Session::has('tickets.or')) { + $tickets->orderBy('order', 'ASC'); + } else { + $tickets->orderBy('last_activity', 'DESC'); + } + return $tickets; } @@ -709,4 +723,62 @@ class TicketController extends Controller } return \sprintf("

Fichier %d :
%s
", $fileNb, $file); } + + /** + * Change order. + * + * @param \App\Http\Requests\Bo\UpdateChangeOrderRequest $request + * @param mixed ...$params + * @return \Illuminate\Http\RedirectResponse + * @throws \RuntimeException Si le nom du parametre de la route ne correspond pas au params utilisé. + */ + public function changeOrder(UpdateChangeOrderRequest $request, mixed ...$params): \Illuminate\Http\RedirectResponse + { + $paramNames = collect(request()->route()->parameterNames); + $className = Str::of($paramNames->get($paramNames->count() - 2))->lower()->studly(); + $className = "\\App\\Models\\{$className}"; + $model = Arr::get($params, $paramNames->count() - 2); + + if (!class_exists($className)) { + throw new \RuntimeException("The {$className} class doesn't exist."); + } + + if (!\is_object($model)) { + throw new \RuntimeException("The second last param isn't an object."); + } + + if (get_class($model) !== (string)Str::of($className)->replaceStart('\\', '')) { + throw new \RuntimeException("The {$className} doesn't match second last binded param."); + } + + /** @var \Illuminate\Database\Eloquent\Model|null */ + $model = $className::query()->where($model->getRouteKeyName(), $model->getRouteKey())->first(); + + if (!$model) { + return back()->with('error', trans('crud.messages.order_not_changed')); + } + + return DB::transaction(function () use ($request, $className, $model) { + /** @var \Illuminate\Support\Collection $models */ + $models = $className::query() + ->orderBy('order', 'ASC') + ->where('site_id', $model->site_id) + ->where('status', '!=', TicketStatusEnum::archived) + ->where('id', '!=', $model->getKey()) + ->where('order', $request->direction ? '<' : '>', $model->order) + ->get(); + /** @var \Illuminate\Database\Eloquent\Model|null $tmp */ + $tmp = $request->direction ? $models->last() : $models->first(); + + if (!$tmp) { + return back()->with('error', trans('crud.messages.order_not_changed')); + } + + $newOrder = $tmp->getOriginal('order'); + $tmp->update(['order' => $model->getOriginal('order')]); + $model->update(['order' => $newOrder]); + + return redirect()->back()->with('success', trans('crud.messages.order_changed')); + }); + } } diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index ed2f0d8..5686abc 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -223,10 +223,6 @@ class Controller extends BaseController ) { $query = $query->orderBy(\sprintf("$table.%s", request()->sort_col), request()->sort_way); } - } elseif (Schema::hasColumn($table, 'order')) { - $query = $query->orderBy('order', 'ASC'); - Session::put("$rName.sort_col", 'order'); - Session::put("$rName.sort_way", 'asc'); } return $query; } diff --git a/database/migrations/2025_03_12_102925_change_order_to_tickets.php b/database/migrations/2025_03_12_102925_change_order_to_tickets.php index 25574e5..3483b0a 100644 --- a/database/migrations/2025_03_12_102925_change_order_to_tickets.php +++ b/database/migrations/2025_03_12_102925_change_order_to_tickets.php @@ -1,8 +1,7 @@ integer('order')->after('status')->comment('Ordre du ticket'); + $table->integer('order')->after('status')->comment('Ticket order.'); }); - Ticket::query()->where('status', '!=', TicketStatusEnum::archived)->get()->map(function ($ticket, $ticketIndex) { - $ticket->order = $ticketIndex + 1; - $ticket->saveQuietly(); - }); - Ticket::query()->where('status', '=', TicketStatusEnum::archived)->get()->map(function ($ticket, $ticketIndex) { - $ticket->order = $ticketIndex + 1; - $ticket->saveQuietly(); + Site::query()->get()->map(function ($site) { + $site->tickets->map(function ($ticket, $ticketIndex) { + $ticket->order = $ticketIndex + 1; + $ticket->saveQuietly(); + }); }); } diff --git a/resources/lang/en.json b/resources/lang/en.json index d208ff2..714172c 100644 --- a/resources/lang/en.json +++ b/resources/lang/en.json @@ -50,5 +50,6 @@ "Verify Your Email Address": "Verify Your Email Address", "Whoops!": "Whoops!", "You are logged in!": "You are logged in!", - "You are receiving this email because we received a password reset request for your account.": "You are receiving this email because we received a password reset request for your account." -} \ No newline at end of file + "You are receiving this email because we received a password reset request for your account.": "You are receiving this email because we received a password reset request for your account.", + "see_mode": "see :mode mode" +} diff --git a/resources/lang/en/validation.php b/resources/lang/en/validation.php index 2076bd3..170d2ac 100644 --- a/resources/lang/en/validation.php +++ b/resources/lang/en/validation.php @@ -214,4 +214,12 @@ return [ 'username' => 'username', 'year' => 'year', ], + 'custom' => [ + 'type' => 'type', + 'tickets' => 'tickets', + 'assigned_to' => 'assigned to', + 'order' => 'order', + 'priority' => 'priority', + 'default' => 'default', + ] ]; diff --git a/resources/lang/fr.json b/resources/lang/fr.json index 9c2ad17..3549abe 100644 --- a/resources/lang/fr.json +++ b/resources/lang/fr.json @@ -55,5 +55,6 @@ "Verify Your Email Address": "Vérifiez votre adresse e-mail", "Whoops!": "Oups !", "You are logged in!": "Vous êtes connecté·e !", - "You are receiving this email because we received a password reset request for your account.": "Vous recevez cet e-mail car nous avons reçu une demande de réinitialisation de mot de passe pour votre compte." -} \ No newline at end of file + "You are receiving this email because we received a password reset request for your account.": "Vous recevez cet e-mail car nous avons reçu une demande de réinitialisation de mot de passe pour votre compte.", + "see_mode": "voir mode :mode" +} diff --git a/resources/lang/fr/validation.php b/resources/lang/fr/validation.php index c259430..39d3513 100644 --- a/resources/lang/fr/validation.php +++ b/resources/lang/fr/validation.php @@ -255,5 +255,7 @@ return [ 'tickets' => 'étiquettes', 'assigned_to' => 'assigné à', 'order' => 'ordre', + 'priority' => 'priorité', + 'default' => 'défaut', ] ]; diff --git a/resources/ts/bo/utilities/fontawesome.ts b/resources/ts/bo/utilities/fontawesome.ts index 836339f..fa4d683 100644 --- a/resources/ts/bo/utilities/fontawesome.ts +++ b/resources/ts/bo/utilities/fontawesome.ts @@ -33,6 +33,7 @@ import { faDeleteLeft, faDiagramProject, faDownload, + faEquals, faEraser, faEye, faEyeSlash, @@ -60,6 +61,7 @@ import { faTicket, faTimes, faTrash, + faTriangleExclamation, faUndoAlt, faUsers, faWandMagic, @@ -137,4 +139,6 @@ library.add(faCopy); library.add(faClipboard); library.add(faXmark); library.add(faArrowRightFromBracket); +library.add(faTriangleExclamation); +library.add(faEquals); dom.watch(); diff --git a/resources/views/bo/modules/change-model-order.blade.php b/resources/views/bo/modules/change-model-order.blade.php index b197f63..a304ff0 100644 --- a/resources/views/bo/modules/change-model-order.blade.php +++ b/resources/views/bo/modules/change-model-order.blade.php @@ -1,4 +1,7 @@ + @if (isset($value)) + {{ $value }} + @endif @can('changeOrder', $model)
$loop->first and $models->onFirstPage()]) @@ -30,7 +33,7 @@
- @else + @elseif(isset($noRightsVisible) && $noRightsVisible) diff --git a/resources/views/bo/modules/table-col-sorter.blade.php b/resources/views/bo/modules/table-col-sorter.blade.php index 60bf1b8..010e589 100644 --- a/resources/views/bo/modules/table-col-sorter.blade.php +++ b/resources/views/bo/modules/table-col-sorter.blade.php @@ -12,21 +12,7 @@ @endphp @foreach ($cols as $col => $colname) - @if($col === 'order') - @if( - !request()->sort_col - && !request()->sort_way - && !request()->ass - && !request()->st - && !request()->pr - && !request()->ty - && !request()->search - ) - @include('bo.modules.table-col-sorter-cell') - @endif - @else - @include('bo.modules.table-col-sorter-cell') - @endif + @include('bo.modules.table-col-sorter-cell') @endforeach {{-- Buttons Col --}} @@ -42,4 +28,4 @@ @endif - \ No newline at end of file + diff --git a/resources/views/bo/pages/tickets/index.blade.php b/resources/views/bo/pages/tickets/index.blade.php index 4cbaf4f..34ead0b 100644 --- a/resources/views/bo/pages/tickets/index.blade.php +++ b/resources/views/bo/pages/tickets/index.blade.php @@ -13,7 +13,9 @@
-

{{ __('Gestion des tickets') }} @if (Session::get('tickets.st') == \App\Enums\Tickets\TicketStatusEnum::archived->value) +

+ {{ __('Gestion des tickets') }} + @if (Session::get('tickets.st') == \App\Enums\Tickets\TicketStatusEnum::archived->value) (Archivés) @endif

@@ -24,23 +26,39 @@ @can('isAdmin') @endcan -   {{ __('ticket') }} + +   {{ __('ticket') }} + + @if (session('tickets.pr') && session('tickets.st') != \App\Enums\Tickets\TicketStatusEnum::archived->value) + @if (session('tickets.or')) + +   {{ __('see_mode', ['mode' => __('validation.custom.default')]) }} + + @else + +   {{ __('see_mode', ['mode' => __('validation.custom.priority')]) }} + + @endif + @endif @if (session('tickets.st') == \App\Enums\Tickets\TicketStatusEnum::archived->value) - + + + @else + href="{{ route('bo.ticket.index', ['st' => \App\Enums\Tickets\TicketStatusEnum::archived]) }}"> + + @endif -  {{ __(' le tri') }} + +  {{ __(' le tri') }} +
- + + value="{{ session()->get('tickets.search') }}" aria-label="{{ __('Recherche de ticket...') }}" + aria-describedby="searchTicket" placeholder="{{ __('Recherche de ticket...') }}">