newFilterElement.blade.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <div class="dropdown-menu" style="width: 300px;" aria-labelledby="{{$id}}">
  2. <div class="px-1">
  3. <div class="d-flex mb-2 {{ $isSort ? '' : 'd-none' }}">
  4. <div class="me-3">Сортировка</div>
  5. <div class="d-flex w-75">
  6. <button type="button" class="btn btn-outline-secondary btn-sm w-100" id="sort-by-asc-{{$id}}"><i class="bi bi-arrow-up"></i>ASC</button>
  7. <button type="button" class="btn btn-outline-secondary btn-sm w-100" id="sort-by-desc-{{$id}}"><i class="bi bi-arrow-down"></i>DESC</button>
  8. </div>
  9. </div>
  10. <form class="dropdown-filter_{{$id}} mb-2">
  11. <input class="form-control mb-3" id="search_{{$id}}" placeholder="Поиск">
  12. <div class="ps-1" id="filter-list-{{$id}}" style="max-height: 200px; overflow-y: scroll;">
  13. </div>
  14. </form>
  15. <div class="modal-footer d-flex justify-content-between" id="modal-footer_{{$id}}">
  16. <button type="button" class="btn btn-outline-secondary reset-filters_{{$id}} btn-sm w-50 border-0" id="reset-filters_{{$id}}">Отмена</button>
  17. <button type="button" class="btn btn-primary accept-filter_{{$id}} btn-sm w-50" id="accept-filter_{{$id}}">Применить</button>
  18. </div>
  19. </div>
  20. </div>
  21. @push('scripts')
  22. <script type="module">
  23. function escapeHtml(str) {
  24. return str.toString()
  25. .replace(/&/g, "&amp;")
  26. .replace(/"/g, "&quot;")
  27. .replace(/</g, "&lt;")
  28. .replace(/>/g, "&gt;");
  29. }
  30. $(document).ready(async function () {
  31. const $container = $("#filter-list-{{$id}}");
  32. const $searchInput = $("#search_{{$id}}");
  33. const urlParams = new URL(document.location.href);
  34. const existingFilter = urlParams.searchParams.get(`filters[{{$id}}]`);
  35. const selectedValues = existingFilter ? existingFilter.split("||") : [];
  36. try {
  37. const response = await fetch(`{!! route('getFilters', ['column' => $id, 'table' => $table]) !!}`);
  38. const data = await response.json();
  39. if (Array.isArray(data) && data.length) {
  40. if(data[0] === null) data[0] = '-пусто-';
  41. const html = data.map(item => `
  42. <div class="form-check">
  43. <input class="form-check-input" type="checkbox" value="${escapeHtml(item)}" id="flexCheckDefault_${escapeHtml(item)}">
  44. <label class="form-check-label" for="flexCheckDefault_${escapeHtml(item)}">
  45. ${escapeHtml(item)}
  46. </label>
  47. </div>
  48. `).join('');
  49. $container.html(html);
  50. selectedValues.forEach(value => {
  51. $container.find(`.form-check-input[value="${$.escapeSelector(value)}"]`).prop("checked", true);
  52. });
  53. } else {
  54. $("#search_{{$id}}").hide();
  55. $("#modal-footer_{{$id}}").hide();
  56. $container.html('<div class="text-muted">Нет данных</div>');
  57. }
  58. } catch (error) {
  59. console.error("Ошибка при загрузке фильтров:", error);
  60. $container.html('<div class="text-danger">Ошибка загрузки</div>');
  61. }
  62. $("#accept-filter_{{$id}}").on("click", function () {
  63. const checkedValues = $container.find(".form-check-input:checked")
  64. .map(function () {
  65. return $(this).val();
  66. })
  67. .get();
  68. let currentUrl = new URL(document.location.href);
  69. if(!checkedValues.join('||')) {
  70. currentUrl.searchParams.delete('filters[{{$id}}]');
  71. } else {
  72. currentUrl.searchParams.set('filters[{{$id}}]', checkedValues.join('||'));
  73. }
  74. currentUrl.searchParams.delete('page');
  75. document.location.href = currentUrl.href;
  76. });
  77. $("#reset-filters_{{$id}}").on("click", function () {
  78. let currentUrl = new URL(document.location.href);
  79. currentUrl.searchParams.delete('filters[{{$id}}]');
  80. document.location.href = currentUrl.href;
  81. });
  82. $searchInput.on("input", function () {
  83. const query = $(this).val().toLowerCase();
  84. $container.find(".form-check").each(function () {
  85. const labelText = $(this).find("label").text().toLowerCase();
  86. if (labelText.includes(query)) {
  87. $(this).show();
  88. } else {
  89. $(this).hide();
  90. $(this).find(".form-check-input").prop("checked", false);
  91. }
  92. });
  93. });
  94. $('#sort-by-asc-{{$id}}').on('click', function () {
  95. let columnName = '{{$id}}';
  96. let currentUrl = new URL(document.location.href);
  97. currentUrl.searchParams.set('sortBy', columnName);
  98. if(currentUrl.searchParams.get('order') === 'desc') {
  99. currentUrl.searchParams.delete('order');
  100. }
  101. document.location.href = currentUrl.href;
  102. });
  103. $('#sort-by-desc-{{$id}}').on('click', function () {
  104. let columnName = '{{$id}}';
  105. let currentUrl = new URL(document.location.href);
  106. currentUrl.searchParams.set('sortBy', columnName);
  107. currentUrl.searchParams.set('order', 'desc');
  108. document.location.href = currentUrl.href;
  109. });
  110. });
  111. </script>
  112. @endpush