From b634056dd1d2246474ab58f25b7c6b842bc476d1 Mon Sep 17 00:00:00 2001 From: A1Gard Date: Tue, 25 Jun 2024 03:31:06 +0330 Subject: [PATCH] added ticket controller --- .../Controllers/Admin/TicketController.php | 142 ++++++++++++++++++ app/Http/Requests/TicketSaveRequest.php | 28 ++++ app/Models/Ticket.php | 21 +++ ...2024_06_24_234732_create_tickets_table.php | 35 +++++ resources/sass/panel/_common.scss | 8 +- .../templates/panel-list-template.blade.php | 5 + .../views/admin/tickets/ticket-form.blade.php | 70 +++++++++ .../views/admin/tickets/ticket-list.blade.php | 17 +++ .../components/panel-side-navbar.blade.php | 2 +- routes/web.php | 10 ++ 10 files changed, 335 insertions(+), 3 deletions(-) create mode 100644 app/Http/Controllers/Admin/TicketController.php create mode 100644 app/Http/Requests/TicketSaveRequest.php create mode 100644 app/Models/Ticket.php create mode 100644 database/migrations/2024_06_24_234732_create_tickets_table.php create mode 100644 resources/views/admin/tickets/ticket-form.blade.php create mode 100644 resources/views/admin/tickets/ticket-list.blade.php diff --git a/app/Http/Controllers/Admin/TicketController.php b/app/Http/Controllers/Admin/TicketController.php new file mode 100644 index 0000000..6d16ebd --- /dev/null +++ b/app/Http/Controllers/Admin/TicketController.php @@ -0,0 +1,142 @@ + + ['title' => "Edit", 'class' => 'btn-outline-primary', 'icon' => 'ri-edit-2-line'], +// 'show' => +// ['title' => "Detail", 'class' => 'btn-outline-light', 'icon' => 'ri-eye-line'], + 'destroy' => + ['title' => "Remove", 'class' => 'btn-outline-danger delete-confirm', 'icon' => 'ri-close-line'], + ]; + + + public function __construct() + { + parent::__construct(Ticket::class, TicketSaveRequest::class); + } + + /** + * @param $ticket Ticket + * @param $request TicketSaveRequest + * @return Ticket + */ + public function save($ticket, $request) + { + + $ticket->save(); + return $ticket; + + } + + public function index() + { + $query = $this->makeSortAndFilter(); + $query = $query->whereNull('parent_id'); + return $this->showList($query); + } + + + /** + * Show the form for creating a new resource. + */ + public function create() + { + // + return view($this->formView); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(Ticket $item) + { + // + return view($this->formView, compact('item')); + } + + public function bulk(Request $request) + { + +// dd($request->all()); + $data = explode('.', $request->input('action')); + $action = $data[0]; + $ids = $request->input('id'); + switch ($action) { + case 'delete': + $msg = __(':COUNT items deleted successfully', ['COUNT' => count($ids)]); + $this->_MODEL_::destroy($ids); + break; + case 'close': + $this->_MODEL_::whereIn('id', $request->input('id'))->update(['status' => 'CLOSED']); + $msg = __(':COUNT items closed successfully', ['COUNT' => count($ids)]); + break; + case 'pending': + $this->_MODEL_::whereIn('id', $request->input('id'))->update(['status' => 'PENDING']); + $msg = __(':COUNT items pending successfully', ['COUNT' => count($ids)]); + break; + case 'answered': + $this->_MODEL_::whereIn('id', $request->input('id'))->update(['status' => 'ANSWERED']); + $msg = __(':COUNT items answered successfully', ['COUNT' => count($ids)]); + break; + default: + $msg = __('Unknown bulk action : :ACTION', ["ACTION" => $action]); + } + + return $this->do_bulk($msg, $action, $ids); + } + + public function destroy(Ticket $item) + { + return parent::delete($item); + } + + + public function update(Request $request, Ticket $item) + { + $item->answer = $request->answer; + $item->status = $request->status; + $item->save(); + if ($request->has('answers')){ + foreach ($request->answers as $id => $answer) { + Ticket::whereId($id)->update(['answer' => $answer]); + } + } + logAdmin(__METHOD__,Ticket::class,$item->id); + if ($request->ajax()) { + return ['OK' => true, + "data" => modelWithCustomAttrs($item) , + "message" => __('As you wished updated successfully'), "id" => $item->id]; + } else { + return redirect(getRoute('edit', $item->{$item->getRouteKeyName()})) + ->with(['message' => __('As you wished updated successfully')]); + } + } + + +} diff --git a/app/Http/Requests/TicketSaveRequest.php b/app/Http/Requests/TicketSaveRequest.php new file mode 100644 index 0000000..4cc9bfb --- /dev/null +++ b/app/Http/Requests/TicketSaveRequest.php @@ -0,0 +1,28 @@ +|string> + */ + public function rules(): array + { + return [ + // + ]; + } +} diff --git a/app/Models/Ticket.php b/app/Models/Ticket.php new file mode 100644 index 0000000..fa259a0 --- /dev/null +++ b/app/Models/Ticket.php @@ -0,0 +1,21 @@ +belongsTo(Customer::class); + } + + public function subTickets(){ + return $this->hasMany(Ticket::class,'parent_id','id')->orderBy('id'); + } +} diff --git a/database/migrations/2024_06_24_234732_create_tickets_table.php b/database/migrations/2024_06_24_234732_create_tickets_table.php new file mode 100644 index 0000000..6932e78 --- /dev/null +++ b/database/migrations/2024_06_24_234732_create_tickets_table.php @@ -0,0 +1,35 @@ +id(); + $table->string('title',128)->nullable()->default(null); + $table->unsignedBigInteger('customer_id'); + $table->text('body'); + $table->enum('status',['PENDING','ANSWERED','CLOSED'])->default('PENDING'); + $table->text('answer')->nullable()->default(null); + $table->unsignedInteger('parent_id')->nullable()->default(null)->index(); + $table->timestamps(); + $table->foreign('customer_id')->on('customers') + ->references('id')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('tickets'); + } +}; diff --git a/resources/sass/panel/_common.scss b/resources/sass/panel/_common.scss index c1292b1..79963f2 100644 --- a/resources/sass/panel/_common.scss +++ b/resources/sass/panel/_common.scss @@ -97,12 +97,16 @@ a.btn,a.action-btn,a.circle-btn{ margin: auto; border-radius: 3px; } -.status-0{ +.status-0,.status-CLOSED { background: red; } -.status-1{ +.status-ANSWERED{ background: lime; } +.status-PENDING{ + background: gold; +} + .image-x64{ height: 64px; diff --git a/resources/views/admin/templates/panel-list-template.blade.php b/resources/views/admin/templates/panel-list-template.blade.php index 1a0c939..165312d 100644 --- a/resources/views/admin/templates/panel-list-template.blade.php +++ b/resources/views/admin/templates/panel-list-template.blade.php @@ -185,6 +185,11 @@ {{ $item->user?->name??'-' }} @break + @case($col == 'customer_id') + + {{ $item->customer?->name??'-' }} + + @break @case($col == 'category_id') {{ $item->category?->name??'-' }} diff --git a/resources/views/admin/tickets/ticket-form.blade.php b/resources/views/admin/tickets/ticket-form.blade.php new file mode 100644 index 0000000..fbf7e86 --- /dev/null +++ b/resources/views/admin/tickets/ticket-form.blade.php @@ -0,0 +1,70 @@ +@extends('admin.templates.panel-form-template') +@section('title') + @if(isset($item)) + {{__("Edit ticket")}} [{{$item->title}}] + @else + {{__("Add new ticket")}} + @endif - +@endsection +@section('form') + +
+
+ + @include('components.err') +
+

