|
|
@@ -1,60 +1,79 @@
|
|
|
@extends('layouts.app')
|
|
|
|
|
|
@section('content')
|
|
|
- <div class="p-0 m-0 table-responsive">
|
|
|
- <div class="row mb-3">
|
|
|
+ <div class="p-0 m-0">
|
|
|
+ <div class="row mb-3 align-items-center">
|
|
|
<div class="col-md-6">
|
|
|
<h3>График монтажей</h3>
|
|
|
</div>
|
|
|
<div class="col-md-6 text-end">
|
|
|
- <div class="d-flex flex-row justify-content-end">
|
|
|
- <div class="p-2">
|
|
|
- <button @disabled($weekNumber == 1) class="btn btn-sm btn-primary"
|
|
|
- onclick="document.location = '{{ route('schedule.index', ['week' => $weekNumber - 1]) }}'">
|
|
|
- <i class="bi bi-arrow-left"></i>
|
|
|
- </button>
|
|
|
- </div>
|
|
|
- <label class="p-2 d-none d-mb-block small mt-1" for="fromDate">Неделя №</label>
|
|
|
- <div class="p-2">
|
|
|
- <input type="number" value="{{ $weekNumber }}"
|
|
|
- class="form-control form-control-sm week-number-input" name="weekNumber"
|
|
|
- onchange="document.location = '{{ route('schedule.index') }}?week='+this.value"
|
|
|
- min="1" max="53" title="№ недели">
|
|
|
- </div>
|
|
|
+ <ul class="nav nav-tabs justify-content-end">
|
|
|
+ <li class="nav-item">
|
|
|
+ <a class="nav-link @if($activeTab === 'week') active @endif"
|
|
|
+ href="{{ route('schedule.index', ['week' => $weekNumber, 'tab' => 'week']) }}">Неделя</a>
|
|
|
+ </li>
|
|
|
+ <li class="nav-item">
|
|
|
+ <a class="nav-link @if($activeTab === 'month') active @endif"
|
|
|
+ href="{{ route('schedule.index', ['month' => str_pad((string)$monthNumber, 2, '0', STR_PAD_LEFT), 'tab' => 'month']) }}">Месяц</a>
|
|
|
+ </li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
|
|
|
- <div class="p-2">
|
|
|
- <input type="date" min="{{ year() . '-01-01' }}" max="{{ year() . '-12-31' }}"
|
|
|
- class="form-control form-control-sm" value="{{ $weekDates['mon'] }}"
|
|
|
- title="начало недели" name="monday" id="fromDate"
|
|
|
- onchange="document.location = '{{ route('schedule.index') }}?week=' + getWeekNumber(this.value)">
|
|
|
- </div>
|
|
|
- <div class="p-2 d-none d-md-block">
|
|
|
- <input type="date" disabled name="sunday"
|
|
|
- class="form-control form-control-sm" value="{{ $weekDates['sun'] }}"
|
|
|
- title="конец недели">
|
|
|
- </div>
|
|
|
+ @if($activeTab === 'week')
|
|
|
+ <div class="row mb-3">
|
|
|
+ <div class="col-md-12 text-end">
|
|
|
+ <div class="d-flex flex-row justify-content-end">
|
|
|
+ <div class="p-2">
|
|
|
+ <button @disabled($weekNumber == 1) class="btn btn-sm btn-primary"
|
|
|
+ onclick="document.location = '{{ route('schedule.index', ['week' => $weekNumber - 1, 'tab' => 'week']) }}'">
|
|
|
+ <i class="bi bi-arrow-left"></i>
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ <label class="p-2 d-none d-mb-block small mt-1" for="fromDate">Неделя №</label>
|
|
|
+ <div class="p-2">
|
|
|
+ <input type="number" value="{{ $weekNumber }}"
|
|
|
+ class="form-control form-control-sm week-number-input" name="weekNumber"
|
|
|
+ onchange="document.location = '{{ route('schedule.index') }}?tab=week&week='+this.value"
|
|
|
+ min="1" max="53" title="№ недели">
|
|
|
+ </div>
|
|
|
|
|
|
- <div class="p-2">
|
|
|
- <button @disabled($weekNumber > 52) class="btn btn-sm btn-primary"
|
|
|
- onclick="document.location = '{{ route('schedule.index', ['week' => $weekNumber + 1]) }}'">
|
|
|
- <i class="bi bi-arrow-right"></i>
|
|
|
- </button>
|
|
|
- </div>
|
|
|
- @if(hasRole('admin'))
|
|
|
- <div class="p-2 ms-3">
|
|
|
- <form action="{{ route('schedule.export') }}" method="post">
|
|
|
- @csrf
|
|
|
- <input type="hidden" name="start_date" value="{{ $weekDates['mon'] }}">
|
|
|
- <input type="hidden" name="end_date" value="{{ $weekDates['sun'] }}">
|
|
|
- <input type="hidden" name="week" value="{{ $weekNumber }}">
|
|
|
- <button type="submit" class="btn btn-sm btn-primary" id="exportScheduleButton">Экспорт</button>
|
|
|
- </form>
|
|
|
+ <div class="p-2">
|
|
|
+ <input type="date" min="{{ year() . '-01-01' }}" max="{{ year() . '-12-31' }}"
|
|
|
+ class="form-control form-control-sm" value="{{ $weekDates['mon'] }}"
|
|
|
+ title="начало недели" name="monday" id="fromDate"
|
|
|
+ onchange="document.location = '{{ route('schedule.index') }}?tab=week&week=' + getWeekNumber(this.value)">
|
|
|
+ </div>
|
|
|
+ <div class="p-2 d-none d-md-block">
|
|
|
+ <input type="date" disabled name="sunday"
|
|
|
+ class="form-control form-control-sm" value="{{ $weekDates['sun'] }}"
|
|
|
+ title="конец недели">
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="p-2">
|
|
|
+ <button @disabled($weekNumber > 52) class="btn btn-sm btn-primary"
|
|
|
+ onclick="document.location = '{{ route('schedule.index', ['week' => $weekNumber + 1, 'tab' => 'week']) }}'">
|
|
|
+ <i class="bi bi-arrow-right"></i>
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ @if(hasRole('admin'))
|
|
|
+ <div class="p-2 ms-3">
|
|
|
+ <form action="{{ route('schedule.export') }}" method="post">
|
|
|
+ @csrf
|
|
|
+ <input type="hidden" name="start_date" value="{{ $weekDates['mon'] }}">
|
|
|
+ <input type="hidden" name="end_date" value="{{ $weekDates['sun'] }}">
|
|
|
+ <input type="hidden" name="week" value="{{ $weekNumber }}">
|
|
|
+ <button type="submit" class="btn btn-sm btn-primary" id="exportScheduleButton">Экспорт</button>
|
|
|
+ </form>
|
|
|
+ </div>
|
|
|
+ @endif
|
|
|
</div>
|
|
|
- @endif
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
+ @endif
|
|
|
|
|
|
+ @if($activeTab === 'week')
|
|
|
+ <div class="table-responsive">
|
|
|
<table class="table">
|
|
|
<thead>
|
|
|
<tr>
|
|
|
@@ -141,7 +160,138 @@
|
|
|
|
|
|
</tbody>
|
|
|
</table>
|
|
|
+ </div>
|
|
|
+ @endif
|
|
|
+
|
|
|
+ @if($activeTab === 'month')
|
|
|
+ <div class="d-flex justify-content-between align-items-center mb-3">
|
|
|
+ <div class="d-flex align-items-center">
|
|
|
+ <button class="btn btn-sm btn-primary me-2" @disabled(!$monthPrev)
|
|
|
+ onclick="document.location = '{{ route('schedule.index', ['tab' => 'month', 'month' => $monthPrev ?? str_pad((string)$monthNumber, 2, '0', STR_PAD_LEFT)]) }}'">
|
|
|
+ <i class="bi bi-arrow-left"></i>
|
|
|
+ </button>
|
|
|
+ <div class="h5 mb-0 text-capitalize">{{ $monthLabel }}</div>
|
|
|
+ <button class="btn btn-sm btn-primary ms-2" @disabled(!$monthNext)
|
|
|
+ onclick="document.location = '{{ route('schedule.index', ['tab' => 'month', 'month' => $monthNext ?? str_pad((string)$monthNumber, 2, '0', STR_PAD_LEFT)]) }}'">
|
|
|
+ <i class="bi bi-arrow-right"></i>
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ <div class="d-flex align-items-center">
|
|
|
+ <label for="monthSelect" class="me-2 small">Месяц</label>
|
|
|
+ <input id="monthSelect" type="month" class="form-control form-control-sm"
|
|
|
+ min="{{ year() . '-01' }}" max="{{ year() . '-12' }}"
|
|
|
+ value="{{ year() . '-' . str_pad((string)$monthNumber, 2, '0', STR_PAD_LEFT) }}"
|
|
|
+ onchange="document.location='{{ route('schedule.index') }}?tab=month&month=' + this.value.substring(5,7)">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
|
|
|
+ <div class="table-responsive">
|
|
|
+ <table class="table table-bordered schedule-month">
|
|
|
+ <thead>
|
|
|
+ <tr>
|
|
|
+ <th class="text-center">Пн</th>
|
|
|
+ <th class="text-center">Вт</th>
|
|
|
+ <th class="text-center">Ср</th>
|
|
|
+ <th class="text-center">Чт</th>
|
|
|
+ <th class="text-center">Пт</th>
|
|
|
+ <th class="text-center">Сб</th>
|
|
|
+ <th class="text-center">Вс</th>
|
|
|
+ </tr>
|
|
|
+ </thead>
|
|
|
+ <tbody>
|
|
|
+ @foreach($monthGrid as $week)
|
|
|
+ <tr>
|
|
|
+ @foreach($week as $day)
|
|
|
+ <td class="schedule-day @if(!$day['inMonth']) schedule-outside @endif @if($day['isToday']) schedule-today @endif"
|
|
|
+ data-week="{{ $day['week'] }}">
|
|
|
+ <a class="schedule-day-link"
|
|
|
+ href="{{ route('schedule.index', ['week' => $day['week'], 'tab' => 'week']) }}"
|
|
|
+ title="Открыть неделю №{{ $day['week'] }}">
|
|
|
+ {{ $day['day'] }}
|
|
|
+ </a>
|
|
|
+ @if(isset($monthScheduleColors[$day['date']]))
|
|
|
+ <div class="schedule-dots">
|
|
|
+ @foreach($monthScheduleColors[$day['date']] as $brigadier)
|
|
|
+ <span class="schedule-dot" style="background: {{ $brigadier['color'] }}"
|
|
|
+ title="{{ $brigadier['name'] }}"></span>
|
|
|
+ @endforeach
|
|
|
+ </div>
|
|
|
+ @endif
|
|
|
+ </td>
|
|
|
+ @endforeach
|
|
|
+ </tr>
|
|
|
+ @endforeach
|
|
|
+ </tbody>
|
|
|
+ </table>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ @if(!empty($monthBrigadierLegend))
|
|
|
+ <div class="schedule-legend mt-3">
|
|
|
+ <div class="small text-muted mb-2">Бригадиры</div>
|
|
|
+ <div class="schedule-legend-items">
|
|
|
+ @foreach($monthBrigadierLegend as $brigadier)
|
|
|
+ <span class="schedule-legend-item">
|
|
|
+ <span class="schedule-dot" style="background: {{ $brigadier['color'] }}"></span>
|
|
|
+ <span class="schedule-legend-name">{{ $brigadier['name'] }}</span>
|
|
|
+ </span>
|
|
|
+ @endforeach
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ @endif
|
|
|
+ @endif
|
|
|
+
|
|
|
+ <style>
|
|
|
+ .schedule-month {
|
|
|
+ table-layout: fixed;
|
|
|
+ }
|
|
|
+ .schedule-day {
|
|
|
+ height: 110px;
|
|
|
+ vertical-align: top;
|
|
|
+ position: relative;
|
|
|
+ }
|
|
|
+ .schedule-day-link {
|
|
|
+ display: inline-block;
|
|
|
+ font-weight: 600;
|
|
|
+ text-decoration: none;
|
|
|
+ color: #0d6efd;
|
|
|
+ }
|
|
|
+ .schedule-dots {
|
|
|
+ margin-top: 6px;
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ gap: 4px;
|
|
|
+ }
|
|
|
+ .schedule-dot {
|
|
|
+ width: 12px;
|
|
|
+ height: 12px;
|
|
|
+ border-radius: 50%;
|
|
|
+ display: inline-block;
|
|
|
+ border: 1px solid rgba(0, 0, 0, 0.1);
|
|
|
+ }
|
|
|
+ .schedule-outside {
|
|
|
+ background: #f8f9fa;
|
|
|
+ color: #9aa0a6;
|
|
|
+ }
|
|
|
+ .schedule-today {
|
|
|
+ outline: 2px solid rgba(13, 110, 253, 0.5);
|
|
|
+ outline-offset: -2px;
|
|
|
+ }
|
|
|
+ .schedule-legend-items {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ gap: 10px 16px;
|
|
|
+ align-items: center;
|
|
|
+ }
|
|
|
+ .schedule-legend-item {
|
|
|
+ display: inline-flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 6px;
|
|
|
+ font-size: 0.9rem;
|
|
|
+ }
|
|
|
+ .schedule-legend-name {
|
|
|
+ white-space: nowrap;
|
|
|
+ }
|
|
|
+ </style>
|
|
|
|
|
|
<!-- Модальное окно редактирования графика -->
|
|
|
<div class="modal fade" id="copySchedule" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
|
|
|
@@ -184,6 +334,12 @@
|
|
|
|
|
|
@push('scripts')
|
|
|
<script type="module">
|
|
|
+ $('.schedule-day').on('dblclick', function () {
|
|
|
+ let week = $(this).attr('data-week');
|
|
|
+ if (!week) return;
|
|
|
+ document.location = '{{ route('schedule.index') }}?tab=week&week=' + week;
|
|
|
+ });
|
|
|
+
|
|
|
$('.editSchedule').on('click', function () {
|
|
|
let scheduleId = $(this).attr('data-schedule-id');
|
|
|
let scheduleDate = $(this).attr('data-schedule-date');
|