index.blade.php 10 KB

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