home.blade.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. @extends('admin.partial.template-full')
  2. @section('section')
  3. <div class="title">
  4. <h3 class="font-weight-bold d-inline-block">Media</h3>
  5. <span class="float-right">
  6. <a class="btn btn-{{request()->input('layout')!=='banned'?'primary':'light'}} btn-sm font-weight-bold" href="{{route('admin.media')}}">
  7. All
  8. </a>
  9. <a class="btn btn-{{request()->input('layout')=='banned'?'primary':'light'}} btn-sm mr-3 font-weight-bold" href="{{route('admin.media',['layout'=>'banned', 'page' => request()->input('page') ?? 1])}}">
  10. Banned
  11. </a>
  12. <div class="dropdown d-inline-block">
  13. <button class="btn btn-light btn-sm dropdown-toggle font-weight-bold" type="button" id="filterDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  14. <i class="fas fa-filter"></i>
  15. </button>
  16. <div class="dropdown-menu dropdown-menu-right" aria-labelledby="filterDropdown" style="width: 300px;">
  17. <div class="dropdown-item">
  18. <form action="/i/admin/media/?page=1">
  19. <input type="hidden" name="layout" value=""></input>
  20. <input type="hidden" name="page" value="{{request()->input('page')}}"></input>
  21. <div class="input-group input-group-sm">
  22. <input class="form-control" name="search" placeholder="Filter by username, mime type" autocomplete="off"></input>
  23. <div class="input-group-append">
  24. <button class="btn btn-outline-primary" type="submit">Filter</button>
  25. </div>
  26. </div>
  27. </form>
  28. </div>
  29. {{-- <div class="dropdown-divider"></div>
  30. <p class="text-wrap p-1 p-md-3 text-center">
  31. <a class="badge badge-primary p-2 mb-2 btn-filter" href="#" data-filter="cw" data-filter-state="true" data-toggle="tooltip" title="Show Content Warning media">CW</a>
  32. <a class="badge badge-primary p-2 mb-2 btn-filter" href="#" data-filter="remote" data-filter-state="true" data-toggle="tooltip" title="Show remote media">Remote Media</a>
  33. <a class="badge badge-primary p-2 mb-2 btn-filter" href="#" data-filter="images" data-filter-state="true" data-toggle="tooltip" title="Show image media">Images</a>
  34. <a class="badge badge-primary p-2 mb-2 btn-filter" href="#" data-filter="videos" data-filter-state="true" data-toggle="tooltip" title="Show video media">Videos</a>
  35. <a class="badge badge-light p-2 mb-2 btn-filter" href="#" data-filter="stories" data-filter-state="false" data-toggle="tooltip" title="Show stories media">Stories</a>
  36. <a class="badge badge-light p-2 mb-2 btn-filter" href="#" data-filter="banned" data-filter-state="false" data-toggle="tooltip" title="Show banned media">Banned</a>
  37. <a class="badge badge-light p-2 mb-2 btn-filter" href="#" data-filter="reported" data-filter-state="false" data-toggle="tooltip" title="Show reported media">Reported</a>
  38. <a class="badge badge-light p-2 mb-2 btn-filter" href="#" data-filter="unlisted" data-filter-state="false" data-toggle="tooltip" title="Show unlisted media">Unlisted</a>
  39. </p> --}}
  40. {{-- <div class="dropdown-divider"></div>
  41. <a class="dropdown-item font-weight-light" href="?filter=local&layout={{request()->input('layout')}}">Local Media Only</a>
  42. <a class="dropdown-item font-weight-light" href="?filter=remote&layout={{request()->input('layout')}}">Remote Media Only</a>
  43. <div class="dropdown-divider"></div>
  44. <a class="dropdown-item font-weight-light" href="?layout={{request()->input('layout')}}">Show all</a> --}}
  45. </div>
  46. </div>
  47. </span>
  48. </div>
  49. <hr>
  50. @if(request()->filled('search'))
  51. <p class="h4 pb-3">Showing results for: <i>{{request()->input('search')}}</i></p>
  52. @endif
  53. @if(request()->input('layout') == 'banned')
  54. <p class="text-right">
  55. <a class="btn btn-primary py-0 px-5" href="/i/admin/media/?layout=addbanned">Add Banned Media</a>
  56. </p>
  57. <ul class="list-group">
  58. @foreach($media as $b)
  59. <li class="list-group-item">
  60. <div class="d-flex justify-content-between align-items-center">
  61. <div class="d-flex align-items-center">
  62. <span class="mr-4 text-monospace small">
  63. {{$b->id}}
  64. </span>
  65. <span class="d-inline-block">
  66. <p class="mb-0 small text-monospace">{{$b->sha256}}</p>
  67. <p class="mb-0 font-weight-bold">{{$b->name ?? 'Untitled'}}</p>
  68. <p class="mb-0 small">{{$b->description ?? 'No description'}}</p>
  69. </span>
  70. </div>
  71. <div class="small font-weight-bold">
  72. {{$b->created_at->diffForHumans()}}
  73. </div>
  74. <div class="">
  75. <form action="/i/admin/media/block/delete" method="post">
  76. @csrf
  77. <input type="hidden" name="id" value="{{$b->id}}">
  78. <button type="submit" class="btn btn-outline-danger">
  79. <i class="fas fa-trash-alt"></i>
  80. </button>
  81. </form>
  82. </div>
  83. </div>
  84. </li>
  85. @endforeach
  86. </ul>
  87. @elseif(request()->input('layout') == 'addbanned')
  88. <div class="row">
  89. <div class="col-12 col-md-6 offset-md-3">
  90. <div class="card shadow-none border">
  91. <div class="card-header font-weight-bold">Add Banned Media</div>
  92. <div class="card-body">
  93. <form method="post" action="/i/admin/media/block/add">
  94. @csrf
  95. <div class="form-group">
  96. <label for="input3" class="text-muted font-weight-bold">SHA256 Hash</label>
  97. <input type="text" class="form-control" id="input3" aria-describedby="input3Help" name="hash">
  98. <small id="input3Help" class="form-text text-muted">Required</small>
  99. </div>
  100. <hr>
  101. <div class="form-group">
  102. <label for="input1" class="text-muted font-weight-bold">Name</label>
  103. <input type="text" class="form-control" id="input1" aria-describedby="input1Help" name="name">
  104. <small id="input1Help" class="form-text text-muted">Optional</small>
  105. </div>
  106. <div class="form-group">
  107. <label for="input2" class="text-muted font-weight-bold">Description</label>
  108. <textarea class="form-control" id="input2" aria-describedby="input2Help" rows="3" name="description"></textarea>
  109. <small id="input2Help" class="form-text text-muted">Optional</small>
  110. </div>
  111. <hr>
  112. <button type="submit" class="btn btn-primary btn-block font-weight-bold">Ban</button>
  113. </form>
  114. </div>
  115. </div>
  116. </div>
  117. </div>
  118. @else
  119. <ul class="list-group">
  120. @foreach($media as $status)
  121. <li class="list-group-item">
  122. <div class="d-flex justify-content-between align-items-center">
  123. <div>
  124. <a class="font-weight-lighter small mr-3 text-monospace" href="/i/admin/media/show/{{$status->id}}">{{$status->id}}</a>
  125. <a href="{{$status->url()}}">
  126. <img class="" src="{{$status->thumb()}}" width="60px" height="60px">
  127. </a>
  128. </div>
  129. <div>
  130. <p class="mb-0 small">status id: <a href="/p/{{\App\Services\HashidService::encode($status->status_id)}}" class="font-weight-bold text-monospace">{{$status->status_id}}</a></p>
  131. <p class="mb-0 small">profile id: <a href="/i/admin/profiles/edit/{{$status->profile_id}}" class="font-weight-bold text-monospace">{{$status->profile_id}}</a></p>
  132. </div>
  133. <div>
  134. <p class="mb-0 small">size: <span class="filesize font-weight-bold" data-size="{{$status->size}}">0</span></p>
  135. <p class="mb-0 small">mime: <span class="font-weight-bold">{{$status->mime}}</span></p>
  136. </div>
  137. <div>
  138. <p class="mb-0 small">content warning: <i class="fas {{$status->is_nsfw ? 'fa-check text-danger':'fa-times text-dark'}}"></i></p>
  139. <p class="mb-0 small">
  140. remote media: <i class="fas {{$status->remote_media ? 'fa-check text-danger':'fa-times text-dark'}}"></i></p>
  141. </div>
  142. </div>
  143. </li>
  144. @endforeach
  145. </ul>
  146. <hr>
  147. <div class="d-flex justify-content-center">
  148. {{$media->appends(['layout'=>request()->layout])->links()}}
  149. </div>
  150. @endif
  151. @endsection
  152. @push('scripts')
  153. <script type="text/javascript">
  154. $(document).ready(function() {
  155. $('.filesize').each(function(k,v) {
  156. $(this).text(filesize(v.getAttribute('data-size')))
  157. });
  158. window.filters = {
  159. default() {
  160. return ['cw', 'remote', 'images', 'videos']
  161. },
  162. active() {
  163. return $('.btn-filter[data-filter-state="true"]');
  164. },
  165. whitelist() {
  166. return [
  167. 'cw',
  168. 'remote',
  169. 'images',
  170. 'videos',
  171. 'stories',
  172. 'banned',
  173. 'reported',
  174. 'unlisted',
  175. ];
  176. },
  177. allowed(filter) {
  178. return _.indexOf(filters.whitelist(), filter) != -1;
  179. },
  180. buildQueryFragment(){
  181. window.filters.active().each(function(k,v) {
  182. })
  183. }
  184. }
  185. $('.badge.btn-filter').on('click', function(e) {
  186. e.preventDefault();
  187. let el = $(this);
  188. let filter = el.data('filter');
  189. let state = el.data('filter-state');
  190. if(state == false) {
  191. el.removeClass('badge-light')
  192. el.addClass('badge-primary')
  193. el.attr('data-filter-state', 'false')
  194. } else {
  195. el.removeClass('badge-primary')
  196. el.addClass('badge-light')
  197. el.attr('data-filter-state', 'true')
  198. }
  199. });
  200. });
  201. </script>
  202. @endpush