reply.blade.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. @extends('admin.layouts')
  2. @section('content')
  3. <div class="page-content">
  4. <div class="panel panel-bordered">
  5. <div class="panel-heading">
  6. <h1 class="panel-title cyan-600">
  7. <i class="icon wb-help-circle"></i> {{ $ticket->title }}
  8. </h1>
  9. <div class="panel-actions btn-group">
  10. <button class="btn icon-1x btn-info btn-icon wb-user-circle" data-target="#userInfo" data-toggle="modal" type="button">
  11. {{ trans('admin.ticket.user_info') }}</button>
  12. <a class="btn btn-default" href="{{ route('admin.ticket.index') }}">{{ trans('common.back') }}</a>
  13. @if ($ticket->status !== 2)
  14. @can('admin.ticket.destroy')
  15. <button class="btn btn-danger" onclick="closeTicket()"> {{ trans('common.close') }} </button>
  16. @endcan
  17. @endif
  18. </div>
  19. </div>
  20. <div class="panel-body">
  21. <div class="chat-box">
  22. <div class="chats">
  23. @php
  24. $currentUser = Auth::user();
  25. @endphp
  26. <x-chat-unit :user="$currentUser" :ticket="$ticket" />
  27. @foreach ($replyList as $reply)
  28. <x-chat-unit :user="$currentUser" :ticket="$reply" />
  29. @endforeach
  30. </div>
  31. </div>
  32. </div>
  33. @can('admin.ticket.update')
  34. <div class="panel-footer pb-30">
  35. <form>
  36. <div class="input-group">
  37. <input class="form-control" id="editor" type="text" placeholder="{{ trans('user.ticket.reply_placeholder') }}" />
  38. <span class="input-group-btn">
  39. <button class="btn btn-primary" type="button" onclick="replyTicket()"> {{ trans('common.send') }}</button>
  40. </span>
  41. </div>
  42. </form>
  43. </div>
  44. @endcan
  45. </div>
  46. </div>
  47. <div class="modal fade" id="userInfo" role="dialog" aria-hidden="true" aria-labelledby="userInfo" tabindex="-1">
  48. <div class="modal-dialog modal-simple modal-sidebar">
  49. <div class="modal-content">
  50. <div class="modal-header">
  51. <button class="close" data-dismiss="modal" type="button" aria-label="{{ trans('common.close') }}">
  52. <span aria-hidden="true">×</span>
  53. </button>
  54. <h4 class="modal-title">
  55. <i class="wb-user" aria-hidden="true"></i> {{ trans('admin.ticket.user_info') }}
  56. </h4>
  57. </div>
  58. <div class="modal-body">
  59. <ul class="list-group list-group-dividered px-20 mb-0">
  60. <h5>{{ trans('admin.node.info.basic') }}</h5>
  61. <dl class="dl-horizontal row">
  62. <dt class="col-sm-3">{{ trans('model.user.nickname') }}</dt>
  63. <dd class="col-sm-9">{{ $user->nickname }}</dd>
  64. <dt class="col-sm-3">{{ trans('model.user.username') }}</dt>
  65. <dd class="col-sm-9">{{ $user->username }}</dd>
  66. <dt class="col-sm-3">{{ trans('model.user.account_status') }}</dt>
  67. <dd class="col-sm-9">
  68. @if ($user->status > 0)
  69. <span class="badge badge-lg badge-primary">
  70. <i class="wb-check" aria-hidden="true"></i>
  71. </span>
  72. @elseif ($user->status < 0)
  73. <span class="badge badge-lg badge-danger">
  74. <i class="wb-close" aria-hidden="true"></i>
  75. </span>
  76. @else
  77. <span class="badge badge-lg badge-default">
  78. <i class="wb-minus" aria-hidden="true"></i>
  79. </span>
  80. @endif
  81. </dd>
  82. <dt class="col-sm-3">{{ trans('model.common.level') }}</dt>
  83. <dd class="col-sm-9">{{ $user->level }}</dd>
  84. <dt class="col-sm-3">{{ trans('model.user.group') }}</dt>
  85. <dd class="col-sm-9">{{ $user->userGroup->name ?? trans('common.none') }}</dd>
  86. <dt class="col-sm-3">{{ trans('model.user.credit') }}</dt>
  87. <dd class="col-sm-9">{{ $user->credit }}</dd>
  88. <dt class="col-sm-3">{{ trans('model.user.traffic_used') }}</dt>
  89. <dd class="col-sm-9">{{ formatBytes($user->used_traffic) }}
  90. / {{ $user->transfer_enable_formatted }}</dd>
  91. <dt class="col-sm-3">{{ trans('model.user.reset_date') }}</dt>
  92. <dd class="col-sm-9">{{ $user->reset_date ?? trans('common.none') }}</dd>
  93. <dt class="col-sm-3">{{ trans('common.latest_at') }}</dt>
  94. <dd class="col-sm-9">
  95. {{ $user->t ? date('Y-m-d H:i', $user->t) : trans('common.status.unused') }}
  96. </dd>
  97. <dt class="col-sm-3">{{ trans('model.user.expired_date') }}</dt>
  98. <dd class="col-sm-9">
  99. @if ($user->expiration_status() !== 3)
  100. <span class="badge badge-lg badge-{{ ['danger', 'warning', 'default'][$user->expiration_status()] }}">
  101. {{ $user->expiration_date }} </span>
  102. @else
  103. {{ $user->expiration_date }}
  104. @endif
  105. </dd>
  106. <dt class="col-sm-3">{{ trans('model.user.remark') }}</dt>
  107. <dt class="col-sm-3">{!! $user->remark !!}</dt>
  108. </dl>
  109. <h5>{{ trans('admin.user.info.proxy') }}</h5>
  110. <dl class="dl-horizontal row">
  111. <dt class="col-sm-3">{{ trans('common.status.attribute') }}</dt>
  112. <dd class="col-sm-9">
  113. <span class="badge badge-lg badge-{{ $user->enable ? 'info' : 'danger' }}">
  114. <i class="wb-{{ $user->enable ? 'check' : 'close' }}" aria-hidden="true"></i>
  115. </span>
  116. </dd>
  117. <dt class="col-sm-3">{{ trans('model.user.port') }}</dt>
  118. <dd class="col-sm-9">{!! $user->port ?: '<span class="badge badge-lg badge-danger"> ' . trans('common.none') . ' </span>' !!}</dd>
  119. </dl>
  120. <h5>{{ trans('common.more') }}</h5>
  121. <dl class="dl-horizontal row">
  122. <dt class="col-sm-3">{{ trans('admin.ticket.inviter_info') }}</dt>
  123. <dd class="col-sm-9">
  124. {{ $user->inviter->nickname ?? trans('common.none') }}
  125. </dd>
  126. @isset($user->inviter)
  127. <dt class="col-sm-3 offset-md-1">{{ trans('model.user.username') }}</dt>
  128. <dd class="col-sm-8">{{ $user->inviter->username }}</dd>
  129. <dt class="col-sm-3 offset-md-1">{{ trans('model.common.level') }}</dt>
  130. <dd class="col-sm-8">{{ $user->inviter->level }}</dd>
  131. <dt class="col-sm-3 offset-md-1">{{ trans('common.latest_at') }}</dt>
  132. <dd class="col-sm-8">
  133. {{ $user->inviter->t ? date('Y-m-d H:i', $user->inviter->t) : trans('common.status.unused') }}
  134. </dd>
  135. @endif
  136. </dl>
  137. </ul>
  138. </div>
  139. <div class="modal-footer">
  140. <button class="btn btn-default" data-dismiss="modal" type="button">{{ trans('common.close') }}</button>
  141. </div>
  142. </div>
  143. </div>
  144. </div>
  145. @endsection
  146. @section('javascript')
  147. <script>
  148. @can('admin.ticket.destroy')
  149. // 关闭工单
  150. function closeTicket() {
  151. swal.fire({
  152. title: '{{ trans('admin.ticket.close_confirm') }}',
  153. icon: 'question',
  154. showCancelButton: true,
  155. cancelButtonText: '{{ trans('common.close') }}',
  156. confirmButtonText: '{{ trans('common.confirm') }}',
  157. }).then((result) => {
  158. if (result.value) {
  159. $.ajax({
  160. method: 'DELETE',
  161. url: '{{ route('admin.ticket.destroy', $ticket->id) }}',
  162. async: true,
  163. data: {
  164. _token: '{{ csrf_token() }}'
  165. },
  166. dataType: 'json',
  167. success: function(ret) {
  168. if (ret.status === 'success') {
  169. swal.fire({
  170. title: ret.message,
  171. icon: 'success',
  172. timer: 1000,
  173. showConfirmButton: false,
  174. }).then(() => window.location.href = '{{ route('admin.ticket.index') }}');
  175. } else {
  176. swal.fire({
  177. title: ret.message,
  178. icon: 'error'
  179. }).then(() => window.location.reload());
  180. }
  181. },
  182. error: function() {
  183. swal.fire({
  184. title: '{{ trans('user.ticket.error') }}',
  185. icon: 'error'
  186. });
  187. },
  188. });
  189. }
  190. });
  191. }
  192. @endcan
  193. @can('admin.ticket.update')
  194. //回车检测
  195. $(document).on('keypress', 'input', function(e) {
  196. if (e.which === 13) {
  197. replyTicket();
  198. return false;
  199. }
  200. });
  201. // 回复工单
  202. function replyTicket() {
  203. const content = document.getElementById('editor').value;
  204. if (content.trim() === '') {
  205. swal.fire({
  206. title: '{{ trans('validation.required', ['attribute' => trans('validation.attributes.content')]) }}!',
  207. icon: 'warning',
  208. timer: 1500,
  209. });
  210. return false;
  211. }
  212. swal.fire({
  213. title: '{{ trans('user.ticket.reply_confirm') }}',
  214. icon: 'question',
  215. allowEnterKey: false,
  216. showCancelButton: true,
  217. cancelButtonText: '{{ trans('common.close') }}',
  218. confirmButtonText: '{{ trans('common.confirm') }}',
  219. }).then((result) => {
  220. if (result.value) {
  221. $.ajax({
  222. method: 'PUT',
  223. url: '{{ route('admin.ticket.update', $ticket) }}',
  224. data: {
  225. _token: '{{ csrf_token() }}',
  226. content: content
  227. },
  228. dataType: 'json',
  229. success: function(ret) {
  230. if (ret.status === 'success') {
  231. swal.fire({
  232. title: ret.message,
  233. icon: 'success',
  234. timer: 1000,
  235. showConfirmButton: false,
  236. }).then(() => window.location.reload());
  237. } else {
  238. swal.fire({
  239. title: ret.message,
  240. icon: 'error'
  241. }).then(() => window.location.reload());
  242. }
  243. },
  244. error: function() {
  245. swal.fire({
  246. title: '{{ trans('admin.ticket.error') }}',
  247. icon: 'error'
  248. });
  249. },
  250. });
  251. }
  252. });
  253. }
  254. @endcan
  255. </script>
  256. @endsection