index.blade.php 11 KB

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