index.blade.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  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="">Всего найдено: {{ $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-middle">
  67. <th class="text-center">Артикул<br>
  68. <label><input type="checkbox" class="check_all" onchange="toggle(this)">&nbsp;Все</label>
  69. </th>
  70. {{-- <th>Группа <br> Наименование <br> Наименование под образец формы</th>--}}
  71. <th>Цена,&nbsp;руб.</th>
  72. <th>Характеристики</th>
  73. <th>Техническое&nbsp;описание</th>
  74. <th class="text-center ">Изображение</th>
  75. <th>Создан&nbsp;/&nbsp;Изменён</th>
  76. </thead>
  77. </tr>
  78. <tbody>
  79. @foreach($products as $product)
  80. <tr class="align-middle prod-tr">
  81. <td class="text-center">
  82. <label>
  83. <input type="checkbox" onchange="select_product({{ $product->id }}, this)" class="form-check-inline me-0 prd-chk" name="ids" value="{{ $product->id }}"><br>
  84. {{ $product->article }}<br>
  85. {{ $product->series }}
  86. </label>
  87. </td>
  88. {{-- <td>--}}
  89. {{-- <a href="{{ route('view_product', $product->id) }}">--}}
  90. {{-- <strong>Группа:</strong> {{ $product->product_group }}<br>--}}
  91. {{-- <strong>Наименование:</strong> {{ $product->name }}<br>--}}
  92. {{-- <strong>Наименование под образец формы:</strong> {{ $product->name_for_form }}--}}
  93. {{-- </a>--}}
  94. {{-- </td>--}}
  95. <td>{!! number_format($product->price, 2, ',', '&nbsp') !!}</td>
  96. <td>
  97. <a href="{{ route('view_product', $product->id) }}">
  98. {!! nl2br($product->characteristics) !!}
  99. </a>
  100. </td>
  101. <td title="{{ $product->tech_description }}" style="font-size: small">{!! Str::words(nl2br($product->tech_description), 22) !!}</td>
  102. <td class="text-center align-middle">
  103. @empty($product->image_path)
  104. Нет изображения
  105. @else
  106. <img class="img-fluid" style="max-height: 80px"
  107. src="{{ '/' . env('IMAGES_PATH', '/fill_images_path_in_env') . '/' . $product->image_path }}"
  108. alt="{{ $product->article }}">
  109. @endempty
  110. </td>
  111. <td>{!! date('d.m.Y_H:i', strtotime($product->created_at)) . '<br>' .date('d.m.Y_H:i', strtotime($product->updated_at)) !!}</td>
  112. </tr>
  113. @endforeach
  114. </tbody>
  115. </table>
  116. <div class="d-flex">
  117. {{ $products->links() }}
  118. </div>
  119. </div>
  120. </div>
  121. </div>
  122. <form action="{{ route('select_export') }}" method="post" class="visually-hidden" id="select_export">
  123. @csrf
  124. <textarea name="ids" id="ids"></textarea>
  125. </form>
  126. <script>
  127. // select all on page
  128. function toggle(source) {
  129. let checkboxes = document.querySelectorAll('.prd-chk');
  130. for(let i =0; i < checkboxes.length; i++){
  131. checkboxes[i].checked = source.checked;
  132. select_product(checkboxes[i].value, source);
  133. }
  134. calc_selected();
  135. }
  136. // select an deselect product to localstorage
  137. function select_product(id, status){
  138. let selected_products = JSON.parse(localStorage.getItem('selected_products'));
  139. if(!selected_products) selected_products = [];
  140. // console.log(status.checked);
  141. if(status.checked){
  142. // console.log('select '+id);
  143. if(!selected_products.includes(id.toString())){
  144. selected_products.push(id.toString());
  145. }
  146. } else {
  147. const index = selected_products.indexOf(id.toString());
  148. if(index > -1){
  149. selected_products.splice(index, 1);
  150. // console.log('deselect '+id);
  151. }
  152. }
  153. localStorage.setItem('selected_products', JSON.stringify(selected_products));
  154. calc_selected();
  155. }
  156. // calcculate selected products and set checkboxes
  157. function calc_selected(){
  158. let selected_products = JSON.parse(localStorage.getItem('selected_products'));
  159. if(!selected_products) selected_products = [];
  160. document.getElementById('count_selected').innerText = selected_products.length;
  161. let checkboxes = document.querySelectorAll('.prd-chk');
  162. for(let i =0; i < checkboxes.length; i++){
  163. if(selected_products.includes(checkboxes[i].value)){
  164. checkboxes[i].checked = true;
  165. }
  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