Feat: CRUD вопросов (начало)

 QuestionController (resource)
 QuestionPolicy
 Маршруты: /admin/tests/{test}/questions
 Blade-шаблоны: index, create (с JS для динамических ответов)
 Поддержка типов: single_choice, multiple_choice, input, matching
 Интеграция в show теста

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
mirivlad
2026-03-26 15:45:14 +08:00
co-authored by Qwen-Coder
parent fe61dcf4b7
commit a34c2e2812
7 changed files with 298 additions and 1 deletions
@@ -0,0 +1,45 @@
@extends('layouts.app')
@section('title', 'Вопросы теста')
@section('content')
<div class="container-fluid">
<div class="row">
<nav class="col-md-3 col-lg-2 d-md-block sidebar"><div class="position-sticky pt-3">@include('partials._sidebar')</div></nav>
<main class="col-md-9 ms-sm-auto col-lg-10 px-md-4 main-content">
<div class="d-flex justify-content-between align-items-center pt-3 pb-2 mb-3 border-bottom">
<h1 class="h2">Вопросы: {{ $test->title }}</h1>
<a href="{{ route('admin.tests.questions.create', $test) }}" class="btn btn-primary btn-sm"><i class="bi bi-plus-lg"></i> Добавить вопрос</a>
</div>
@if(session('success'))<div class="alert alert-success">{{ session('success') }}</div>@endif
<div class="mb-3"><a href="{{ route('admin.tests.show', $test) }}" class="btn btn-secondary btn-sm"><i class="bi bi-arrow-left"></i> Назад к тесту</a></div>
<div class="card shadow-sm">
<div class="card-body">
@forelse($questions as $question)
<div class="card mb-3">
<div class="card-body">
<div class="d-flex justify-content-between align-items-start">
<div>
<span class="badge bg-info">{{ $question->type }}</span>
<strong>#{{ $loop->iteration }}. {{ Str::limit($question->question_text, 100) }}</strong>
<div class="mt-2">
<small class="text-muted">{{ $question->answers->count() }} ответов</small>
@if($question->is_required)<span class="badge bg-warning ms-2">Обязательный</span>@endif
<span class="badge bg-secondary ms-2">{{ $question->score }} балл(а)</span>
</div>
</div>
<div class="btn-group btn-group-sm">
<a href="{{ route('admin.tests.questions.edit', [$test, $question]) }}" class="btn btn-outline-warning"><i class="bi bi-pencil"></i></a>
<form action="{{ route('admin.tests.questions.destroy', [$test, $question]) }}" method="POST" class="d-inline" onsubmit="return confirm('Удалить?')">@csrf @method('DELETE')<button class="btn btn-outline-danger"><i class="bi bi-trash"></i></button></form>
</div>
</div>
</div>
</div>
@empty
<p class="text-muted text-center py-5">Нет вопросов. Добавьте первый вопрос!</p>
@endforelse
</div>
</div>
</main>
</div>
</div>
@endsection