Feat: Компромиссное редактирование назначений

 Проверка на начатые тесты перед редактированием
 Если тестов нет — можно менять курс и дату начала
 Если тесты есть — только дата окончания и заметка
 Предупреждение в modal

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
mirivlad 2026-03-31 09:41:02 +08:00
parent 7da4b1a2cf
commit 95046fa59e
2 changed files with 71 additions and 1 deletions

View File

@ -69,11 +69,32 @@ class CourseAssignmentController extends Controller
'end_date' => 'nullable|date|after:start_date',
'note' => 'nullable|string',
'is_active' => 'boolean',
'assignment_ids' => 'nullable|string', // Для обновления существующих
]);
$validated['created_by'] = auth()->id();
$validated['is_active'] = $request->boolean('is_active');
// Если это обновление существующих назначений
if (!empty($validated['assignment_ids'])) {
$assignmentIds = array_map('intval', array_filter(explode(',', $validated['assignment_ids'])));
CourseAssignment::whereIn('id', $assignmentIds)->update([
'course_id' => !empty($validated['course_ids'])
? explode(',', $validated['course_ids'])[0]
: null,
'start_date' => $validated['start_date'],
'end_date' => $validated['end_date'] ?? null,
'note' => $validated['note'] ?? null,
]);
if ($request->ajax()) {
return response()->json(['success' => true, 'message' => 'Обновлено']);
}
return redirect()->back()->with('success', 'Назначение обновлено');
}
// Определяем тип назначения по выбранным элементам
if (empty($validated['type'])) {
if (!empty($validated['user_ids'])) {
@ -187,12 +208,27 @@ class CourseAssignmentController extends Controller
$assignments = $query->with(['course', 'user', 'group', 'organization', 'creator'])->get();
$courseModel = $assignments->first()?->course ?? Course::find($course);
// Проверяем можно ли редактировать (нет ли начатых тестов)
$canEditCourse = true;
$assignmentIds = $assignments->pluck('id')->toArray();
// Проверяем есть ли начатые тесты у назначений
if (!empty($assignmentIds)) {
// Проверяем через тесты и результаты
$hasStartedTests = \DB::table('test_results')
->whereIn('assignment_id', $assignmentIds)
->whereNotNull('started_at')
->exists();
$canEditCourse = !$hasStartedTests;
}
// Группируем по типам
$individual = $assignments->where('type', 'individual');
$groups = $assignments->where('type', 'group');
$organizations = $assignments->where('type', 'organization');
return view('admin.course-assignments.show', compact('courseModel', 'assignments', 'individual', 'groups', 'organizations', 'start_date', 'end_date'));
return view('admin.course-assignments.show', compact('courseModel', 'assignments', 'individual', 'groups', 'organizations', 'start_date', 'end_date', 'canEditCourse'));
}
public function destroy(CourseAssignment $course_assignment)

View File

@ -219,6 +219,7 @@
<div class="modal-content">
<form action="{{ route('admin.course-assignments.store') }}" method="POST">
@csrf
<input type="hidden" name="assignment_ids" value="{{ $assignments->pluck('id')->implode(',') }}">
<input type="hidden" name="course_ids" value="{{ $courseModel->id }}">
<input type="hidden" name="start_date" value="{{ $start_date }}">
<div class="modal-header">
@ -226,6 +227,39 @@
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
@if($canEditCourse)
<div class="mb-3">
<label class="form-label">Курс</label>
<x-tags-input
name="course_ids"
url="{{ route('api.courses.search') }}"
placeholder="Начните вводить название курса..."
badge_color="dark"
:value="[$courseModel->id]"
/>
<small class="text-muted">Можно изменить курс</small>
</div>
<div class="mb-3">
<label class="form-label">Дата начала *</label>
<input type="date" name="start_date" class="form-control" value="{{ $start_date }}" required>
</div>
@else
<div class="alert alert-warning">
<i class="bi bi-exclamation-triangle"></i>
<strong>Нельзя изменить курс и дату начала!</strong>
<br>
<small>Уже есть начатые тесты. Для изменения курса создайте новое назначение.</small>
</div>
<div class="mb-3">
<label class="form-label">Курс</label>
<input type="text" class="form-control" value="{{ $courseModel->title }}" disabled>
</div>
<div class="mb-3">
<label class="form-label">Дата начала</label>
<input type="text" class="form-control" value="{{ \Carbon\Carbon::parse($start_date)->format('d.m.Y') }}" disabled>
</div>
@endif
<div class="mb-3">
<label class="form-label">Дата окончания</label>
<input type="date" name="end_date" class="form-control" value="{{ $end_date }}">