index.blade.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. @extends('layouts.app')
  2. @section('content')
  3. <div class="container-fluid">
  4. <div class="row align-items-center">
  5. <div class="col-xl-5 col-md-12">
  6. <div class="mb-1">Всего найдено: {{ $products->total() }}</div>
  7. Выбрано: <span id="count_selected">0</span>
  8. <button class="btn btn-sm btn-primary mx-3 disabled" id="export-button" onclick="select_export()">Экспорт</button>
  9. <button class="btn btn-sm btn-primary" onclick="reset_selected()">Сбросить выбор</button>
  10. </div>
  11. <div class="col-xl-7 col-md-12">
  12. <form class="" action="" method="get">
  13. <div class="row my-2 justify-content-center">
  14. <div class="col-6 col-sm-6 col-md-auto">
  15. <label class="form-label" for="s">Поиск</label>
  16. <input class="form-control form-control-sm"
  17. value="{{ $s ?? '' }}"
  18. type="text" id="s" name="s" placeholder="Поиск">
  19. </div>
  20. <div class="col-6 col-sm-6 col-md-auto">
  21. <label class="form-label " for="series">Серия</label>
  22. <select class="form-select form-select-sm" name="s_series" id="series">
  23. <option value="">Все</option>
  24. @foreach($series as $ser)
  25. <option {{ (isset($s_series) && ($ser->series == $s_series)) ? 'selected' : '' }} >{{ $ser->series }}</option>
  26. @endforeach
  27. </select>
  28. </div>
  29. <div class="col-6 col-sm-6 col-md-auto mt-3 mt-md-0"">
  30. <label class="form-label " for="price_min">Цена от</label>
  31. <input class="form-control form-control-sm"
  32. value="{{ $s_price_min ?? '' }}"
  33. type="number" id="price_min" name="s_price_min">
  34. </div>
  35. <div class="col-6 col-sm-6 col-md-auto mt-3 mt-md-0">
  36. <label class="form-label" for="price_max">Цена до</label>
  37. <input class="form-control form-control-sm"
  38. value="{{ $s_price_max ?? '' }}"
  39. type="number" id="price_max" name="s_price_max">
  40. </div>
  41. <div class="col-6 col-sm-6 col-md-auto mt-3 mt-md-0"">
  42. <label class="form-label" for="perpage">На странице</label>
  43. <select class="form-select form-select-sm" id="perpage" name="perpage">
  44. <option {{ (isset($perpage) && ($perpage == 20)) ? 'selected' : '' }} value="20">20
  45. </option>
  46. <option {{ (isset($perpage) && ($perpage == 100)) ? 'selected' : '' }} value="100">100
  47. </option>
  48. <option {{ (isset($perpage) && ($perpage == 10000)) ? 'selected' : '' }} value="10000">
  49. Все
  50. </option>
  51. </select>
  52. </div>
  53. <div class="col-6 col-sm-6 col-md-auto mt-3 mt-md-0"">
  54. <button id="sb" class="btn btn-primary mt-4" type="submit">Поиск</button>
  55. <a href="{{ route('index') }}" class="btn btn-light mt-4 ms-1">Сброс</a>
  56. </div>
  57. </div>
  58. </form>
  59. </div>
  60. </div>
  61. <div class="row">
  62. <div class="col-12">
  63. <table class="table">
  64. <thead>
  65. <tr class="align-top">
  66. <th class="text-center">
  67. <label>Все<br><input type="checkbox" class="check_all" onchange="toggle(this)"></label>
  68. </th>
  69. <th class="text-center">Артикул</th>
  70. <th class="d-none d-md-table-cell">Цена,&nbsp;руб.</th>
  71. <th class="d-none d-md-table-cell">Характеристики</th>
  72. <th class="d-none d-md-table-cell">Техническое&nbsp;описание</th>
  73. <th class="text-center ">Изображение</th>
  74. <th class="d-none d-md-table-cell">Создан&nbsp;/&nbsp;Изменён</th>
  75. </thead>
  76. </tr>
  77. <tbody>
  78. @foreach($products as $product)
  79. <tr class="align-middle prod-tr">
  80. <td class="text-center"><input type="checkbox" onchange="select_product({{ $product->id }}, this)" class="form-check-inline me-0 prd-chk" name="ids" value="{{ $product->id }}"></td>
  81. <td class="text-center">
  82. <label>
  83. {{ $product->article }}<br>
  84. {{ $product->series }}
  85. </label>
  86. </td>
  87. <td class="d-none d-md-table-cell">{!! number_format($product->price, 2, ',', '&nbsp') !!}</td>
  88. <td class="d-none d-md-table-cell">
  89. <a href="{{ route('view_product', $product->id) }}">
  90. {!! nl2br($product->characteristics) !!}
  91. </a>
  92. </td>
  93. <td class="d-none d-md-table-cell" title="{{ $product->tech_description }}" style="font-size: small">{!! Str::words(nl2br($product->tech_description), 22) !!}</td>
  94. <td class="text-center align-middle">
  95. @empty($product->image_path)
  96. Нет изображения
  97. @else
  98. <img class="img-fluid" style="max-height: 80px"
  99. src="{{ '/' . env('IMAGES_PATH', '/fill_images_path_in_env') . '/' . $product->image_path }}"
  100. alt="{{ $product->article }}">
  101. @endempty
  102. </td>
  103. <td class="d-none d-md-table-cell">{!! date('d.m.Y_H:i', strtotime($product->created_at)) . '<br>' .date('d.m.Y_H:i', strtotime($product->updated_at)) !!}</td>
  104. </tr>
  105. @endforeach
  106. </tbody>
  107. </table>
  108. </div>
  109. </div>
  110. <div class="row">
  111. <div class="col-12">
  112. <div class="pagination pagination-sm justify-content-center">
  113. {{ $products->onEachSide(0)->links() }}
  114. </div>
  115. </div>
  116. </div>
  117. </div>
  118. <form action="{{ route('select_export') }}" method="post" class="visually-hidden" id="select_export">
  119. @csrf
  120. <textarea name="ids" id="ids"></textarea>
  121. </form>
  122. <script>
  123. // select all on page
  124. function toggle(source) {
  125. let checkboxes = document.querySelectorAll('.prd-chk');
  126. for(let i =0; i < checkboxes.length; i++){
  127. checkboxes[i].checked = source.checked;
  128. select_product(checkboxes[i].value, source);
  129. }
  130. calc_selected();
  131. }
  132. // select an deselect product to localstorage
  133. function select_product(id, status){
  134. let selected_products = JSON.parse(localStorage.getItem('selected_products'));
  135. if(!selected_products) selected_products = [];
  136. // console.log(status.checked);
  137. if(status.checked){
  138. // console.log('select '+id);
  139. if(!selected_products.includes(id.toString())){
  140. selected_products.push(id.toString());
  141. }
  142. } else {
  143. const index = selected_products.indexOf(id.toString());
  144. if(index > -1){
  145. selected_products.splice(index, 1);
  146. // console.log('deselect '+id);
  147. }
  148. }
  149. localStorage.setItem('selected_products', JSON.stringify(selected_products));
  150. calc_selected();
  151. }
  152. // calcculate selected products and set checkboxes
  153. function calc_selected(){
  154. let selected_products = JSON.parse(localStorage.getItem('selected_products'));
  155. if(!selected_products) selected_products = [];
  156. document.getElementById('count_selected').innerText = selected_products.length;
  157. let checkboxes = document.querySelectorAll('.prd-chk');
  158. for(let i =0; i < checkboxes.length; i++){
  159. if(selected_products.includes(checkboxes[i].value)){
  160. checkboxes[i].checked = true;
  161. }
  162. }
  163. if(selected_products.length > 0){
  164. document.getElementById('export-button').classList.remove('disabled');
  165. } else {
  166. document.getElementById('export-button').classList.add('disabled');
  167. }
  168. }
  169. // reset all selected (flush localstorage var)
  170. function reset_selected(){
  171. localStorage.setItem('selected_products', JSON.stringify([]));
  172. let checkboxes = document.querySelectorAll('.prd-chk');
  173. for(let i =0; i < checkboxes.length; i++) {
  174. checkboxes[i].checked = false;
  175. }
  176. document.querySelector('.check_all').checked = false;
  177. calc_selected();
  178. }
  179. // send selected ids by form
  180. function select_export(){
  181. let selected_products = localStorage.getItem('selected_products')
  182. //document.location = '{{ route('select_export') }}?ids='+selected_products;
  183. document.getElementById('ids').value = selected_products;
  184. document.getElementById('select_export').submit();
  185. }
  186. // on page load set checkboxes and calculate selected count
  187. calc_selected();
  188. </script>
  189. @endsection