index.blade.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. @extends('layouts.app')
  2. @section('content')
  3. <div class="row mb-3">
  4. <div class="col-12">
  5. <h3>Удаление данных</h3>
  6. </div>
  7. </div>
  8. <div class="row">
  9. <div class="col-md-6">
  10. <div class="card">
  11. <div class="card-header">
  12. Выберите год для удаления
  13. </div>
  14. <div class="card-body">
  15. @if(count($years) > 0)
  16. <div class="mb-3">
  17. <label for="year" class="form-label">Год</label>
  18. <select class="form-select" id="year" name="year">
  19. <option value="">-- Выберите год --</option>
  20. @foreach($years as $year)
  21. <option value="{{ $year }}">{{ $year }}</option>
  22. @endforeach
  23. </select>
  24. </div>
  25. <button type="button" class="btn btn-primary" id="btnGetStats" disabled>
  26. Показать статистику
  27. </button>
  28. @else
  29. <div class="alert alert-info">
  30. Нет данных для удаления
  31. </div>
  32. @endif
  33. </div>
  34. </div>
  35. </div>
  36. <div class="col-md-6 is-hidden" id="statsBlock">
  37. <div class="card">
  38. <div class="card-header">
  39. Статистика удаляемых данных за <span id="statsYear"></span> год
  40. </div>
  41. <div class="card-body">
  42. <div class="table-responsive">
  43. <table class="table table-sm table-striped" id="statsTable">
  44. <thead>
  45. <tr>
  46. <th>Сущность</th>
  47. <th class="text-end">Количество</th>
  48. </tr>
  49. </thead>
  50. <tbody></tbody>
  51. <tfoot>
  52. <tr class="table-dark">
  53. <th>Итого</th>
  54. <th class="text-end" id="statsTotal"></th>
  55. </tr>
  56. </tfoot>
  57. </table>
  58. </div>
  59. <div class="alert alert-danger">
  60. <strong>Внимание!</strong> Это действие необратимо. Все данные за выбранный год будут удалены безвозвратно.
  61. </div>
  62. <button type="button" class="btn btn-danger" id="btnDelete">
  63. Удалить данные
  64. </button>
  65. </div>
  66. </div>
  67. </div>
  68. </div>
  69. <!-- Модальное окно подтверждения -->
  70. <div class="modal fade" id="confirmModal" tabindex="-1" aria-labelledby="confirmModalLabel" aria-hidden="true">
  71. <div class="modal-dialog">
  72. <div class="modal-content">
  73. <div class="modal-header bg-danger text-white">
  74. <h1 class="modal-title fs-5" id="confirmModalLabel">Подтверждение удаления</h1>
  75. <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Закрыть"></button>
  76. </div>
  77. <div class="modal-body">
  78. <p>Вы уверены, что хотите удалить <strong>все данные</strong> за <strong id="confirmYear"></strong> год?</p>
  79. <p>Будет удалено записей: <strong id="confirmTotal"></strong></p>
  80. <p class="text-danger mb-0">Это действие <strong>необратимо</strong>!</p>
  81. </div>
  82. <div class="modal-footer">
  83. <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
  84. <form action="{{ route('clear-data.destroy') }}" method="post" id="deleteForm">
  85. @csrf
  86. @method('DELETE')
  87. <input type="hidden" name="year" id="deleteYear">
  88. <button type="submit" class="btn btn-danger">Удалить</button>
  89. </form>
  90. </div>
  91. </div>
  92. </div>
  93. </div>
  94. @endsection
  95. @push('scripts')
  96. <script type="module">
  97. $(document).ready(function() {
  98. let selectedYear = null;
  99. let totalRecords = 0;
  100. $('#year').on('change', function() {
  101. selectedYear = $(this).val();
  102. $('#btnGetStats').prop('disabled', !selectedYear);
  103. $('#statsBlock').hide();
  104. });
  105. $('#btnGetStats').on('click', function() {
  106. if (!selectedYear) return;
  107. const btn = $(this);
  108. btn.prop('disabled', true).text('Загрузка...');
  109. $.ajax({
  110. url: '{{ route('clear-data.stats') }}',
  111. method: 'GET',
  112. data: { year: selectedYear },
  113. success: function(response) {
  114. $('#statsYear').text(response.year);
  115. $('#statsTotal').text(response.total);
  116. const tbody = $('#statsTable tbody');
  117. tbody.empty();
  118. for (const [entity, count] of Object.entries(response.stats)) {
  119. tbody.append(`<tr><td>${entity}</td><td class="text-end">${count}</td></tr>`);
  120. }
  121. totalRecords = response.total;
  122. $('#statsBlock').show();
  123. },
  124. error: function(xhr) {
  125. customAlert('Ошибка получения статистики: ' + (xhr.responseJSON?.error || 'Неизвестная ошибка'));
  126. },
  127. complete: function() {
  128. btn.prop('disabled', false).text('Показать статистику');
  129. }
  130. });
  131. });
  132. $('#btnDelete').on('click', function() {
  133. $('#confirmYear').text(selectedYear);
  134. $('#confirmTotal').text(totalRecords);
  135. $('#deleteYear').val(selectedYear);
  136. let confirmModal = new bootstrap.Modal(document.getElementById('confirmModal'), {});
  137. confirmModal.show();
  138. });
  139. });
  140. </script>
  141. @endpush