+ + {{__("Tips")}} +

+
    +
  • + {{__("Recommends")}} +
  • +
+
+ +
+
+
+ +

+ @if(isset($item)) + {{__("Edit ticket")}} [{{$item->title}}] + @else + {{__("Add new ticket")}} + @endif +

+ +
+
{{$item->body}}
+ +
+ @foreach($item->subTickets as $t) +
+
{{$t->body}}
+ + +
+ @endforeach +
+
+ +
+
+ +
+
+ +
+
+
+@endsection diff --git a/resources/views/admin/tickets/ticket-list.blade.php b/resources/views/admin/tickets/ticket-list.blade.php new file mode 100644 index 0000000..678aef5 --- /dev/null +++ b/resources/views/admin/tickets/ticket-list.blade.php @@ -0,0 +1,17 @@ +@extends('admin.templates.panel-list-template') + +@section('list-title') + + {{__("Tickets list")}} +@endsection +@section('title') + {{__("Tickets list")}} - +@endsection +@section('filter') + {{-- Other filters --}} +@endsection +@section('bulk') + + + +@endsection diff --git a/resources/views/components/panel-side-navbar.blade.php b/resources/views/components/panel-side-navbar.blade.php index 901c5f4..0e38446 100644 --- a/resources/views/components/panel-side-navbar.blade.php +++ b/resources/views/components/panel-side-navbar.blade.php @@ -156,7 +156,7 @@
  • - + {{__('Tickets')}} diff --git a/routes/web.php b/routes/web.php index d801ad7..7977632 100644 --- a/routes/web.php +++ b/routes/web.php @@ -64,6 +64,16 @@ Route::prefix(config('app.panel.prefix'))->name('admin.')->group( Route::post('bulk', [\App\Http\Controllers\Admin\DiscountController::class, "bulk"])->name('bulk'); Route::get('trashed', [\App\Http\Controllers\Admin\DiscountController::class, "trashed"])->name('trashed'); }); + Route::prefix('tickets')->name('ticket.')->group( + function () { + Route::get('', [\App\Http\Controllers\Admin\TicketController::class, 'index'])->name('index'); +// Route::get('create', [\App\Http\Controllers\Admin\TicketController::class, 'create'])->name('create'); + Route::post('store', [\App\Http\Controllers\Admin\TicketController::class, 'store'])->name('store'); + Route::get('edit/{item}', [\App\Http\Controllers\Admin\TicketController::class, 'edit'])->name('edit'); + Route::post('update/{item}', [\App\Http\Controllers\Admin\TicketController::class, 'update'])->name('update'); + Route::get('delete/{item}', [\App\Http\Controllers\Admin\TicketController::class, 'destroy'])->name('destroy'); + Route::post('bulk', [\App\Http\Controllers\Admin\TicketController::class, "bulk"])->name('bulk'); + }); Route::prefix('transports')->name('transport.')->group( function () {