Added ticketing feature
This commit is contained in:
76
resources/views/admin/tickets/index.blade.php
Normal file
76
resources/views/admin/tickets/index.blade.php
Normal file
@@ -0,0 +1,76 @@
|
||||
@extends('admin.layouts.app')
|
||||
@section('content')
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<!-- Reuses your existing search component -->
|
||||
@include('admin.partial.list-filter', ['filterRoute' => 'tickets.index'])
|
||||
|
||||
<div id="datatable_wrapper" class="dataTables_wrapper dt-bootstrap4 no-footer">
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<table id="datatable" class="table table-bordered dt-responsive nowrap dataTable no-footer dtr-inline" style="border-collapse: collapse; border-spacing: 0px; width: 100%;" role="grid">
|
||||
<thead>
|
||||
<tr role="row">
|
||||
<th>شناسه</th>
|
||||
<th>کاربر (موبایل)</th>
|
||||
<th>موضوع</th>
|
||||
<th>وضعیت</th>
|
||||
<th>اولویت</th>
|
||||
<th>تاریخ بروزرسانی</th>
|
||||
<th>عملیات</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach ($tickets as $ticket)
|
||||
<tr>
|
||||
<td>#{{ $ticket->id }}</td>
|
||||
<td>{{ optional($ticket->user)->mobile ?? 'کاربر ناشناس' }}</td>
|
||||
<td>{{ Str::limit($ticket->subject, 50) }}</td>
|
||||
<td>
|
||||
@if($ticket->status === 'open')
|
||||
<span class="badge bg-primary">باز (جدید)</span>
|
||||
@elseif($ticket->status === 'user_reply')
|
||||
<span class="badge bg-warning text-dark">پاسخ کاربر</span>
|
||||
@elseif($ticket->status === 'answered')
|
||||
<span class="badge bg-success">پاسخ داده شده</span>
|
||||
@else
|
||||
<span class="badge bg-secondary">بسته شده</span>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
@if($ticket->priority === 'high')
|
||||
<span class="badge bg-danger">مهم</span>
|
||||
@elseif($ticket->priority === 'medium')
|
||||
<span class="badge bg-info">متوسط</span>
|
||||
@else
|
||||
<span class="badge bg-light text-dark">کم</span>
|
||||
@endif
|
||||
</td>
|
||||
<td dir="ltr">{{ $ticket->updated_at->format('Y/m/d H:i') }}</td>
|
||||
<td>
|
||||
<a href="{{ route('tickets.show', $ticket->id) }}" class="btn btn-primary waves-effect waves-light btn-sm">مشاهده و پاسخ</a>
|
||||
|
||||
@if($ticket->status !== 'closed')
|
||||
<form action="{{ route('tickets.close', $ticket->id) }}" method="POST" style="display: inline;">
|
||||
@csrf
|
||||
<button type="submit" class="btn btn-secondary waves-effect waves-light btn-sm" onclick="return confirm('آیا از بستن این تیکت اطمینان دارید؟')">بستن</button>
|
||||
</form>
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex justify-content-center mt-3">
|
||||
{{ $tickets->withQueryString()->links() }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
69
resources/views/admin/tickets/show.blade.php
Normal file
69
resources/views/admin/tickets/show.blade.php
Normal file
@@ -0,0 +1,69 @@
|
||||
@extends('admin.layouts.app')
|
||||
@section('content')
|
||||
<div class="row">
|
||||
@include('admin.layouts.errors')
|
||||
<div class="col-lg-8 offset-lg-2">
|
||||
<!-- Ticket Info Header -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-body bg-light">
|
||||
<h4 class="card-title">موضوع: {{ $ticket->subject }}</h4>
|
||||
<p class="mb-0 text-muted">تیکت #{{ $ticket->id }} | ایجاد کننده: {{ optional($ticket->user)->mobile }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Chat History -->
|
||||
@foreach($ticket->messages as $msg)
|
||||
<div class="card mb-3 shadow-sm {{ $msg->user_id === $ticket->user_id ? 'border-primary' : 'border-success' }}">
|
||||
<div class="card-header {{ $msg->user_id === $ticket->user_id ? 'bg-primary text-white' : 'bg-success text-white' }}">
|
||||
<strong>{{ $msg->user_id === $ticket->user_id ? 'کاربر' : 'پشتیبانی (شما)' }}</strong>
|
||||
<span class="float-end" dir="ltr" style="font-size: 0.85rem;">{{ $msg->created_at->format('Y/m/d H:i') }}</span>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p style="white-space: pre-wrap;">{{ $msg->message }}</p>
|
||||
|
||||
@if($msg->attachment_path)
|
||||
<hr>
|
||||
<a href="{{ asset('storage/' . $msg->attachment_path) }}" target="_blank" class="btn btn-sm btn-info waves-effect waves-light">
|
||||
<i class="fas fa-paperclip"></i> مشاهده فایل ضمیمه
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
|
||||
<!-- Reply Form -->
|
||||
<div class="card mt-4">
|
||||
<div class="card-body">
|
||||
@if($ticket->status !== 'closed')
|
||||
<h4 class="card-title mb-3">ارسال پاسخ</h4>
|
||||
<!-- Notice the enctype="multipart/form-data" which is required for attachments -->
|
||||
<form action="{{ route('tickets.reply', $ticket->id) }}" method="post" enctype="multipart/form-data">
|
||||
@csrf
|
||||
<div class="mb-4">
|
||||
<label for="message">متن پاسخ</label>
|
||||
<textarea class="form-control" name="message" id="message" rows="5" placeholder="پاسخ خود را بنویسید..." required></textarea>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<label for="attachment">فایل ضمیمه (اختیاری)</label>
|
||||
<input class="form-control" name="attachment" id="attachment" type="file" accept=".jpg,.jpeg,.png,.pdf">
|
||||
<small class="text-muted">فرمتهای مجاز: jpg, png, pdf (حداکثر 5 مگابایت)</small>
|
||||
</div>
|
||||
|
||||
<div class="d-flex justify-content-between">
|
||||
<button type="submit" class="btn btn-success waves-effect waves-light">ارسال پاسخ</button>
|
||||
<a href="{{ route('tickets.index') }}" class="btn btn-outline-secondary">بازگشت به لیست</a>
|
||||
</div>
|
||||
</form>
|
||||
@else
|
||||
<div class="alert alert-secondary text-center mb-0">
|
||||
این تیکت بسته شده است و امکان ارسال پاسخ جدید وجود ندارد.
|
||||
<br>
|
||||
<a href="{{ route('tickets.index') }}" class="btn btn-secondary btn-sm mt-2">بازگشت به لیست</a>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Reference in New Issue
Block a user