Browse Source

feat: ✨ Reopen tickets

Johannes F 2 years ago
parent
commit
af5d28e2a5

+ 13 - 3
app/Http/Controllers/Moderation/TicketsController.php

@@ -33,9 +33,14 @@ class TicketsController extends Controller
         return view('moderator.ticket.show', compact('ticket', 'ticketcategory', 'ticketcomments', 'server'));
     }
 
-    public function close($ticket_id)
+    public function changeStatus($ticket_id)
     {
         $ticket = Ticket::where('ticket_id', $ticket_id)->firstOrFail();
+        if($ticket->status == "Closed"){
+            $ticket->status = "Reopened";
+            $ticket->save();
+            return redirect()->back()->with('success', __('A ticket has been reopened, ID: #') . $ticket->ticket_id);
+        }
         $ticket->status = 'Closed';
         $ticket->save();
         $ticketOwner = $ticket->user;
@@ -85,12 +90,16 @@ class TicketsController extends Controller
                 return '<a href="'.route('admin.users.show', $tickets->user->id).'">'.$tickets->user->name.'</a>';
             })
             ->addColumn('actions', function (Ticket $tickets) {
+                $statusButtonColor = ($tickets->status == "Closed") ? 'btn-success' : 'btn-warning';
+                $statusButtonIcon = ($tickets->status == "Closed") ? 'fa-redo' : 'fa-times';
+                $statusButtonText = ($tickets->status == "Closed") ? __('Reopen') : __('Close');
+
                 return '
                             <a data-content="'.__('View').'" data-toggle="popover" data-trigger="hover" data-placement="top" href="'.route('moderator.ticket.show', ['ticket_id' => $tickets->ticket_id]).'" class="btn btn-sm text-white btn-info mr-1"><i class="fas fa-eye"></i></a>
-                            <form class="d-inline"  method="post" action="'.route('moderator.ticket.close', ['ticket_id' => $tickets->ticket_id]).'">
+                            <form class="d-inline"  method="post" action="'.route('moderator.ticket.changeStatus', ['ticket_id' => $tickets->ticket_id]).'">
                                 '.csrf_field().'
                                 '.method_field('POST').'
-                            <button data-content="'.__('Close').'" data-toggle="popover" data-trigger="hover" data-placement="top" class="btn btn-sm text-white btn-warning mr-1"><i class="fas fa-times"></i></button>
+                            <button data-content="'.__($statusButtonText).'" data-toggle="popover" data-trigger="hover" data-placement="top" class="btn btn-sm text-white '.$statusButtonColor.'  mr-1"><i class="fas '.$statusButtonIcon.'"></i></button>
                             </form>
                             <form class="d-inline"  method="post" action="'.route('moderator.ticket.delete', ['ticket_id' => $tickets->ticket_id]).'">
                                 '.csrf_field().'
@@ -101,6 +110,7 @@ class TicketsController extends Controller
             })
             ->editColumn('status', function (Ticket $tickets) {
                 switch ($tickets->status) {
+                    case 'Reopened':
                     case 'Open':
                         $badgeColor = 'badge-success';
                         break;

+ 13 - 3
app/Http/Controllers/TicketsController.php

@@ -104,9 +104,14 @@ class TicketsController extends Controller
 
         return redirect()->back()->with('success', __('Your comment has been submitted'));
     }
-    public function close($ticket_id)
+    public function changeStatus($ticket_id)
     {
         $ticket = Ticket::where('user_id', Auth::user()->id)->where("ticket_id", $ticket_id)->firstOrFail();
+        if($ticket->status == "Closed"){
+            $ticket->status = "Reopened";
+            $ticket->save();
+            return redirect()->back()->with('success', __('A ticket has been reopened, ID: #') . $ticket->ticket_id);
+        }
         $ticket->status = "Closed";
         $ticket->save();
         return redirect()->back()->with('success', __('A ticket has been closed, ID: #') . $ticket->ticket_id);
@@ -125,6 +130,7 @@ class TicketsController extends Controller
             })
             ->editColumn('status', function (Ticket $tickets) {
                 switch ($tickets->status) {
+                    case 'Reopened':
                     case 'Open':
                         $badgeColor = 'badge-success';
                         break;
@@ -149,12 +155,16 @@ class TicketsController extends Controller
                     'raw' => $tickets->updated_at ? strtotime($tickets->updated_at) : ''];
             })
             ->addColumn('actions', function (Ticket $tickets) {
+                $statusButtonColor = ($tickets->status == "Closed") ? 'btn-success' : 'btn-warning';
+                $statusButtonIcon = ($tickets->status == "Closed") ? 'fa-redo' : 'fa-times';
+                $statusButtonText = ($tickets->status == "Closed") ? __('Reopen') : __('Close');
+
                 return '
                             <a data-content="'.__('View').'" data-toggle="popover" data-trigger="hover" data-placement="top" href="'.route('ticket.show', ['ticket_id' => $tickets->ticket_id]).'" class="btn btn-sm text-white btn-info mr-1"><i class="fas fa-eye"></i></a>
-                            <form class="d-inline"  method="post" action="'.route('ticket.close', ['ticket_id' => $tickets->ticket_id]).'">
+                            <form class="d-inline"  method="post" action="'.route('ticket.changeStatus', ['ticket_id' => $tickets->ticket_id]).'">
                                 '.csrf_field().'
                                 '.method_field('POST').'
-                            <button data-content="'.__('Close').'" data-toggle="popover" data-trigger="hover" data-placement="top" class="btn btn-sm text-white btn-warning mr-1"><i class="fas fa-times"></i></button>
+                            <button data-content="'.__($statusButtonText).'" data-toggle="popover" data-trigger="hover" data-placement="top" class="btn btn-sm text-white '.$statusButtonColor.'  mr-1"><i class="fas '.$statusButtonIcon.'"></i></button>
                             </form>
 
                             </form>

+ 2 - 2
routes/web.php

@@ -113,7 +113,7 @@ Route::middleware(['auth', 'checkSuspended'])->group(function () {
         Route::post('ticket/new', [TicketsController::class, 'store'])->middleware(['throttle:ticket-new'])->name('ticket.new.store');
         Route::get('ticket/show/{ticket_id}', [TicketsController::class, 'show'])->name('ticket.show');
         Route::post('ticket/reply', [TicketsController::class, 'reply'])->middleware(['throttle:ticket-reply'])->name('ticket.reply');
-        Route::post('ticket/close/{ticket_id}', [TicketsController::class, 'close'])->name('ticket.close');
+        Route::post('ticket/status/{ticket_id}', [TicketsController::class, 'changeStatus'])->name('ticket.changeStatus');
     }
 
     //admin
@@ -211,7 +211,7 @@ Route::middleware(['auth', 'checkSuspended'])->group(function () {
         Route::get('ticket/datatable', [ModTicketsController::class, 'datatable'])->name('ticket.datatable');
         Route::get('ticket/show/{ticket_id}', [ModTicketsController::class, 'show'])->name('ticket.show');
         Route::post('ticket/reply', [ModTicketsController::class, 'reply'])->name('ticket.reply');
-        Route::post('ticket/close/{ticket_id}', [ModTicketsController::class, 'close'])->name('ticket.close');
+        Route::post('ticket/status/{ticket_id}', [ModTicketsController::class, 'changeStatus'])->name('ticket.changeStatus');
         Route::post('ticket/delete/{ticket_id}', [ModTicketsController::class, 'delete'])->name('ticket.delete');
         //ticket moderation blacklist
         Route::get('ticket/blacklist', [ModTicketsController::class, 'blacklist'])->name('ticket.blacklist');

+ 24 - 7
themes/default/views/moderator/ticket/show.blade.php

@@ -44,6 +44,9 @@
                                         @case("Open")
                                             <span class="badge badge-success">{{__("Open")}}</span>
                                         @break
+                                        @case("Reopened")
+                                            <span class="badge badge-success">{{__("Reopened")}}</span>
+                                            @break
                                         @case("Closed")
                                             <span class="badge badge-danger">{{__("Closed")}}</span>
                                         @break
@@ -69,13 +72,27 @@
                                         @endswitch
                                     </p>
                                     <p><b>{{__("Created on")}}:</b> {{ $ticket->created_at->diffForHumans() }}</p>
-                                @if($ticket->status!='Closed')
-                                    <form class="d-inline"  method="post" action="{{route('moderator.ticket.close', ['ticket_id' => $ticket->ticket_id ])}}">
-                                        {{csrf_field()}}
-                                        {{method_field("POST") }}
-                                        <button data-content="{{__("Close")}}" data-toggle="popover" data-trigger="hover" data-placement="top" class="btn btn-sm text-white btn-warning mr-1"><i class="fas fa-times"></i>{{__("Close")}}</button>
-                                    </form>
-                                @endif
+                                    @if($ticket->status=='Closed')
+                                        <form class="d-inline" method="post"
+                                              action="{{route('moderator.ticket.changeStatus', ['ticket_id' => $ticket->ticket_id ])}}">
+                                            {{csrf_field()}}
+                                            {{method_field("POST") }}
+                                            <button data-content="{{__("Reopen")}}" data-toggle="popover"
+                                                    data-trigger="hover" data-placement="top"
+                                                    class="btn btn-sm text-white btn-success mr-1"><i
+                                                    class="fas fa-redo"></i>{{__("Reopen")}}</button>
+                                        </form>
+                                    @else
+                                        <form class="d-inline" method="post"
+                                              action="{{route('moderator.ticket.changeStatus', ['ticket_id' => $ticket->ticket_id ])}}">
+                                            {{csrf_field()}}
+                                            {{method_field("POST") }}
+                                            <button data-content="{{__("Close")}}" data-toggle="popover"
+                                                    data-trigger="hover" data-placement="top"
+                                                    class="btn btn-sm text-white btn-warning mr-1"><i
+                                                    class="fas fa-times"></i>{{__("Close")}}</button>
+                                        </form>
+                                    @endif
                             </div>
                         </div>
                     </div>

+ 1 - 1
themes/default/views/store/index.blade.php

@@ -36,7 +36,7 @@
 
                 <div class="card">
                     <div class="card-header">
-                        <h5 class="card-title"><i class="fa fa-coins mr-2"></i>{{ config('app.name', 'Controlpanel.gg') }} Store</h5>
+                        <h5 class="card-title"><i class="fa fa-coins mr-2"></i>{{ CREDITS_DISPLAY_NAME }}</h5>
                     </div>
                     <div class="card-body">
                         <table class="table table-striped table-responsive-sm">

+ 88 - 69
themes/default/views/ticket/show.blade.php

@@ -35,43 +35,58 @@
                         <div class="card-body">
                             <div class="ticket-info">
                                 @if(!empty($server))
-                                <p><b>{{__("Server")}}:</b> <a href="{{ config('SETTINGS::SYSTEM:PTERODACTYL:URL') }}/server/{{ $server->identifier }}" target="__blank">{{ $server->name }} </a></p>
+                                    <p><b>{{__("Server")}}:</b> <a
+                                            href="{{ config('SETTINGS::SYSTEM:PTERODACTYL:URL') }}/server/{{ $server->identifier }}"
+                                            target="__blank">{{ $server->name }} </a></p>
                                 @endif
-                                    <p><b>{{__("Title")}}:</b> {{ $ticket->title }}</p>
-                                    <p><b>{{__("Category")}}:</b> {{ $ticketcategory->name }}</p>
-                                    <p><b>{{__("Status")}}:</b>
-                                        @switch($ticket->status)
-                                            @case("Open")
-                                                <span class="badge badge-success">{{__("Open")}}</span>
-                                                @break
-                                            @case("Closed")
-                                                <span class="badge badge-danger">{{__("Closed")}}</span>
-                                                @break
-                                            @case("Answered")
-                                                <span class="badge badge-info">{{__("Answered")}}</span>
-                                                @break
-                                            @case("Client Reply")
-                                                <span class="badge badge-warning">{{__("Client Reply")}}</span>
-                                                @break
-                                        @endswitch
-                                    </p>
-                                    <p><b>Priority:</b>
-                                        @switch($ticket->priority)
-                                            @case("Low")
-                                                <span class="badge badge-success">{{__("Low")}}</span>
-                                                @break
-                                            @case("Medium")
-                                                <span class="badge badge-warning">{{__("Medium")}}</span>
-                                                @break
-                                            @case("High")
-                                                <span class="badge badge-danger">{{__("High")}}</span>
-                                                @break
-                                        @endswitch
-                                    </p>
+                                <p><b>{{__("Title")}}:</b> {{ $ticket->title }}</p>
+                                <p><b>{{__("Category")}}:</b> {{ $ticketcategory->name }}</p>
+                                <p><b>{{__("Status")}}:</b>
+                                    @switch($ticket->status)
+                                        @case("Open")
+                                            <span class="badge badge-success">{{__("Open")}}</span>
+                                            @break
+                                        @case("Reopened")
+                                            <span class="badge badge-success">{{__("Reopened")}}</span>
+                                            @break
+                                        @case("Closed")
+                                            <span class="badge badge-danger">{{__("Closed")}}</span>
+                                            @break
+                                        @case("Answered")
+                                            <span class="badge badge-info">{{__("Answered")}}</span>
+                                            @break
+                                        @case("Client Reply")
+                                            <span class="badge badge-warning">{{__("Client Reply")}}</span>
+                                            @break
+                                    @endswitch
+                                </p>
+                                <p><b>Priority:</b>
+                                    @switch($ticket->priority)
+                                        @case("Low")
+                                            <span class="badge badge-success">{{__("Low")}}</span>
+                                            @break
+                                        @case("Medium")
+                                            <span class="badge badge-warning">{{__("Medium")}}</span>
+                                            @break
+                                        @case("High")
+                                            <span class="badge badge-danger">{{__("High")}}</span>
+                                            @break
+                                    @endswitch
+                                </p>
                                 <p><b>{{__("Created on")}}:</b> {{ $ticket->created_at->diffForHumans() }}</p>
-                                @if($ticket->status!='Closed')
+                                @if($ticket->status=='Closed')
                                     <form class="d-inline" method="post"
-                                          action="{{route('ticket.close', ['ticket_id' => $ticket->ticket_id ])}}">
+                                          action="{{route('ticket.changeStatus', ['ticket_id' => $ticket->ticket_id ])}}">
+                                        {{csrf_field()}}
+                                        {{method_field("POST") }}
+                                        <button data-content="{{__("Reopen")}}" data-toggle="popover"
+                                                data-trigger="hover" data-placement="top"
+                                                class="btn btn-sm text-white btn-success mr-1"><i
+                                                class="fas fa-redo"></i>{{__("Reopen")}}</button>
+                                    </form>
+                                @else
+                                    <form class="d-inline" method="post"
+                                          action="{{route('ticket.changeStatus', ['ticket_id' => $ticket->ticket_id ])}}">
                                         {{csrf_field()}}
                                         {{method_field("POST") }}
                                         <button data-content="{{__("Close")}}" data-toggle="popover"
@@ -96,56 +111,60 @@
                                 <div class="card-header">
                                     <div class="d-flex justify-content-between">
                                         <h5 class="card-title"><img
-                                            src="https://www.gravatar.com/avatar/{{ md5(strtolower($ticket->user->email)) }}?s=25"
-                                            class="user-image" alt="User Image">
-                                        <a href="/admin/users/{{$ticket->user->id}}">{{ $ticket->user->name }} </a>
-                                        @if($ticket->user->role === "member")
-                                            <span class="badge badge-secondary"> Member </span>
-                                        @elseif ($ticket->user->role === "client")
-                                            <span class="badge badge-success"> Client </span>
-                                        @elseif ($ticket->user->role === "moderator")
-                                            <span class="badge badge-info"> Moderator </span>
-                                        @elseif ($ticket->user->role === "admin")
-                                            <span class="badge badge-danger"> Admin </span>
-                                        @endif
+                                                src="https://www.gravatar.com/avatar/{{ md5(strtolower($ticket->user->email)) }}?s=25"
+                                                class="user-image" alt="User Image">
+                                            <a href="/admin/users/{{$ticket->user->id}}">{{ $ticket->user->name }} </a>
+                                            @if($ticket->user->role === "member")
+                                                <span class="badge badge-secondary"> Member </span>
+                                            @elseif ($ticket->user->role === "client")
+                                                <span class="badge badge-success"> Client </span>
+                                            @elseif ($ticket->user->role === "moderator")
+                                                <span class="badge badge-info"> Moderator </span>
+                                            @elseif ($ticket->user->role === "admin")
+                                                <span class="badge badge-danger"> Admin </span>
+                                            @endif
                                         </h5>
-                                        <span class="badge badge-primary">{{ $ticket->created_at->diffForHumans() }}</span>
+                                        <span
+                                            class="badge badge-primary">{{ $ticket->created_at->diffForHumans() }}</span>
                                     </div>
                                 </div>
                                 <div class="card-body" style="white-space:pre-wrap">{{ $ticket->message }}</div>
                             </div>
                             @foreach ($ticketcomments as $ticketcomment)
-                            <div class="card">
-                                <div class="card-header">
-                                    <div class="d-flex justify-content-between">
-                                        <h5 class="card-title"><img
-                                            src="https://www.gravatar.com/avatar/{{ md5(strtolower($ticketcomment->user->email)) }}?s=25"
-                                            class="user-image" alt="User Image">
-                                        <a href="/admin/users/{{$ticketcomment->user->id}}">{{ $ticketcomment->user->name }}</a>
-                                        @if($ticketcomment->user->role === "member")
-                                            <span class="badge badge-secondary"> Member </span>
-                                        @elseif ($ticketcomment->user->role === "client")
-                                            <span class="badge badge-success"> Client </span>
-                                        @elseif ($ticketcomment->user->role === "moderator")
-                                            <span class="badge badge-info"> Moderator </span>
-                                        @elseif ($ticketcomment->user->role === "admin")
-                                            <span class="badge badge-danger"> Admin </span>
-                                        @endif
-                                    </h5>
-                                        <span class="badge badge-primary">{{ $ticketcomment->created_at->diffForHumans() }}</span>
+                                <div class="card">
+                                    <div class="card-header">
+                                        <div class="d-flex justify-content-between">
+                                            <h5 class="card-title"><img
+                                                    src="https://www.gravatar.com/avatar/{{ md5(strtolower($ticketcomment->user->email)) }}?s=25"
+                                                    class="user-image" alt="User Image">
+                                                <a href="/admin/users/{{$ticketcomment->user->id}}">{{ $ticketcomment->user->name }}</a>
+                                                @if($ticketcomment->user->role === "member")
+                                                    <span class="badge badge-secondary"> Member </span>
+                                                @elseif ($ticketcomment->user->role === "client")
+                                                    <span class="badge badge-success"> Client </span>
+                                                @elseif ($ticketcomment->user->role === "moderator")
+                                                    <span class="badge badge-info"> Moderator </span>
+                                                @elseif ($ticketcomment->user->role === "admin")
+                                                    <span class="badge badge-danger"> Admin </span>
+                                                @endif
+                                            </h5>
+                                            <span
+                                                class="badge badge-primary">{{ $ticketcomment->created_at->diffForHumans() }}</span>
+                                        </div>
                                     </div>
+                                    <div class="card-body"
+                                         style="white-space:pre-wrap">{{ $ticketcomment->ticketcomment }}</div>
                                 </div>
-                                <div class="card-body" style="white-space:pre-wrap">{{ $ticketcomment->ticketcomment }}</div>
-                            </div>
                             @endforeach
                             <div class="comment-form">
                                 <form action="{{ route('ticket.reply')}}" method="POST" class="form reply-form">
                                     {!! csrf_field() !!}
                                     <input type="hidden" name="ticket_id" value="{{ $ticket->id }}">
                                     <div class="form-group{{ $errors->has('ticketcomment') ? ' has-error' : '' }}">
-                                        <textarea rows="10" id="ticketcomment" class="form-control" name="ticketcomment"></textarea>
+                                        <textarea rows="10" id="ticketcomment" class="form-control"
+                                                  name="ticketcomment"></textarea>
                                         @if ($errors->has('ticketcomment'))
-                                        <span class="help-block">
+                                            <span class="help-block">
                                             <strong>{{ $errors->first('ticketcomment') }}</strong>
                                         </span>
                                         @endif