forked from aslan/applicant-site
refactoring Reception screen to Admission
This commit is contained in:
parent
551864fbb8
commit
3e50dee628
|
@ -1,82 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\StoreReceptionScreenRequest;
|
||||
use App\Http\Requests\UpdateReceptionScreenRequest;
|
||||
use App\Models\ReceptionScreen;
|
||||
use Illuminate\Contracts\View\Factory;
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Illuminate\Foundation\Application;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class ReceptionScreenController extends Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$this->middleware('auth');
|
||||
}
|
||||
public function index(): View|Application|Factory|\Illuminate\Contracts\Foundation\Application
|
||||
{
|
||||
abort_if(Auth::guest(), 403);
|
||||
|
||||
$receptionScreens = ReceptionScreen::all()->sortBy('position');
|
||||
return view('admin-reception-screen.index', compact('receptionScreens'));
|
||||
}
|
||||
|
||||
public function create(): View
|
||||
{
|
||||
abort_if(Auth::guest(), 403);
|
||||
|
||||
$receptionScreens = ReceptionScreen::all()->sortBy('position');
|
||||
return view('admin-reception-screen.create', compact('receptionScreens'));
|
||||
}
|
||||
|
||||
public function store(StoreReceptionScreenRequest $request)
|
||||
{
|
||||
abort_if(Auth::guest(), 403);
|
||||
|
||||
$validated = $request->validated();
|
||||
$receptionScreen = new ReceptionScreen();
|
||||
$receptionScreen->name = $validated['name'];
|
||||
$receptionScreen->position = $validated['position'];
|
||||
$receptionScreen->save();
|
||||
|
||||
return redirect()->route('admin-reception-screen.index');
|
||||
}
|
||||
public function edit($id)
|
||||
{
|
||||
abort_if(Auth::guest(), 403);
|
||||
|
||||
$receptionScreen = new ReceptionScreen();
|
||||
$currentReceptionScreen = $receptionScreen->find($id);
|
||||
$receptionScreens = $receptionScreen->all()->sortBy('position');
|
||||
return view('admin-reception-screen.edit', compact('currentReceptionScreen', 'receptionScreens'));
|
||||
}
|
||||
|
||||
public function update(UpdateReceptionScreenRequest $request, $id)
|
||||
{
|
||||
abort_if(Auth::guest(), 403);
|
||||
|
||||
$validated = $request->validated();
|
||||
$receptionScreen = new ReceptionScreen();
|
||||
$currentReceptionScreen = $receptionScreen->find($id);
|
||||
$currentReceptionScreen->name = $validated['name'];
|
||||
$currentReceptionScreen->position = $validated['position'];
|
||||
$currentReceptionScreen->save();
|
||||
|
||||
return redirect()->route('admin-reception-screen.index');
|
||||
}
|
||||
|
||||
public function destroy($id)
|
||||
{
|
||||
$receptionScreen = new ReceptionScreen();
|
||||
$currentReceptionScreen = $receptionScreen->find($id);
|
||||
if ($currentReceptionScreen->files()->exists()) {
|
||||
return back();
|
||||
}
|
||||
$currentReceptionScreen->delete();
|
||||
|
||||
return redirect()->route('admin-reception-screen.index');
|
||||
}
|
||||
}
|
|
@ -0,0 +1,72 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\admin\StoreAdmissionRequest;
|
||||
use App\Http\Requests\admin\UpdateAdmissionRequest;
|
||||
use App\Models\Admission;
|
||||
|
||||
class AdmissionController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$admissions = Admission::all()->sortBy('position');
|
||||
return view('admin.admission.index', compact('admissions'));
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
$admissions = Admission::all()->sortBy('position');
|
||||
return view('admin.admission.create', compact('admissions'));
|
||||
}
|
||||
|
||||
public function store(StoreAdmissionRequest $request)
|
||||
{
|
||||
$validated = $request->validated();
|
||||
|
||||
$admission = new Admission();
|
||||
$admission->name = $validated['name'];
|
||||
$admission->description = $validated['description'];
|
||||
$admission->slug = $validated['slug'];
|
||||
$admission->position = $validated['position'];
|
||||
$admission->save();
|
||||
|
||||
return redirect()->route('admissions.index');
|
||||
}
|
||||
|
||||
public function show(Admission $admission)
|
||||
{
|
||||
return view('admin.admission.show', compact('admission'));
|
||||
}
|
||||
|
||||
public function edit(Admission $admission)
|
||||
{
|
||||
return view('admin.admission.edit', compact('admission'));
|
||||
}
|
||||
|
||||
public function update(UpdateAdmissionRequest $request, Admission $admission)
|
||||
{
|
||||
$validated = $request->validated();
|
||||
|
||||
$admission->name = $validated['name'];
|
||||
$admission->description = $validated['description'];
|
||||
$admission->slug = $validated['slug'];
|
||||
$admission->position = $validated['position'];
|
||||
$admission->save();
|
||||
|
||||
return redirect()->route('admissions.index');
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(Admission $admission)
|
||||
{
|
||||
if ($admission->documents()->exists()) {
|
||||
return back();
|
||||
}
|
||||
$admission->delete();
|
||||
return redirect()->route('admissions.index');
|
||||
}
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class StoreReceptionScreenRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'name' => 'required|max:255',
|
||||
'position' => 'required||int|max:255',
|
||||
];
|
||||
}
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class UpdateReceptionScreenRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'name' => 'required|max:255',
|
||||
'position' => 'required||int|max:255',
|
||||
];
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Requests\admin;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class StoreAdmissionRequest extends FormRequest
|
||||
{
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'position' => 'required|int|max:255',
|
||||
'name' => 'required|string|max:255|unique:admissions,name',
|
||||
'description' => 'string',
|
||||
'slug' => 'required|string',
|
||||
];
|
||||
}
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Requests\admin;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class UpdateAdmissionRequest extends FormRequest
|
||||
{
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'position' => 'required|int|max:255',
|
||||
'description' => 'string',
|
||||
'slug' => 'string|required',
|
||||
'name' => [
|
||||
'required',
|
||||
'string',
|
||||
'max:255',
|
||||
"unique:admissions,name,{$this->admission->id}",
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
|
@ -6,7 +6,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
|
||||
class ReceptionScreen extends Model
|
||||
class Admission extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
|
@ -16,8 +16,8 @@ class ReceptionScreen extends Model
|
|||
'position'
|
||||
];
|
||||
|
||||
public function files(): HasMany
|
||||
public function documents(): HasMany
|
||||
{
|
||||
return $this->hasMany('App\Models\File', 'reception_screen_id');
|
||||
return $this->hasMany('App\Models\Document', 'admission_id');
|
||||
}
|
||||
}
|
|
@ -1,66 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace App\Policies;
|
||||
|
||||
use App\Models\ReceptionScreen;
|
||||
use App\Models\User;
|
||||
use Illuminate\Auth\Access\Response;
|
||||
|
||||
class ReceptionScreenPolicy
|
||||
{
|
||||
/**
|
||||
* Determine whether the user can view any models.
|
||||
*/
|
||||
public function viewAny(User $user): bool
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can view the model.
|
||||
*/
|
||||
public function view(User $user, ReceptionScreen $doceumentsOnline): bool
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can create models.
|
||||
*/
|
||||
public function create(User $user): bool
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can update the model.
|
||||
*/
|
||||
public function update(User $user, ReceptionScreen $doceumentsOnline): bool
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can delete the model.
|
||||
*/
|
||||
public function delete(User $user, ReceptionScreen $doceumentsOnline): bool
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can restore the model.
|
||||
*/
|
||||
public function restore(User $user, ReceptionScreen $doceumentsOnline): bool
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can permanently delete the model.
|
||||
*/
|
||||
public function forceDelete(User $user, ReceptionScreen $doceumentsOnline): bool
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
|
||||
namespace Database\Factories;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||
|
||||
class AdmissionFactory extends Factory
|
||||
{
|
||||
public function definition(): array
|
||||
{
|
||||
return [
|
||||
'name' => fake()->name(),
|
||||
'description' => fake()->text(),
|
||||
'slug' => fake()->slug(),
|
||||
'position' => fake()->randomDigit(),
|
||||
];
|
||||
}
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Database\Factories;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||
|
||||
/**
|
||||
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\ReceptionScreen>
|
||||
*/
|
||||
class ReceptionScreenFactory extends Factory
|
||||
{
|
||||
/**
|
||||
* Define the model's default state.
|
||||
*
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
public function definition(): array
|
||||
{
|
||||
return [
|
||||
//
|
||||
];
|
||||
}
|
||||
}
|
|
@ -11,9 +11,11 @@ return new class extends Migration
|
|||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('reception_screens', function (Blueprint $table) {
|
||||
Schema::create('admissions', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('name');
|
||||
$table->text('description');
|
||||
$table->string('slug');
|
||||
$table->integer('position');
|
||||
$table->timestamps();
|
||||
});
|
||||
|
@ -24,6 +26,6 @@ return new class extends Migration
|
|||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('reception_screens');
|
||||
Schema::dropIfExists('admissions');
|
||||
}
|
||||
};
|
|
@ -1,33 +0,0 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('submenu', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('name');
|
||||
$table->string('description');
|
||||
$table->string('parent');
|
||||
$table->string('meta_title');
|
||||
$table->string('meta_description');
|
||||
$table->string('meta_keywords');
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('submenu');
|
||||
}
|
||||
};
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
|
||||
use Illuminate\Database\Seeder;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class AdmissionSeeder extends Seeder
|
||||
{
|
||||
public function run(): void
|
||||
{
|
||||
DB::table('admissions')->insert([
|
||||
[
|
||||
'name' => 'Пункт 1',
|
||||
'position' => 2,
|
||||
'description' => 'description 1',
|
||||
'slug' => 'point-1',
|
||||
'created_at' => now(),
|
||||
],
|
||||
[
|
||||
'name' => 'Пункт 2',
|
||||
'position' => 3,
|
||||
'description' => 'description 2',
|
||||
'slug' => 'point-2',
|
||||
'created_at' => now(),
|
||||
],
|
||||
[
|
||||
'name' => 'Пункт 3',
|
||||
'description' => 'description 3',
|
||||
'position' => 1,
|
||||
'slug' => 'point-3',
|
||||
'created_at' => now(),
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -21,12 +21,15 @@ class DatabaseSeeder extends Seeder
|
|||
User::factory(10)->create();
|
||||
|
||||
$this->call([
|
||||
ReceptionScreenSeeder::class,
|
||||
DocumentSeeder::class,
|
||||
EducationalInstitutionSeeder::class,
|
||||
FacultySeeder::class,
|
||||
DepartmentSeeder::class,
|
||||
DirectionSeeder::class,
|
||||
]);
|
||||
|
||||
$this->call([
|
||||
AdmissionSeeder::class,
|
||||
DocumentSeeder::class,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,35 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
|
||||
use Illuminate\Database\Seeder;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class ReceptionScreenSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
DB::table('reception_screens')->insert([
|
||||
[
|
||||
'name' => 'Пункт 1 с файлами',
|
||||
'position' => 2,
|
||||
'created_at' => Carbon::now(),
|
||||
],
|
||||
[
|
||||
'name' => 'Пункт 2 с файлами',
|
||||
'position' => 3,
|
||||
'created_at' => Carbon::now(),
|
||||
],
|
||||
[
|
||||
'name' => 'Пункт 3 с файлами',
|
||||
'position' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
import './bootstrap';
|
||||
// import './bootstrap';
|
||||
|
||||
import Alpine from 'alpinejs';
|
||||
import ujs from '@rails/ujs';
|
||||
|
|
|
@ -1,60 +0,0 @@
|
|||
@extends('layouts.admin-layout')
|
||||
@section('content')
|
||||
|
||||
@auth()
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h1 class=""> Изменить пункт Экрана приема</h1>
|
||||
|
||||
{{ Form::open(['url' => route('admin-reception-screen.update', $currentReceptionScreen), 'method' => 'PATCH', 'class' => '']) }}
|
||||
<div class="col">
|
||||
<div>
|
||||
{{ Form::label('position', 'Позиция') }}
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
{{ Form::text('position', $currentReceptionScreen->position, ['class' => 'form-control']) }}
|
||||
</div>
|
||||
<div>
|
||||
@if ($errors->any())
|
||||
{{ $errors->first('position') }}
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div>
|
||||
{{ Form::label('name', 'Название') }}
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
{{ Form::text('name', $currentReceptionScreen->name, ['class' => 'form-control']) }}
|
||||
</div>
|
||||
<div>
|
||||
@if ($errors->any())
|
||||
{{ $errors->first('name') }}
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="mt-4">
|
||||
{{ Form::submit('Изменить', ['class' => 'btn btn-primary']) }}
|
||||
</div>
|
||||
</div>
|
||||
{{ Form::close() }}
|
||||
</div>
|
||||
<div class="col">
|
||||
<table class="table">
|
||||
<thead class="border-b-2 border-solid border-black text-left" style="text-align: left">
|
||||
<tr>
|
||||
<th scope="col">Позиция</th>
|
||||
<th scope="col">Название</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($receptionScreens as $receptionScreen)
|
||||
<tr>
|
||||
<th scope="row">{{ $receptionScreen->position }}</th>
|
||||
<td>{{ $receptionScreen->name }}</td>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
@endauth
|
||||
@endsection
|
|
@ -1,144 +0,0 @@
|
|||
@extends('layouts.admin-layout')
|
||||
@section('content')
|
||||
<style>
|
||||
.accordion-button:not(.collapsed)
|
||||
{
|
||||
color:#006147;
|
||||
background-color: rgb(255, 255, 255);
|
||||
box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)
|
||||
}
|
||||
.accordion-button:focus {
|
||||
z-index: 3;
|
||||
border-color: #006147;
|
||||
outline: 0;
|
||||
box-shadow: 0 0 0 0.25rem #006147;
|
||||
}
|
||||
|
||||
</style>
|
||||
<div class="container">
|
||||
<h2>Экран Приема</h2>
|
||||
<br>
|
||||
<a href="{{ route('admin-reception-screen.create') }}" class="btn btn-primary">Создать пункт Экрана приема</a>
|
||||
<br>
|
||||
<br>
|
||||
<table class="table">
|
||||
<thead class="border-b-2 border-solid border-black text-left" style="text-align: left">
|
||||
<tr>
|
||||
|
||||
<th scope="col">Позиция</th>
|
||||
<th scope="col">Название</th>
|
||||
<th scope="col">действия</th>
|
||||
<th scope="col"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="accordion" id="accordionExample">
|
||||
@foreach($receptionScreens as $receptionScreen)
|
||||
<?php $accordion_tmp = str_replace(' ','', $receptionScreen->name) ?>
|
||||
<tr class="accordion-item ">
|
||||
|
||||
<th scope="row">{{ $receptionScreen->position }}</th>
|
||||
<td>{{ $receptionScreen->name }}</td>
|
||||
<td><a href="{{ route("admin-reception-screen.edit", $receptionScreen) }}" class="btn btn-secondary">редактировать</a>
|
||||
<a rel="nofollow" data-method="delete" data-confirm="Вы действительно хотите удалить?"
|
||||
href="{{ route('admin-reception-screen.destroy', $receptionScreen) }}" class="btn btn-danger">
|
||||
удалить
|
||||
</a>
|
||||
</td>
|
||||
<th class="accordion-header" id="heading<?php echo $accordion_tmp ?>">
|
||||
<button class="accordion-button collapsed btn btn-secondary" type="button" data-bs-toggle="collapse" data-bs-target="#collapse<?php echo $accordion_tmp ?> " aria-expanded="false" aria-controls="collapse<?php echo $accordion_tmp ?>">
|
||||
Показать
|
||||
</button>
|
||||
</th>
|
||||
@if(count($receptionScreen->files) !== 0)
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
<table class="table table-bordered accordion-collapse collapse" id="collapse<?php echo $accordion_tmp ?>" aria-labelledby="heading<?php echo $accordion_tmp ?>" data-bs-parent="#accordionExample">
|
||||
|
||||
<thead class="accordion-body">
|
||||
<tr>
|
||||
<th scope="col">Позиция</th>
|
||||
<th scope="col">Имя Файла</th>
|
||||
<th scope="col">действия</th>
|
||||
|
||||
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
@foreach($receptionScreen->files->sortBy('position') as $file)
|
||||
<tr>
|
||||
<th scope="row">{{ $file->position }}</th>
|
||||
<td>{{ $file->name }}</td>
|
||||
<td><a href="{{ route("files.edit", $file) }}"
|
||||
class="btn btn-secondary">редактировать</a>
|
||||
<a rel="nofollow" data-method="delete"
|
||||
data-confirm="Вы действительно хотите удалить?"
|
||||
href="{{ route('files.destroy', $file) }}"
|
||||
class="btn btn-danger">
|
||||
удалить
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@endforeach
|
||||
<tr class=" border border-white border-bottom-0 border-start-0 border-end-0">
|
||||
<td colspan="3"><div class="mb-2">
|
||||
<a href="{{ route('files_create', $receptionScreen->id) }}"
|
||||
class="btn btn-primary">
|
||||
Добавить файл
|
||||
</a>
|
||||
</div></td>
|
||||
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
|
||||
|
||||
</table>
|
||||
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@else
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
@php($idReceptionScreen = $receptionScreen->id)
|
||||
<a href="{{ route('files_create', $idReceptionScreen) }}" class="btn btn-primary">Добавить
|
||||
файл</a>
|
||||
</td>
|
||||
</tr>
|
||||
@endif
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
<br>
|
||||
<br>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@endsection
|
|
@ -1,11 +1,11 @@
|
|||
@extends('layouts.admin-layout')
|
||||
@extends('layouts.admin_layout')
|
||||
@section('content')
|
||||
|
||||
@auth()
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h1 class=""> Создать пункт Экрана приема</h1>
|
||||
{{ Form::open(['url' => route('admin-reception-screen.store'), 'method' => 'POST', 'class' => '']) }}
|
||||
{{ Form::open(['url' => route('admissions.store'), 'method' => 'POST', 'class' => '']) }}
|
||||
<div class="col">
|
||||
<div>
|
||||
{{ Form::label('position', 'Позиция') }}
|
||||
|
@ -31,6 +31,30 @@
|
|||
@endif
|
||||
</div>
|
||||
|
||||
<div>
|
||||
{{ Form::label('description', 'Описание') }}
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
{{ Form::text('description', '', ['class' => 'form-control']) }}
|
||||
</div>
|
||||
<div>
|
||||
@if ($errors->any())
|
||||
{{ $errors->first('description') }}
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div>
|
||||
{{ Form::label('slug', 'URL') }}
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
{{ Form::text('slug', '', ['class' => 'form-control']) }}
|
||||
</div>
|
||||
<div>
|
||||
@if ($errors->any())
|
||||
{{ $errors->first('description') }}
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="mt-4">
|
||||
{{ Form::submit('создать', ['class' => 'btn btn-primary']) }}
|
||||
</div>
|
||||
|
@ -46,10 +70,10 @@
|
|||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($receptionScreens as $receptionScreen)
|
||||
@foreach($admissions->sortBy('position') as $admission)
|
||||
<tr>
|
||||
<th scope="row">{{ $receptionScreen->position }}</th>
|
||||
<td>{{ $receptionScreen->name }}</td>
|
||||
<th scope="row">{{ $admission->position }}</th>
|
||||
<td>{{ $admission->name }}</td>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
|
@ -0,0 +1,66 @@
|
|||
@extends('layouts.admin_layout')
|
||||
@section('content')
|
||||
|
||||
@auth()
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h1 class=""> Изменить пункт меню Экрана приема</h1>
|
||||
{{ Form::open(['url' => route('admissions.update', $admission), 'method' => 'PATCH', 'class' => '']) }}
|
||||
<div class="col">
|
||||
<div>
|
||||
{{ Form::label('position', 'Позиция') }}
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
{{ Form::text('position', $admission->position, ['class' => 'form-control']) }}
|
||||
</div>
|
||||
<div>
|
||||
@if ($errors->any())
|
||||
{{ $errors->first('position') }}
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div>
|
||||
{{ Form::label('name', 'Название') }}
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
{{ Form::text('name', $admission->name, ['class' => 'form-control']) }}
|
||||
</div>
|
||||
<div>
|
||||
@if ($errors->any())
|
||||
{{ $errors->first('name') }}
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div>
|
||||
{{ Form::label('description', 'Описание') }}
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
{{ Form::text('description', $admission->description, ['class' => 'form-control']) }}
|
||||
</div>
|
||||
<div>
|
||||
@if ($errors->any())
|
||||
{{ $errors->first('description') }}
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div>
|
||||
{{ Form::label('slug', 'URL') }}
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
{{ Form::text('slug', $admission->slug, ['class' => 'form-control']) }}
|
||||
</div>
|
||||
<div>
|
||||
@if ($errors->any())
|
||||
{{ $errors->first('description') }}
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="mt-4">
|
||||
{{ Form::submit('Изменить', ['class' => 'btn btn-primary']) }}
|
||||
</div>
|
||||
</div>
|
||||
{{ Form::close() }}
|
||||
</div>
|
||||
</div>
|
||||
@endauth
|
||||
@endsection
|
|
@ -0,0 +1,109 @@
|
|||
@extends('layouts.admin_layout')
|
||||
@section('content')
|
||||
<div class="container">
|
||||
<h2>Меню экрана приема</h2>
|
||||
<br>
|
||||
<a href="{{ route('admissions.create') }}" class="btn btn-primary">Добавить меню экрана приема</a>
|
||||
<br>
|
||||
<br>
|
||||
<table class="table">
|
||||
<thead class="border-b-2 border-solid border-black text-left" style="text-align: left">
|
||||
<tr>
|
||||
<th scope="col">Позиция</th>
|
||||
<th scope="col">Название</th>
|
||||
<th scope="col">действия</th>
|
||||
<th scope="col"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($admissions as $admission)
|
||||
<tr class="">
|
||||
<th scope="row">{{ $admission->position }}</th>
|
||||
<td><a href="{{ route('admissions.show', $admission) }}">{{ $admission->name }}
|
||||
@if(count($admission->documents) !== 0)
|
||||
-- {{ count($admission->documents) }} файла(ов)
|
||||
@endif</a></td>
|
||||
<td>
|
||||
<a href="{{ route("admissions.edit", $admission) }}"
|
||||
class="btn btn-secondary">редактировать</a>
|
||||
<a rel="nofollow" data-method="delete" data-confirm="Вы действительно хотите удалить?"
|
||||
href="{{ route('admissions.destroy', $admission) }}"
|
||||
class="btn btn-danger">удалить</a>
|
||||
</td>
|
||||
|
||||
@if(count($admission->documents) !== 0)
|
||||
<td>
|
||||
<button class="btn btn-primary" type="button" data-bs-toggle="collapse"
|
||||
data-bs-target="#collapseAdmission{{ $admission->id }}" aria-expanded="false"
|
||||
aria-controls="collapseAdmission{{ $admission->id }}">
|
||||
Свернуть
|
||||
</button>
|
||||
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
<div class="collapse" id="collapseAdmission{{ $admission->id }}">
|
||||
<table class="table table-bordered">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Позиция</th>
|
||||
<th scope="col">Имя Файла</th>
|
||||
<th scope="col">действия</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($admission->documents as $document)
|
||||
<tr>
|
||||
<th scope="row">{{ $document->position }}</th>
|
||||
<td>{{ $document->name }}</td>
|
||||
<td><a href="{{ route("documents.edit", $document) }}"
|
||||
class="btn btn-secondary">редактировать</a>
|
||||
<a rel="nofollow" data-method="delete"
|
||||
data-confirm="Вы действительно хотите удалить?"
|
||||
href="{{ route('documents.destroy', $document) }}"
|
||||
class="btn btn-danger">
|
||||
удалить
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
<tr class=" border border-white border-bottom-0 border-start-0 border-end-0">
|
||||
<td colspan="4">
|
||||
<div class="mb-2">
|
||||
<a href="{{ route('documents_create_with_admission', $admission) }}"
|
||||
class="btn btn-primary">
|
||||
Добавить файл
|
||||
</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@else
|
||||
<td><a class="btn btn-secondary disabled" href=""
|
||||
role="button">
|
||||
Сверунть
|
||||
</a></td>
|
||||
|
||||
<tr>
|
||||
<td colspan="4">
|
||||
<a href="{{ route('documents_create_with_admission', $admission) }}"
|
||||
class="btn btn-primary">Добавить
|
||||
файл</a>
|
||||
</td>
|
||||
</tr>
|
||||
@endif
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
<br>
|
||||
<br>
|
||||
</div>
|
||||
|
||||
@endsection
|
|
@ -0,0 +1,19 @@
|
|||
@extends('layouts.admin_layout')
|
||||
@section('content')
|
||||
@auth()
|
||||
<div class="container mt-4">
|
||||
<h2>Название</h2>
|
||||
<p>{{ $admission->name }}</p>
|
||||
<h2>Описание</h2>
|
||||
<p>{{ $admission->description }}</p>
|
||||
<h2>Позиция</h2>
|
||||
<p>{{ $admission->position }}</p>
|
||||
<h2>URL</h2>
|
||||
<p>{{ $admission->slug }}</p>
|
||||
<h2>Документы</h2>
|
||||
@foreach($admission->documents as $document)
|
||||
<p><a href="{{ route('documents.show', $document) }}">{{ $document->name }}</a></p>
|
||||
@endforeach
|
||||
</div>
|
||||
@endauth
|
||||
@endsection
|
|
@ -1,11 +1,11 @@
|
|||
<?php
|
||||
|
||||
use App\Http\Controllers\admin\AdmissionController;
|
||||
use App\Http\Controllers\admin\Catalog\DepartmentController;
|
||||
use App\Http\Controllers\admin\Catalog\DirectionController;
|
||||
use App\Http\Controllers\admin\Catalog\EducationalInstitutionController;
|
||||
use App\Http\Controllers\admin\Catalog\FacultyController;
|
||||
use App\Http\Controllers\admin\DocumentController;
|
||||
use App\Http\Controllers\admin\ReceptionScreenController;
|
||||
use App\Http\Controllers\admin\UserController;
|
||||
|
||||
Route::middleware(['auth', 'verified'])->prefix('admin')->group(function () {
|
||||
|
@ -13,7 +13,7 @@ Route::middleware(['auth', 'verified'])->prefix('admin')->group(function () {
|
|||
return view('admin');
|
||||
})->name('dashboard');
|
||||
|
||||
Route::get('/documents/create/{document?}', [DocumentController::class, 'create'])->name('documents_create');
|
||||
Route::get('/documents/create/{admission}', [DocumentController::class, 'createFromAdmission'])->name('documents_create_with_admission');
|
||||
Route::get('/documents/download/{Document}', [DocumentController::class, 'download'])->name('documents_download');
|
||||
|
||||
Route::resource('/educational_institutions', EducationalInstitutionController::class)
|
||||
|
@ -25,10 +25,12 @@ Route::middleware(['auth', 'verified'])->prefix('admin')->group(function () {
|
|||
->scoped(['department' => 'slug']);
|
||||
Route::resource('/faculties', FacultyController::class)
|
||||
->scoped(['faculty' => 'slug']);
|
||||
Route::resource('/faculties', FacultyController::class)
|
||||
->scoped(['faculty' => 'slug']);
|
||||
Route::resource('/admissions', AdmissionController::class);
|
||||
|
||||
Route::resources([
|
||||
'/documents' => DocumentController::class,
|
||||
'/users' => UserController::class,
|
||||
'/admin-reception-screen' => ReceptionScreenController::class,
|
||||
]);
|
||||
});
|
||||
|
|
|
@ -1,131 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Models\User;
|
||||
use Tests\TestCase;
|
||||
|
||||
class ReceptionScreenTest extends TestCase
|
||||
{
|
||||
private User $adminUser;
|
||||
private User $noAdminUser;
|
||||
private array $user;
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
$this->user = User::factory()->make()->only([
|
||||
'name',
|
||||
'email',
|
||||
'password'
|
||||
]);
|
||||
$this->adminUser = User::factory()->create([
|
||||
'name' => 'admin',
|
||||
'email' => 'test@example.com',
|
||||
'password' => 123456
|
||||
]);
|
||||
$this->noAdminUser = User::factory()->create([
|
||||
'name' => 'noadmin',
|
||||
'email' => 'notest@example.com',
|
||||
'password' => 'no123456'
|
||||
]);
|
||||
}
|
||||
public function testUsersPage(): void
|
||||
{
|
||||
$response = $this->actingAs($this->adminUser)
|
||||
->withSession(['banned' => false])
|
||||
->get(route('users.index'));
|
||||
|
||||
$response->assertOk();
|
||||
}
|
||||
|
||||
public function testNoAdminNoSeeUsersPage(): void
|
||||
{
|
||||
$response = $this->actingAs($this->noAdminUser)
|
||||
->withSession(['banned' => false])
|
||||
->get(route('users.index'));
|
||||
|
||||
$response->assertStatus(403);
|
||||
}
|
||||
|
||||
public function testCreateUserPage(): void
|
||||
{
|
||||
$response = $this->actingAs($this->adminUser)
|
||||
->withSession(['banned' => false])
|
||||
->get(route('users.create'));
|
||||
|
||||
$response->assertOk();
|
||||
}
|
||||
public function testNoAdminCreateUserPage(): void
|
||||
{
|
||||
$response = $this->actingAs($this->noAdminUser)
|
||||
->withSession(['banned' => false])
|
||||
->get(route('users.create'));
|
||||
|
||||
$response->assertStatus(403);
|
||||
}
|
||||
|
||||
public function testStoreUser(): void
|
||||
{
|
||||
$response = $this->actingAs($this->adminUser)
|
||||
->withSession(['banned' => false])
|
||||
->post(route('users.store', $this->user));
|
||||
|
||||
$response->assertRedirect(route('users.index'));
|
||||
|
||||
$this->assertDatabaseHas('users', $this->user);
|
||||
}
|
||||
|
||||
public function testNoAdminNoStoreUser(): void
|
||||
{
|
||||
$response = $this->actingAs($this->noAdminUser)
|
||||
->withSession(['banned' => false])
|
||||
->post(route('users.store', $this->user));
|
||||
|
||||
$response->assertStatus(403);
|
||||
|
||||
$this->assertDatabaseMissing('users', $this->user);
|
||||
}
|
||||
|
||||
public function testEditUserPage(): void
|
||||
{
|
||||
$response = $this->actingAs($this->adminUser)
|
||||
->withSession(['banned' => false])
|
||||
->get(route('users.edit', $this->adminUser));
|
||||
|
||||
$response->assertOk();
|
||||
}
|
||||
public function testNoAdminEditUserPage(): void
|
||||
{
|
||||
$response = $this->actingAs($this->noAdminUser)
|
||||
->withSession(['banned' => false])
|
||||
->get(route('users.edit', $this->noAdminUser));
|
||||
|
||||
$response->assertStatus(403);
|
||||
}
|
||||
|
||||
public function testUpdateUser(): void
|
||||
{
|
||||
$response = $this->actingAs($this->adminUser)
|
||||
->withSession(['banned' => false])
|
||||
->patch(route('users.update', $this->noAdminUser), $this->user);
|
||||
|
||||
$response->assertRedirect(route('users.index'));
|
||||
|
||||
$dataWithOutHashPassword = $this->user;
|
||||
unset($dataWithOutHashPassword['password']);
|
||||
$this->assertDatabaseHas('users', $dataWithOutHashPassword);
|
||||
}
|
||||
|
||||
public function testNoAdminNoUpdateUser(): void
|
||||
{
|
||||
$response = $this->actingAs($this->noAdminUser)
|
||||
->withSession(['banned' => false])
|
||||
->patch(route('users.update', $this->noAdminUser), $this->user);
|
||||
|
||||
$response->assertStatus(403);
|
||||
|
||||
$noAdminData = $this->noAdminUser->only(['name', 'email', 'password']);
|
||||
$this->assertDatabaseHas('users', $noAdminData);
|
||||
$this->assertDatabaseMissing('users', $this->user);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,101 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature\admin;
|
||||
|
||||
use App\Models\Admission;
|
||||
use App\Models\User;
|
||||
use Tests\TestCase;
|
||||
|
||||
class AdmissionTest extends TestCase
|
||||
{
|
||||
private User $user;
|
||||
private array $data;
|
||||
private Admission $admission;
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
$this->admission = Admission::factory()->create();
|
||||
|
||||
$this->data = Admission::factory()->make()->only([
|
||||
'position',
|
||||
'name',
|
||||
'description',
|
||||
'slug',
|
||||
]);
|
||||
|
||||
$this->user = User::factory()->create([
|
||||
'name' => 'admin',
|
||||
'email' => 'test@example.com',
|
||||
'password' => 123456
|
||||
]);
|
||||
}
|
||||
|
||||
public function testIndexAdmissionsPage(): void
|
||||
{
|
||||
$response = $this->actingAs($this->user)
|
||||
->withSession(['banned' => false])
|
||||
->get(route('admissions.index'));
|
||||
|
||||
$response->assertOk();
|
||||
}
|
||||
|
||||
public function testCreateAdmissionPage(): void
|
||||
{
|
||||
$response = $this->actingAs($this->user)
|
||||
->withSession(['banned' => false])
|
||||
->get(route('admissions.create'));
|
||||
|
||||
$response->assertOk();
|
||||
}
|
||||
|
||||
public function testStoreAdmission(): void
|
||||
{
|
||||
$response = $this->actingAs($this->user)
|
||||
->withSession(['banned' => false])
|
||||
->post(route('admissions.store', $this->data));
|
||||
|
||||
$response->assertRedirect(route('admissions.index'));
|
||||
|
||||
$this->assertDatabaseHas('admissions', $this->data);
|
||||
}
|
||||
|
||||
public function testShowAdmissionPage(): void
|
||||
{
|
||||
$response = $this->actingAs($this->user)
|
||||
->withSession(['banned' => false])
|
||||
->get(route('admissions.show', $this->admission));
|
||||
|
||||
$response->assertOk();
|
||||
}
|
||||
|
||||
public function testEditAdmissionPage(): void
|
||||
{
|
||||
$response = $this->actingAs($this->user)
|
||||
->withSession(['banned' => false])
|
||||
->get(route('admissions.edit', $this->admission));
|
||||
|
||||
$response->assertOk();
|
||||
}
|
||||
|
||||
public function testUpdateAdmission(): void
|
||||
{
|
||||
$response = $this->actingAs($this->user)
|
||||
->withSession(['banned' => false])
|
||||
->patch(route('admissions.update', $this->admission), $this->data);
|
||||
|
||||
$response->assertRedirect(route('admissions.index'));
|
||||
|
||||
$this->assertDatabaseHas('admissions', $this->data);
|
||||
}
|
||||
|
||||
public function testDestroyFaculty(): void
|
||||
{
|
||||
$response = $this->actingAs($this->user)
|
||||
->withSession(['banned' => false])
|
||||
->delete(route('admissions.destroy', $this->admission));
|
||||
|
||||
$response->assertRedirect(route('admissions.index'));
|
||||
|
||||
$this->assertDatabaseMissing('faculties', $this->admission->toArray());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue