reply.blade.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  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"> 用户信息</button>
  11. <a href="{{route('admin.ticket.index')}}" class="btn btn-default">返 回</a>
  12. @if($ticket->status !== 2)
  13. @can('admin.ticket.destroy')
  14. <button class="btn btn-danger" onclick="closeTicket()"> {{trans('common.close')}} </button>
  15. @endcan
  16. @endif
  17. </div>
  18. </div>
  19. <div class="panel-body">
  20. <div class="chat-box">
  21. <div class="chats">
  22. <x-chat-unit :user="Auth::getUser()" :ticket="$ticket"/>
  23. @foreach ($replyList as $reply)
  24. <x-chat-unit :user="Auth::getUser()" :ticket="$reply"/>
  25. @endforeach
  26. </div>
  27. </div>
  28. </div>
  29. @can('admin.ticket.update')
  30. <div class="panel-footer pb-30">
  31. <form>
  32. <div class="input-group">
  33. <input type="text" class="form-control" id="editor" placeholder="{{trans('user.ticket.reply_placeholder')}}"/>
  34. <span class="input-group-btn">
  35. <button type="button" class="btn btn-primary" onclick="replyTicket()"> {{trans('common.send')}}</button>
  36. </span>
  37. </div>
  38. </form>
  39. </div>
  40. @endcan
  41. </div>
  42. </div>
  43. <div class="modal fade" id="userInfo" aria-hidden="true" aria-labelledby="userInfo"
  44. role="dialog" tabindex="-1">
  45. <div class="modal-dialog modal-simple modal-sidebar">
  46. <div class="modal-content">
  47. <div class="modal-header">
  48. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  49. <span aria-hidden="true">×</span>
  50. </button>
  51. <h4 class="modal-title">
  52. <i class="wb-user" aria-hidden="true"></i> 用户信息</h4>
  53. </div>
  54. <div class="modal-body">
  55. <ul class="list-group list-group-dividered px-20 mb-0">
  56. <h5>基础信息</h5>
  57. <dl class="dl-horizontal row">
  58. <dt class="col-sm-3">昵称</dt>
  59. <dd class="col-sm-9">{{$user->nickname}}</dd>
  60. <dt class="col-sm-3">账号</dt>
  61. <dd class="col-sm-9">{{$user->username}}</dd>
  62. <dt class="col-sm-3">账号状态</dt>
  63. <dd class="col-sm-9">
  64. @if ($user->status > 0)
  65. <span class="badge badge-lg badge-primary">
  66. <i class="wb-check" aria-hidden="true"></i>
  67. </span>
  68. @elseif ($user->status < 0)
  69. <span class="badge badge-lg badge-danger">
  70. <i class="wb-close" aria-hidden="true"></i>
  71. </span>
  72. @else
  73. <span class="badge badge-lg badge-default">
  74. <i class="wb-minus" aria-hidden="true"></i>
  75. </span>
  76. @endif
  77. </dd>
  78. <dt class="col-sm-3">等级</dt>
  79. <dd class="col-sm-9">{{$user->level}}</dd>
  80. <dt class="col-sm-3">分组</dt>
  81. <dd class="col-sm-9">{{$user->userGroup->name ?? '无分组'}}</dd>
  82. <dt class="col-sm-3">余额</dt>
  83. <dd class="col-sm-9">{{$user->credit}}</dd>
  84. <dt class="col-sm-3">流量</dt>
  85. <dd class="col-sm-9">{{flowAutoShow($user->used_traffic)}} / {{$user->transfer_enable_formatted}}</dd>
  86. <dt class="col-sm-3">重置日期</dt>
  87. <dd class="col-sm-9">{{$user->reset_time ?? '无'}}</dd>
  88. <dt class="col-sm-3">最近使用</dt>
  89. <dd class="col-sm-9">
  90. {{$user->t? date('Y-m-d H:i', $user->t): '未使用'}}
  91. </dd>
  92. <dt class="col-sm-3">过期日期</dt>
  93. <dd class="col-sm-9">
  94. @if ($user->expired_at < date('Y-m-d'))
  95. <span class="badge badge-lg badge-danger"> {{$user->expired_at}} </span>
  96. @elseif ($user->expired_at === date('Y-m-d'))
  97. <span class="badge badge-lg badge-warning"> {{$user->expired_at}} </span>
  98. @elseif ($user->expired_at <= date('Y-m-d', strtotime('30 days')))
  99. <span class="badge badge-lg badge-default"> {{$user->expired_at}} </span>
  100. @else
  101. {{$user->expired_at}}
  102. @endif
  103. </dd>
  104. <dt class="col-sm-3">备注</dt>
  105. <dt class="col-sm-3">{!! $user->remark !!}</dt>
  106. </dl>
  107. <h5>代理信息</h5>
  108. <dl class="dl-horizontal row">
  109. <dt class="col-sm-3">开启状态</dt>
  110. <dd class="col-sm-9">
  111. <span class="badge badge-lg badge-{{$user->enable?'info':'danger'}}">
  112. <i class="wb-{{$user->enable?'check':'close'}}" aria-hidden="true"></i>
  113. </span>
  114. </dd>
  115. <dt class="col-sm-3">端口</dt>
  116. <dd class="col-sm-9">{!!$user->port? : '<span class="badge badge-lg badge-danger"> 未分配 </span>'!!}</dd>
  117. </dl>
  118. <h5>其他</h5>
  119. <dl class="dl-horizontal row">
  120. <dt class="col-sm-3">邀请人信息</dt>
  121. <dd class="col-sm-9">
  122. {{$user->inviter->nickname ?? '无'}}
  123. </dd>
  124. @isset ($user->inviter)
  125. <dt class="col-sm-3 offset-md-1">账号</dt>
  126. <dd class="col-sm-8">{{$user->inviter->username}}</dd>
  127. <dt class="col-sm-3 offset-md-1">等级</dt>
  128. <dd class="col-sm-8">{{$user->inviter->level}}</dd>
  129. <dt class="col-sm-3 offset-md-1">最近使用</dt>
  130. <dd class="col-sm-8">
  131. {{$user->inviter->t? date('Y-m-d H:i', $user->inviter->t): '未使用'}}
  132. </dd>
  133. @endif
  134. </dl>
  135. </ul>
  136. </div>
  137. <div class="modal-footer">
  138. <button type="button" class="btn btn-default" data-dismiss="modal">@lang('common.close')</button>
  139. </div>
  140. </div>
  141. </div>
  142. </div>
  143. @endsection
  144. @section('javascript')
  145. <script>
  146. @can('admin.ticket.destroy')
  147. // 关闭工单
  148. function closeTicket() {
  149. swal.fire({
  150. title: '确定关闭工单?',
  151. icon: 'question',
  152. showCancelButton: true,
  153. cancelButtonText: '{{trans('common.close')}}',
  154. confirmButtonText: '{{trans('common.confirm')}}',
  155. }).then((result) => {
  156. if (result.value) {
  157. $.ajax({
  158. method: 'DELETE',
  159. url: '{{route('admin.ticket.destroy', $ticket->id)}}',
  160. async: true,
  161. data: {_token: '{{csrf_token()}}'},
  162. dataType: 'json',
  163. success: function(ret) {
  164. if (ret.status === 'success') {
  165. swal.fire({
  166. title: ret.message,
  167. icon: 'success',
  168. timer: 1000,
  169. showConfirmButton: false,
  170. }).then(() => window.location.href = '{{route('admin.ticket.index')}}');
  171. } else {
  172. swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
  173. }
  174. },
  175. error: function() {
  176. swal.fire({title: '{{trans('user.ticket.error')}}', icon: 'error'});
  177. },
  178. });
  179. }
  180. });
  181. }
  182. @endcan
  183. @can('admin.ticket.update')
  184. //回车检测
  185. $(document).on('keypress', 'input', function(e) {
  186. if (e.which === 13) {
  187. replyTicket();
  188. return false;
  189. }
  190. });
  191. // 回复工单
  192. function replyTicket() {
  193. const content = document.getElementById('editor').value;
  194. if (content.trim() === '') {
  195. swal.fire({title: '{{trans('validation.required', ['attribute' => trans('validation.attributes.content')])}}!', icon: 'warning', timer: 1500});
  196. return false;
  197. }
  198. swal.fire({
  199. title: '{{trans('user.ticket.reply_confirm')}}',
  200. icon: 'question',
  201. allowEnterKey: false,
  202. showCancelButton: true,
  203. cancelButtonText: '{{trans('common.close')}}',
  204. confirmButtonText: '{{trans('common.confirm')}}',
  205. }).then((result) => {
  206. if (result.value) {
  207. $.ajax({
  208. method: 'PUT',
  209. url: '{{route('admin.ticket.update', $ticket)}}',
  210. data: {_token: '{{csrf_token()}}', content: content},
  211. dataType: 'json',
  212. success: function(ret) {
  213. if (ret.status === 'success') {
  214. swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
  215. } else {
  216. swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
  217. }
  218. },
  219. error: function() {
  220. swal.fire({title: '未知错误!请查看运行日志', icon: 'error'});
  221. },
  222. });
  223. }
  224. });
  225. }
  226. @endcan
  227. </script>
  228. @endsection