index.blade.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. @extends('layouts.app')
  2. @section('content')
  3. <div class="row mb-3">
  4. <div class="col-6">
  5. <h3>График монтажей</h3>
  6. </div>
  7. <div class="col-6 text-end">
  8. <div class="d-flex flex-row justify-content-end">
  9. <div class="p-2">
  10. <button @disabled($weekNumber == 1) class="btn btn-sm btn-primary"
  11. onclick="document.location = '{{ route('schedule.index', ['week' => $weekNumber - 1]) }}'">
  12. <i class="bi bi-arrow-left"></i>
  13. </button>
  14. </div>
  15. <label class="p-2 d-block small mt-1">Неделя №</label>
  16. <div class="p-2">
  17. <input type="number" style="width: 3rem" value="{{ $weekNumber }}"
  18. class="form-control form-control-sm"
  19. onchange="document.location = '{{ route('schedule.index') }}?week='+this.value"
  20. min="1" max="53" title="№ недели">
  21. </div>
  22. <div class="p-2">
  23. <input type="date" min="{{ year() . '-01-01' }}" max="{{ year() . '-12-31' }}"
  24. class="form-control form-control-sm" value="{{ $weekDates['mon'] }}" title="начало недели"
  25. onchange="document.location = '{{ route('schedule.index') }}?week=' + getWeekNumber(this.value)">
  26. </div>
  27. <div class="p-2">
  28. <input type="date" disabled
  29. class="form-control form-control-sm" value="{{ $weekDates['sun'] }}" title="конец недели">
  30. </div>
  31. <div class="p-2">
  32. <button @disabled($weekNumber > 52) class="btn btn-sm btn-primary"
  33. onclick="document.location = '{{ route('schedule.index', ['week' => $weekNumber + 1]) }}'">
  34. <i class="bi bi-arrow-right"></i>
  35. </button>
  36. </div>
  37. </div>
  38. </div>
  39. </div>
  40. <div class="schedule">
  41. <table class="table schedules">
  42. <thead>
  43. <tr>
  44. <th class="text-center vertical">День недели</th>
  45. <th class="text-center vertical">Дата</th>
  46. <th>Код адр</th>
  47. <th>Округ</th>
  48. <th>Район</th>
  49. <th>Адрес</th>
  50. <th>Тип объекта</th>
  51. <th>Артикулы МАФ</th>
  52. <th>Кол-во позиций</th>
  53. <th>Бригадир</th>
  54. <th>Примечание</th>
  55. <th></th>
  56. </tr>
  57. </thead>
  58. <tbody>
  59. @foreach($schedules as $dow => $schs)
  60. <tr>
  61. <td rowspan="{{ ($schs) ? count($schs) : '1' }}"
  62. class="vertical">{{ \App\Helpers\DateHelper::getHumanDayOfWeek($dow) }}
  63. <i class="bi bi-calendar-plus text-primary ms-2 createSchedule"
  64. title="Новая запись" data-schedule-date="{{ $dow }}"></i>
  65. </td>
  66. <td rowspan="{{ ($schs) ? count($schs) : '1' }}"
  67. class="vertical">{{ \App\Helpers\DateHelper::getHumanDate($dow) }}</td>
  68. @if($schs)
  69. @foreach($schs as $schedule)
  70. {!! (!$loop->first) ? '<tr>':'' !!}
  71. <td style="background: {{ $schedule->brigadier->color }}"
  72. class="align-middle">{{ $schedule->order_id }}</td>
  73. <td style="background: {{ $schedule->brigadier->color }}"
  74. class="align-middle">{{ $schedule->district->shortname }}</td>
  75. <td style="background: {{ $schedule->brigadier->color }}"
  76. class="align-middle">{{ $schedule->area->name }}</td>
  77. <td style="background: {{ $schedule->brigadier->color }}"
  78. class="align-middle">{{ $schedule->object_address }}</td>
  79. <td style="background: {{ $schedule->brigadier->color }}"
  80. class="align-middle">{{ $schedule->objectType->name }}</td>
  81. <td style="background: {{ $schedule->brigadier->color }}"
  82. class="align-middle">{!! $schedule->mafs !!}</td>
  83. <td style="background: {{ $schedule->brigadier->color }}"
  84. class="align-middle">{{ $schedule->mafs_count }}</td>
  85. <td style="background: {{ $schedule->brigadier->color }}"
  86. class="align-middle">{{ $schedule->brigadier->name }}</td>
  87. <td style="background: {{ $schedule->brigadier->color }}" class="align-middle comment-{{ $schedule->id }}">{{ $schedule->comment }}</td>
  88. <td style="background: {{ $schedule->brigadier->color }}" class="align-middle">
  89. <i class="bi bi-pencil ms-3 cursor-pointer text-primary editSchedule"
  90. data-schedule-date="{{ $schedule->installation_date }}" data-schedule-id="{{ $schedule->id }}"></i>
  91. </td>
  92. </tr>
  93. @endforeach
  94. @endif
  95. {!! (!$schs) ? '</tr>': '' !!}
  96. @endforeach
  97. </tbody>
  98. </table>
  99. </div>
  100. <!-- Модальное окно редактирования графика -->
  101. <div class="modal fade" id="copySchedule" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
  102. <div class="modal-dialog modal-fullscreen-sm-down modal-lg">
  103. <div class="modal-content">
  104. <div class="modal-header">
  105. <h1 class="modal-title fs-5" id="addModalLabel">Изменить запись в графике</h1>
  106. <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
  107. </div>
  108. <div class="modal-body">
  109. <form action="{{ route('schedule.update') }}" method="post" id="scheduleEditForm">
  110. @csrf
  111. <input type="hidden" name="id" value="0">
  112. <div>
  113. <input type="date" name="installation_date" value="" class="form-control form-control-sm mb-3">
  114. <textarea name="comment" placeholder="Комментарий для графика"
  115. class="form-control form-control-sm mb-3"></textarea>
  116. <button type="submit" class="btn btn-primary btn-sm">Обновить</button>
  117. </div>
  118. </form>
  119. </div>
  120. </div>
  121. </div>
  122. </div>
  123. <!-- Модальное окно создания графика -->
  124. <div class="modal fade" id="createSchedule" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
  125. <div class="modal-dialog modal-fullscreen-sm-down modal-lg">
  126. <div class="modal-content">
  127. <div class="modal-header">
  128. <h1 class="modal-title fs-5" id="addModalLabel">Изменить запись в графике</h1>
  129. <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
  130. </div>
  131. <div class="modal-body">
  132. <form action="{{ route('schedule.create') }}" method="post" id="scheduleCreateForm">
  133. @csrf
  134. <input type="text" class="form-control mb-2" placeholder="Поиск площадки" id="search_order">
  135. <select id="select_order" name="order_id" class="form-select mb-3" size="7" multiple
  136. required></select>
  137. <div>
  138. <input type="date" name="installation_date" value="" class="form-control form-control-sm mb-3">
  139. <textarea name="comment" placeholder="Комментарий для графика"
  140. class="form-control form-control-sm mb-3"></textarea>
  141. <button type="submit" class="btn btn-primary btn-sm">Создать</button>
  142. </div>
  143. </form>
  144. </div>
  145. </div>
  146. </div>
  147. </div>
  148. @if($errors->any())
  149. @dump($errors)
  150. @endif
  151. @endsection
  152. @push('scripts')
  153. <script type="module">
  154. $('.editSchedule').on('click', function () {
  155. let scheduleId = $(this).attr('data-schedule-id');
  156. let scheduleDate = $(this).attr('data-schedule-date');
  157. let scheduleComment = $('.comment-'+scheduleId).text();
  158. $('form#scheduleEditForm input[name=id]').val(scheduleId);
  159. $('form#scheduleEditForm input[name=installation_date]').val(scheduleDate);
  160. $('form#scheduleEditForm textarea').text(scheduleComment);
  161. let myModalEditSchedule = new bootstrap.Modal(document.getElementById("copySchedule"), {});
  162. myModalEditSchedule.show();
  163. });
  164. $('.createSchedule').on('click', function () {
  165. let scheduleDate = $(this).attr('data-schedule-date');
  166. $('form#scheduleCreateForm input[name=installation_date]').val(scheduleDate);
  167. $('form#scheduleCreateForm textarea').text('');
  168. let myModalCreateSchedule = new bootstrap.Modal(document.getElementById("createSchedule"), {});
  169. myModalCreateSchedule.show();
  170. });
  171. // select order
  172. $('#search_order').on('keyup', function () {
  173. // search products on backend
  174. $.get('{{ route('order.search') }}?s=' + $(this).val(),
  175. function (data) {
  176. $('#select_order').children().remove()
  177. $.each(data, function (id, name) {
  178. $('#select_order').append('<option value=\'' + id + '\'>' + name + '</option>');
  179. });
  180. }
  181. );
  182. }).trigger('keyup');
  183. </script>
  184. <script type="text/javascript">
  185. function getWeekNumber(d) {
  186. // Copy date so don't modify original
  187. d = new Date(Date.parse(d));
  188. // Set to nearest Thursday: current date + 4 - current day number
  189. // Make Sunday's day number 7
  190. d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));
  191. // Get first day of year
  192. let yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
  193. // Calculate and return week number
  194. return Math.ceil((((d - yearStart) / 86400000) + 1) / 7);
  195. }
  196. </script>
  197. @endpush