newFilterElement.blade.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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(`http://localhost:8090/get-filters?column={{$id}}&table={{$table}}`);
  38. const data = await response.json();
  39. if (Array.isArray(data) && data.length && data[0] !== null) {
  40. const html = data.map(item => `
  41. <div class="form-check">
  42. <input class="form-check-input" type="checkbox" value="${escapeHtml(item)}" id="flexCheckDefault_${escapeHtml(item)}">
  43. <label class="form-check-label" for="flexCheckDefault_${escapeHtml(item)}">
  44. ${escapeHtml(item)}
  45. </label>
  46. </div>
  47. `).join('');
  48. $container.html(html);
  49. selectedValues.forEach(value => {
  50. $container.find(`.form-check-input[value="${$.escapeSelector(value)}"]`).prop("checked", true);
  51. });
  52. } else {
  53. $("#search_{{$id}}").hide();
  54. $("#modal-footer_{{$id}}").hide();
  55. $container.html('<div class="text-muted">Нет данных</div>');
  56. }
  57. } catch (error) {
  58. console.error("Ошибка при загрузке фильтров:", error);
  59. $container.html('<div class="text-danger">Ошибка загрузки</div>');
  60. }
  61. $("#accept-filter_{{$id}}").on("click", function () {
  62. const checkedValues = $container.find(".form-check-input:checked")
  63. .map(function () {
  64. return $(this).val();
  65. })
  66. .get();
  67. let currentUrl = new URL(document.location.href);
  68. if(!checkedValues.join('||')) {
  69. currentUrl.searchParams.delete('filters[{{$id}}]');
  70. } else {
  71. currentUrl.searchParams.set('filters[{{$id}}]', checkedValues.join('||'));
  72. }
  73. currentUrl.searchParams.delete('page');
  74. document.location.href = currentUrl.href;
  75. });
  76. $("#reset-filters_{{$id}}").on("click", function () {
  77. let currentUrl = new URL(document.location.href);
  78. currentUrl.searchParams.delete('filters[{{$id}}]');
  79. document.location.href = currentUrl.href;
  80. });
  81. $searchInput.on("input", function () {
  82. const query = $(this).val().toLowerCase();
  83. $container.find(".form-check").each(function () {
  84. const labelText = $(this).find("label").text().toLowerCase();
  85. if (labelText.includes(query)) {
  86. $(this).show();
  87. } else {
  88. $(this).hide();
  89. $(this).find(".form-check-input").prop("checked", false);
  90. }
  91. });
  92. });
  93. $('#sort-by-asc-{{$id}}').on('click', function () {
  94. let columnName = '{{$id}}';
  95. let currentUrl = new URL(document.location.href);
  96. currentUrl.searchParams.set('sortBy', columnName);
  97. if(currentUrl.searchParams.get('order') === 'desc') {
  98. currentUrl.searchParams.delete('order');
  99. }
  100. document.location.href = currentUrl.href;
  101. });
  102. $('#sort-by-desc-{{$id}}').on('click', function () {
  103. let columnName = '{{$id}}';
  104. let currentUrl = new URL(document.location.href);
  105. currentUrl.searchParams.set('sortBy', columnName);
  106. currentUrl.searchParams.set('order', 'desc');
  107. document.location.href = currentUrl.href;
  108. });
  109. });
  110. </script>
  111. @endpush