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 @@