index.blade.php 6.5 KB

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