Added quiz new features

This commit is contained in:
m.razaghi
2026-08-19 12:18:35 +03:30
parent f84ef8c067
commit a6b2a1ba30
11 changed files with 549 additions and 0 deletions

View File

@@ -0,0 +1,47 @@
@extends('admin.layouts.app')
@section('content')
<div class="row">
@include('admin.layouts.errors')
<div class="col-lg-6">
<div class="card">
<div class="card-body">
<h4 class="card-title mb-4">افزودن چالش روزانه جدید</h4>
<form action="{{ route('daily-quests.store') }}" method="post">
@csrf
<div class="mb-4">
<label>عنوان چالش (مثلاً: پیروزی در ۲ دوئل)</label>
<input class="form-control" name="title" type="text" required>
</div>
<div class="mb-4">
<label>نوع چالش</label>
<select name="quest_type" class="form-control" required>
<option value="duel_win">پیروزی در دوئل (PvP)</option>
<option value="answer_tests">پاسخ به تست‌ها</option>
<option value="perfect_score">کسب نمره کامل در آزمون</option>
</select>
</div>
<div class="mb-4">
<label>مقدار مورد نیاز (مثلاً: 2)</label>
<input class="form-control" name="required_amount" type="number" min="1" required>
</div>
<div class="mb-4">
<label>پاداش (XP)</label>
<input class="form-control" name="reward_xp" type="number" min="10" step="10" required>
</div>
<div class="custom-control custom-switch mb-4" dir="ltr">
<input type="checkbox" class="custom-control-input" id="isActiveSwitch" name="is_active"
{{ (isset($daily_quest) && $daily_quest->is_active) || !isset($daily_quest) ? 'checked' : '' }}>
<label class="custom-control-label" for="isActiveSwitch">چالش فعال باشد؟</label>
</div>
<button type="submit" class="btn btn-primary w-100">ثبت چالش</button>
</form>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,108 @@
@extends('admin.layouts.app')
@section('content')
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-body">
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="card-title mb-0">مدیریت چالش‌های روزانه (لیگ)</h4>
<div>
<!-- NEW: Suggestion Modal Trigger Button -->
<button type="button" class="btn btn-warning text-dark font-weight-bold mr-2" data-toggle="modal" data-target="#suggestionsModal">
<i class="mdi mdi-lightbulb-on mr-1"></i> پیشنهاد هوشمند
</button>
<a href="{{ route('daily-quests.create') }}" class="btn btn-success">افزودن چالش دستی</a>
</div>
</div>
@if(session('success'))
<div class="alert alert-success">{{ session('success') }}</div>
@endif
<div class="table-responsive">
<table class="table table-bordered dt-responsive nowrap">
<thead>
<tr>
<th>شناسه</th>
<th>عنوان چالش</th>
<th>نوع چالش</th>
<th>مقدار مورد نیاز</th>
<th>پاداش (XP)</th>
<th>وضعیت</th>
<th>عملیات</th>
</tr>
</thead>
<tbody>
@foreach ($quests as $item)
<tr>
<td>{{ $item->id }}</td>
<td>{{ $item->title }}</td>
<td><span class="badge badge-info">{{ $item->quest_type }}</span></td>
<td>{{ $item->required_amount }}</td>
<td><span class="text-success font-weight-bold">+{{ $item->reward_xp }} XP</span></td>
<td>
<span class="badge badge-{{ $item->is_active ? 'success' : 'danger' }}">
{{ $item->is_active ? 'فعال' : 'غیرفعال' }}
</span>
</td>
<td>
<form action="{{ route('daily-quests.destroy', $item->id) }}" method="POST" style="display: inline;">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm" onclick="return confirm('آیا از حذف این چالش مطمئن هستید؟')">حذف</button>
</form>
<a href="{{ route('daily-quests.edit', $item->id) }}" class="btn btn-primary btn-sm">ویرایش</a>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="d-flex justify-content-center mt-3">
{{ $quests->links() }}
</div>
</div>
</div>
</div>
</div>
<!-- NEW: Suggestions Modal -->
<div class="modal fade" id="suggestionsModal" tabindex="-1" role="dialog" aria-labelledby="suggestionsModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header bg-warning">
<h5 class="modal-title text-dark" id="suggestionsModalLabel"><i class="mdi mdi-lightbulb-on mr-1"></i> پیشنهادهای از پیش آماده</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body bg-light">
<p class="text-muted mb-4">با کلیک روی دکمه «افزودن»، این چالش فوراً به دیتابیس شما اضافه شده و فعال می‌گردد.</p>
@foreach($suggestions as $suggestion)
<div class="card mb-3 border-warning shadow-sm">
<div class="card-body d-flex justify-content-between align-items-center p-3">
<div>
<h5 class="mb-1 font-size-16">{{ $suggestion['title'] }}</h5>
<span class="text-muted font-size-13">نوع: <strong>{{ $suggestion['quest_type'] }}</strong> | مقدار: <strong>{{ $suggestion['required_amount'] }}</strong> | پاداش: <span class="text-success font-weight-bold">+{{ $suggestion['reward_xp'] }} XP</span></span>
</div>
<!-- Reusing your store route seamlessly -->
<form action="{{ route('daily-quests.store') }}" method="POST" class="m-0">
@csrf
<input type="hidden" name="title" value="{{ $suggestion['title'] }}">
<input type="hidden" name="quest_type" value="{{ $suggestion['quest_type'] }}">
<input type="hidden" name="required_amount" value="{{ $suggestion['required_amount'] }}">
<input type="hidden" name="reward_xp" value="{{ $suggestion['reward_xp'] }}">
<input type="hidden" name="is_active" value="1">
<button type="submit" class="btn btn-sm btn-dark px-3">افزودن +</button>
</form>
</div>
</div>
@endforeach
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,60 @@
@extends('admin.layouts.app')
@section('content')
<div class="row">
@include('admin.layouts.errors')
<div class="col-lg-6">
<div class="card">
<div class="card-body">
<h4 class="card-title mb-4">ویرایش چالش روزانه</h4>
<form action="{{ route('daily-quests.update', $daily_quest->id) }}" method="post">
@csrf
@method('PUT')
<div class="mb-4">
<label>عنوان چالش</label>
<input class="form-control" name="title" type="text" value="{{ $daily_quest->title }}"
required>
</div>
<div class="mb-4">
<label>نوع چالش</label>
<select name="quest_type" class="form-control" required>
<option value="duel_win" {{ $daily_quest->quest_type == 'duel_win' ? 'selected' : '' }}>
پیروزی در دوئل (PvP)
</option>
<option
value="answer_tests" {{ $daily_quest->quest_type == 'answer_tests' ? 'selected' : '' }}>
پاسخ به تست‌ها
</option>
<option
value="perfect_score" {{ $daily_quest->quest_type == 'perfect_score' ? 'selected' : '' }}>
کسب نمره کامل در آزمون
</option>
</select>
</div>
<div class="mb-4">
<label>مقدار مورد نیاز</label>
<input class="form-control" name="required_amount" type="number"
value="{{ $daily_quest->required_amount }}" required>
</div>
<div class="mb-4">
<label>پاداش (XP)</label>
<input class="form-control" name="reward_xp" type="number"
value="{{ $daily_quest->reward_xp }}" required>
</div>
<div class="custom-control custom-switch mb-4" dir="ltr">
<input type="checkbox" class="custom-control-input" id="isActiveSwitch" name="is_active"
{{ (isset($daily_quest) && $daily_quest->is_active) || !isset($daily_quest) ? 'checked' : '' }}>
<label class="custom-control-label" for="isActiveSwitch">چالش فعال باشد؟</label>
</div>
<button type="submit" class="btn btn-primary w-100">ویرایش چالش</button>
</form>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -67,6 +67,16 @@
</a>
</li>
<li>
<a href="javascript: void(0);" class="has-arrow waves-effect">
<i class="mdi mdi-gamepad-variant"></i>
<span>لیگ و چالش‌ها</span>
</a>
<ul class="sub-menu" aria-expanded="false">
<li><a href="{{ route('daily-quests.index') }}">لیست چالش‌های روزانه</a></li>
<li><a href="{{ route('daily-quests.create') }}">افزودن چالش جدید</a></li>
</ul>
</li>
<li>
<a href="javascript:%20void(0);" class="has-arrow waves-effect">