Feat: Компромиссное редактирование назначений
✅ Проверка на начатые тесты перед редактированием ✅ Если тестов нет — можно менять курс и дату начала ✅ Если тесты есть — только дата окончания и заметка ✅ Предупреждение в modal Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
parent
7da4b1a2cf
commit
95046fa59e
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 }}">
|
||||
|
|
|
|||
Loading…
Reference in New Issue