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',
|
'end_date' => 'nullable|date|after:start_date',
|
||||||
'note' => 'nullable|string',
|
'note' => 'nullable|string',
|
||||||
'is_active' => 'boolean',
|
'is_active' => 'boolean',
|
||||||
|
'assignment_ids' => 'nullable|string', // Для обновления существующих
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$validated['created_by'] = auth()->id();
|
$validated['created_by'] = auth()->id();
|
||||||
$validated['is_active'] = $request->boolean('is_active');
|
$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['type'])) {
|
||||||
if (!empty($validated['user_ids'])) {
|
if (!empty($validated['user_ids'])) {
|
||||||
|
|
@ -187,12 +208,27 @@ class CourseAssignmentController extends Controller
|
||||||
$assignments = $query->with(['course', 'user', 'group', 'organization', 'creator'])->get();
|
$assignments = $query->with(['course', 'user', 'group', 'organization', 'creator'])->get();
|
||||||
$courseModel = $assignments->first()?->course ?? Course::find($course);
|
$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');
|
$individual = $assignments->where('type', 'individual');
|
||||||
$groups = $assignments->where('type', 'group');
|
$groups = $assignments->where('type', 'group');
|
||||||
$organizations = $assignments->where('type', 'organization');
|
$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)
|
public function destroy(CourseAssignment $course_assignment)
|
||||||
|
|
|
||||||
|
|
@ -219,6 +219,7 @@
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<form action="{{ route('admin.course-assignments.store') }}" method="POST">
|
<form action="{{ route('admin.course-assignments.store') }}" method="POST">
|
||||||
@csrf
|
@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="course_ids" value="{{ $courseModel->id }}">
|
||||||
<input type="hidden" name="start_date" value="{{ $start_date }}">
|
<input type="hidden" name="start_date" value="{{ $start_date }}">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
|
|
@ -226,6 +227,39 @@
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<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">
|
<div class="mb-3">
|
||||||
<label class="form-label">Дата окончания</label>
|
<label class="form-label">Дата окончания</label>
|
||||||
<input type="date" name="end_date" class="form-control" value="{{ $end_date }}">
|
<input type="date" name="end_date" class="form-control" value="{{ $end_date }}">
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue