first commit
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class AcademicJournalController extends Controller
|
||||
{
|
||||
//
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\ApplicantQuestion\StoreRequest;
|
||||
use App\Http\Resources\ApplicantQuestionResource;
|
||||
use App\Models\ApplicantQuestion;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class ApplicantQuestionController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$applicantQuestions = ApplicantQuestionResource::collection(ApplicantQuestion::query()
|
||||
->when(request()->input('search'), function ($query, $search) {
|
||||
$query->whereRaw("LOWER(first_name || ' ' || last_name) LIKE ?", ["%{$search}%"])
|
||||
->orWhere('email', 'like', "%{$search}%")
|
||||
->orWhere('phone', 'like', "%{$search}%");
|
||||
})
|
||||
->orderBy('id', 'desc')
|
||||
->paginate(request()->input('perPage', 9))
|
||||
->withQueryString());
|
||||
$filters = request()->input('search');
|
||||
|
||||
return Inertia::render('AdminPanel/ApplicantQuestion/Index', compact('applicantQuestions', 'filters'));
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
return Inertia::render('AdminPanel/ApplicantQuestion/Create');
|
||||
}
|
||||
|
||||
public function store(StoreRequest $request)
|
||||
{
|
||||
$data = $request->validated();
|
||||
ApplicantQuestion::create($data);
|
||||
|
||||
return redirect()->route('admin.applicantQuestion.index');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Auth\LoginRequest;
|
||||
use App\Providers\RouteServiceProvider;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
|
||||
class AuthenticatedSessionController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display the login view.
|
||||
*/
|
||||
public function create(): Response
|
||||
{
|
||||
return Inertia::render('Auth/Login', [
|
||||
'canResetPassword' => Route::has('password.request'),
|
||||
'status' => session('status'),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle an incoming authentication request.
|
||||
*/
|
||||
public function store(LoginRequest $request): RedirectResponse
|
||||
{
|
||||
$request->authenticate();
|
||||
|
||||
$request->session()->regenerate();
|
||||
|
||||
return redirect()->intended(RouteServiceProvider::HOME);
|
||||
}
|
||||
|
||||
/**
|
||||
* Destroy an authenticated session.
|
||||
*/
|
||||
public function destroy(Request $request): RedirectResponse
|
||||
{
|
||||
Auth::guard('web')->logout();
|
||||
|
||||
$request->session()->invalidate();
|
||||
|
||||
$request->session()->regenerateToken();
|
||||
|
||||
return redirect('/');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Providers\RouteServiceProvider;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
|
||||
class ConfirmablePasswordController extends Controller
|
||||
{
|
||||
/**
|
||||
* Show the confirm password view.
|
||||
*/
|
||||
public function show(): Response
|
||||
{
|
||||
return Inertia::render('Auth/ConfirmPassword');
|
||||
}
|
||||
|
||||
/**
|
||||
* Confirm the user's password.
|
||||
*/
|
||||
public function store(Request $request): RedirectResponse
|
||||
{
|
||||
if (! Auth::guard('web')->validate([
|
||||
'email' => $request->user()->email,
|
||||
'password' => $request->password,
|
||||
])) {
|
||||
throw ValidationException::withMessages([
|
||||
'password' => __('auth.password'),
|
||||
]);
|
||||
}
|
||||
|
||||
$request->session()->put('auth.password_confirmed_at', time());
|
||||
|
||||
return redirect()->intended(RouteServiceProvider::HOME);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Providers\RouteServiceProvider;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class EmailVerificationNotificationController extends Controller
|
||||
{
|
||||
/**
|
||||
* Send a new email verification notification.
|
||||
*/
|
||||
public function store(Request $request): RedirectResponse
|
||||
{
|
||||
if ($request->user()->hasVerifiedEmail()) {
|
||||
return redirect()->intended(RouteServiceProvider::HOME);
|
||||
}
|
||||
|
||||
$request->user()->sendEmailVerificationNotification();
|
||||
|
||||
return back()->with('status', 'verification-link-sent');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Providers\RouteServiceProvider;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
|
||||
class EmailVerificationPromptController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display the email verification prompt.
|
||||
*/
|
||||
public function __invoke(Request $request): RedirectResponse|Response
|
||||
{
|
||||
return $request->user()->hasVerifiedEmail()
|
||||
? redirect()->intended(RouteServiceProvider::HOME)
|
||||
: Inertia::render('Auth/VerifyEmail', ['status' => session('status')]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Auth\Events\PasswordReset;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Password;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Validation\Rules;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
|
||||
class NewPasswordController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display the password reset view.
|
||||
*/
|
||||
public function create(Request $request): Response
|
||||
{
|
||||
return Inertia::render('Auth/ResetPassword', [
|
||||
'email' => $request->email,
|
||||
'token' => $request->route('token'),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle an incoming new password request.
|
||||
*
|
||||
* @throws \Illuminate\Validation\ValidationException
|
||||
*/
|
||||
public function store(Request $request): RedirectResponse
|
||||
{
|
||||
$request->validate([
|
||||
'token' => 'required',
|
||||
'email' => 'required|email',
|
||||
'password' => ['required', 'confirmed', Rules\Password::defaults()],
|
||||
]);
|
||||
|
||||
// Here we will attempt to reset the user's password. If it is successful we
|
||||
// will update the password on an actual user model and persist it to the
|
||||
// database. Otherwise we will parse the error and return the response.
|
||||
$status = Password::reset(
|
||||
$request->only('email', 'password', 'password_confirmation', 'token'),
|
||||
function ($user) use ($request) {
|
||||
$user->forceFill([
|
||||
'password' => Hash::make($request->password),
|
||||
'remember_token' => Str::random(60),
|
||||
])->save();
|
||||
|
||||
event(new PasswordReset($user));
|
||||
}
|
||||
);
|
||||
|
||||
// If the password was successfully reset, we will redirect the user back to
|
||||
// the application's home authenticated view. If there is an error we can
|
||||
// redirect them back to where they came from with their error message.
|
||||
if ($status == Password::PASSWORD_RESET) {
|
||||
return redirect()->route('login')->with('status', __($status));
|
||||
}
|
||||
|
||||
throw ValidationException::withMessages([
|
||||
'email' => [trans($status)],
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Validation\Rules\Password;
|
||||
|
||||
class PasswordController extends Controller
|
||||
{
|
||||
/**
|
||||
* Update the user's password.
|
||||
*/
|
||||
public function update(Request $request): RedirectResponse
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'current_password' => ['required', 'current_password'],
|
||||
'password' => ['required', Password::defaults(), 'confirmed'],
|
||||
]);
|
||||
|
||||
$request->user()->update([
|
||||
'password' => Hash::make($validated['password']),
|
||||
]);
|
||||
|
||||
return back();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Password;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
|
||||
class PasswordResetLinkController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display the password reset link request view.
|
||||
*/
|
||||
public function create(): Response
|
||||
{
|
||||
return Inertia::render('Auth/ForgotPassword', [
|
||||
'status' => session('status'),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle an incoming password reset link request.
|
||||
*
|
||||
* @throws \Illuminate\Validation\ValidationException
|
||||
*/
|
||||
public function store(Request $request): RedirectResponse
|
||||
{
|
||||
$request->validate([
|
||||
'email' => 'required|email',
|
||||
]);
|
||||
|
||||
// We will send the password reset link to this user. Once we have attempted
|
||||
// to send the link, we will examine the response then see the message we
|
||||
// need to show to the user. Finally, we'll send out a proper response.
|
||||
$status = Password::sendResetLink(
|
||||
$request->only('email')
|
||||
);
|
||||
|
||||
if ($status == Password::RESET_LINK_SENT) {
|
||||
return back()->with('status', __($status));
|
||||
}
|
||||
|
||||
throw ValidationException::withMessages([
|
||||
'email' => [trans($status)],
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\User;
|
||||
use App\Providers\RouteServiceProvider;
|
||||
use Illuminate\Auth\Events\Registered;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Validation\Rules;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
|
||||
class RegisteredUserController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display the registration view.
|
||||
*/
|
||||
public function create(): Response
|
||||
{
|
||||
return Inertia::render('Auth/Register');
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle an incoming registration request.
|
||||
*
|
||||
* @throws \Illuminate\Validation\ValidationException
|
||||
*/
|
||||
public function store(Request $request): RedirectResponse
|
||||
{
|
||||
$request->validate([
|
||||
'name' => 'required|string|max:255',
|
||||
'email' => 'required|string|email|max:255|unique:'.User::class,
|
||||
'password' => ['required', 'confirmed', Rules\Password::defaults()],
|
||||
]);
|
||||
|
||||
$user = User::create([
|
||||
'name' => $request->name,
|
||||
'email' => $request->email,
|
||||
'password' => Hash::make($request->password),
|
||||
]);
|
||||
|
||||
event(new Registered($user));
|
||||
|
||||
Auth::login($user);
|
||||
|
||||
return redirect('/');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Providers\RouteServiceProvider;
|
||||
use Illuminate\Auth\Events\Verified;
|
||||
use Illuminate\Foundation\Auth\EmailVerificationRequest;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
|
||||
class VerifyEmailController extends Controller
|
||||
{
|
||||
/**
|
||||
* Mark the authenticated user's email address as verified.
|
||||
*/
|
||||
public function __invoke(EmailVerificationRequest $request): RedirectResponse
|
||||
{
|
||||
if ($request->user()->hasVerifiedEmail()) {
|
||||
return redirect()->intended(RouteServiceProvider::HOME.'?verified=1');
|
||||
}
|
||||
|
||||
if ($request->user()->markEmailAsVerified()) {
|
||||
event(new Verified($request->user()));
|
||||
}
|
||||
|
||||
return redirect()->intended(RouteServiceProvider::HOME.'?verified=1');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\CategoryResource;
|
||||
use App\Http\Resources\PostResource;
|
||||
use App\Models\AuthorPost;
|
||||
use App\Models\Category;
|
||||
use App\Models\Post;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class CategoryController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$categories = CategoryResource::collection(Category::query()
|
||||
->when(request()->input('search'), function ($query, $search) {
|
||||
$query->where('title', 'like', "%{$search}%")
|
||||
->orWhere('title', 'like', "%{$search}%");
|
||||
})
|
||||
->orderBy('id', 'desc')
|
||||
->paginate(request()->input('perPage', 9))
|
||||
->withQueryString());
|
||||
$filters = [
|
||||
'search' => request()->input('search'),
|
||||
];
|
||||
return Inertia::render('AdminPanel/Categories/Index', compact('categories', 'filters'));
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
return Inertia::render('AdminPanel/Categories/Create');
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'title' => 'required|unique:categories|max:50|min:5',
|
||||
]);
|
||||
Category::create($data);
|
||||
return redirect()->route('admin.category.index');
|
||||
}
|
||||
|
||||
public function edit(Category $category)
|
||||
{
|
||||
return Inertia::render('AdminPanel/Categories/Edit', compact('category'));
|
||||
}
|
||||
|
||||
public function update(Category $category, Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'title' => 'required|unique:categories|max:50|min:5',
|
||||
]);
|
||||
$category->update($data);
|
||||
return redirect()->route('admin.category.index');
|
||||
}
|
||||
|
||||
public function destroy(string $id)
|
||||
{
|
||||
$category = Category::find($id);
|
||||
$category->delete();
|
||||
|
||||
return redirect()->route('admin.category.index');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\ClientAcademicJournalListResource;
|
||||
use App\Http\Resources\ClientVirtualExhibitionListResource;
|
||||
use App\Models\AcademicJournal;
|
||||
use App\Models\JournalIssue;
|
||||
use App\Models\VirtualExhibition;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class ClientAcademicJournalController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$journals = ClientAcademicJournalListResource::collection(AcademicJournal::query()->get());
|
||||
|
||||
return Inertia::render('Client/AcademicJournals/Index', compact('journals'));
|
||||
}
|
||||
|
||||
public function show(string $slug)
|
||||
{
|
||||
$journal = new ClientAcademicJournalListResource(AcademicJournal::query()->where('slug', '=', $slug)->firstOrFail());
|
||||
$journalIssues = JournalIssue::all()
|
||||
->groupBy('year_publication');
|
||||
|
||||
$journals = [];
|
||||
$years = JournalIssue::select('year_publication')->distinct()->get();
|
||||
|
||||
foreach ($journalIssues as $year => $journalGroup) {
|
||||
$journals[] = [
|
||||
'year_publication' => $year,
|
||||
'journalIssues' => $journalGroup
|
||||
];
|
||||
}
|
||||
return Inertia::render('Client/AcademicJournals/Show', compact('journal', 'journals'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\AdditionalEducationCategoryResource;
|
||||
use App\Http\Resources\AdditionalEducationResource;
|
||||
use App\Http\Resources\DirectionAdditionalEducationResource;
|
||||
use App\Models\AdditionalEducation;
|
||||
use App\Models\AdditionalEducationCategory;
|
||||
use App\Models\DirectionAdditionalEducation;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class ClientAdditionalEducationController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$directionAdditionalEducations = DirectionAdditionalEducationResource::collection(
|
||||
DirectionAdditionalEducation::query()
|
||||
->where('is_active', true)
|
||||
->whereHas('additionalEducationCategories', function ($q) {
|
||||
$q->whereHas('additionalEducations');
|
||||
})
|
||||
->get());
|
||||
$additionalEducations = AdditionalEducationCategoryResource::collection(AdditionalEducationCategory::query()
|
||||
->where('is_active', '=', true)
|
||||
->when($request->input('dir_id'), function ($q, $direction_id) {
|
||||
$q->where('dir_addit_educat_id', $direction_id);
|
||||
})
|
||||
->has('additionalEducations')
|
||||
->with('additionalEducations')
|
||||
->get());
|
||||
$filters = [
|
||||
'dir_id' => request()->input('dir_id')
|
||||
];
|
||||
return Inertia::render('Client/Additional-educations/Index', compact('directionAdditionalEducations', 'additionalEducations', 'filters'));
|
||||
}
|
||||
|
||||
public function show(string $id)
|
||||
{
|
||||
$additionalEducation = new AdditionalEducationResource(AdditionalEducation::query()->with('category.direction')->find($id));
|
||||
return Inertia::render('Client/Additional-educations/Show', compact('additionalEducation'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\ClientDepartmentPreviewResource;
|
||||
use App\Http\Resources\DepartmentResource;
|
||||
use App\Models\Department;
|
||||
use App\Models\Faculty;
|
||||
use Illuminate\Database\Eloquent\Collection;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class ClientDepartmentController extends Controller
|
||||
{
|
||||
public function show(string $facultySlug, string $departmentSlug)
|
||||
{
|
||||
$faculty = Faculty::query()->where('slug', $facultySlug)->first();
|
||||
$departments = ClientDepartmentPreviewResource::collection(
|
||||
Department::query()
|
||||
->where('is_active', true)
|
||||
->where('faculty_id', $faculty->id)
|
||||
->get()
|
||||
);
|
||||
$department = new DepartmentResource(Department::query()
|
||||
->where('slug', $departmentSlug)
|
||||
->where('is_active', true)
|
||||
->with(['faculty', 'workers.userDetail', 'teachers.userDetail', 'programs.directionStudy'])
|
||||
->first());
|
||||
$directions = $this->groupProgramsByDirection($department->programs);
|
||||
return Inertia::render('Client/Departments/Show', compact('department', 'departments', 'directions'));
|
||||
}
|
||||
|
||||
|
||||
private function groupProgramsByDirection(Collection $programs)
|
||||
{
|
||||
// Группируем программы по имени направления
|
||||
$grouped = $programs->groupBy(function ($program) {
|
||||
return $program->directionStudy->code . " " . $program->directionStudy->name; // Используем имя направления как ключ
|
||||
});
|
||||
return $grouped;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\DivisionResource;
|
||||
use App\Models\Division;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class ClientDivisionController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$divisions = DivisionResource::collection(Division::query()->where('is_active', true)->get());
|
||||
return Inertia::render('Client/Divisions/Index', compact('divisions'));
|
||||
}
|
||||
|
||||
public function show(string $slug)
|
||||
{
|
||||
$divisions = DivisionResource::collection(Division::query()->where('is_active', true)->get());
|
||||
$division = new DivisionResource(Division::with('workers.userDetail')->where('is_active', true)->where('slug', $slug)->first());
|
||||
return Inertia::render('Client/Divisions/Show', compact('divisions', 'division'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,200 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\ClientEventCategoryResource;
|
||||
use App\Http\Resources\ClientEventFullResource;
|
||||
use App\Http\Resources\ClientEventResource;
|
||||
use App\Http\Resources\ClientNavigationResource;
|
||||
use App\Models\Event;
|
||||
use App\Models\EventCategory;
|
||||
use Carbon\Carbon;
|
||||
use DateTime;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class ClientEventController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$currentDate = $this->getCurrentDate($request);
|
||||
$filters = $this->getFilters();
|
||||
$eventDates = $this->getEventDates($filters); // Передаем фильтры
|
||||
|
||||
$events = $this->getEvents($currentDate);
|
||||
$categories = ClientEventCategoryResource::collection(EventCategory::has('events')->get());
|
||||
|
||||
return Inertia::render('Client/Events/Index', compact('eventDates', 'events', 'currentDate', 'filters', 'categories'));
|
||||
}
|
||||
|
||||
public function show(string $slug)
|
||||
{
|
||||
$event = new ClientEventFullResource(Event::where('slug', '=', $slug)->with('category')->first());
|
||||
return Inertia::render('Client/Events/Show', compact('event'));
|
||||
}
|
||||
|
||||
private function getCurrentDate(Request $request): array
|
||||
{
|
||||
$dateInput = $request->input('date');
|
||||
|
||||
// Если дата введена, создаем объект Carbon, иначе получаем ближайшую дату события
|
||||
if ($dateInput) {
|
||||
$date = new Carbon($dateInput);
|
||||
} else {
|
||||
$nearestEvent = Event::whereDate('event_date_start', '>=', now())
|
||||
->orderBy('event_date_start', 'asc')
|
||||
->first();
|
||||
|
||||
// Проверяем, найдено ли событие
|
||||
if ($nearestEvent) {
|
||||
$date = new Carbon($nearestEvent->event_date_start);
|
||||
} else {
|
||||
// Если событий нет, устанавливаем текущую дату
|
||||
$date = Carbon::now();
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
'fullDate' => $date->format('Y-m-j'),
|
||||
'day' => $date->format('j'),
|
||||
'month' => $date->getTranslatedMonthName('Do MMMM'),
|
||||
];
|
||||
}
|
||||
|
||||
private function getEvents(array $currentDate)
|
||||
{
|
||||
return ClientEventResource::collection(Event::select('title', 'slug', 'event_date_start', 'event_time_start', 'address', 'is_online', 'category_id')
|
||||
->whereDate('event_date_start', '=', $currentDate['fullDate'])
|
||||
->with('category')
|
||||
->when(request()->input('is_online'), function ($query, $value) {
|
||||
$this->applyOnlineFilter($query, $value);
|
||||
})
|
||||
->when(request()->input('category'), function ($query) {
|
||||
$slugs = request()->input('category');
|
||||
if (is_array($slugs)) {
|
||||
$query->whereHas('category', function ($query) use ($slugs) {
|
||||
$query->whereIn('slug', $slugs);
|
||||
});
|
||||
}
|
||||
})
|
||||
->orderBy('event_time_start', 'asc')
|
||||
->get());
|
||||
}
|
||||
|
||||
private function getEventDates(array $filters): \Illuminate\Support\Collection
|
||||
{
|
||||
// Получаем события с учетом фильтров
|
||||
$events = Event::select('event_date_start')
|
||||
->distinct()
|
||||
->where('event_date_start', '>=', date('Y-m-d'))
|
||||
->when($filters['is_online_filter']['value'], function ($query, $value) {
|
||||
if ($value === 'online') {
|
||||
$query->where('is_online', true);
|
||||
} elseif ($value === 'offline') {
|
||||
$query->where('is_online', false);
|
||||
}
|
||||
})
|
||||
->when($filters['category_filter']['value'], function ($query) {
|
||||
$slugs = request()->input('category');
|
||||
if (is_array($slugs)) {
|
||||
$query->whereHas('category', function ($query) use ($slugs) {
|
||||
$query->whereIn('slug', $slugs);
|
||||
});
|
||||
}
|
||||
})
|
||||
->orderBy('event_date_start')
|
||||
->get();
|
||||
|
||||
// Извлекаем уникальные даты из событий
|
||||
return $events->map(function ($event) {
|
||||
$date = new DateTime($event->event_date_start);
|
||||
return [
|
||||
'day' => $date->format('j'),
|
||||
'dayOfWeek' => $this->getDayOfWeekRussian($date->format('l')),
|
||||
'date' => $date->format('Y-m-j')
|
||||
];
|
||||
})
|
||||
->groupBy(function ($item) {
|
||||
return (new DateTime($item['date']))->format('m');
|
||||
})
|
||||
->map(function ($group, $month) {
|
||||
return [
|
||||
'month' => $this->getMonthNameRussian((int)$month),
|
||||
'events' => $group->toArray()
|
||||
];
|
||||
});
|
||||
}
|
||||
|
||||
private function getFilters(): array
|
||||
{
|
||||
$categoriesContent = [];
|
||||
if (request()->input('category')) {
|
||||
foreach (request()->input('category') as $item) {
|
||||
$categoriesContent[$item] = new ClientEventCategoryResource(EventCategory::where('slug', $item)->first());
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
'category_filter' => [
|
||||
'type' => 'category',
|
||||
'value' => request()->input('category'),
|
||||
'param' => 'category',
|
||||
'content' => $categoriesContent,
|
||||
],
|
||||
'sortingBy_filter' => [
|
||||
'type' => 'sort',
|
||||
'value' => request()->input('sort'),
|
||||
'param' => 'sort',
|
||||
],
|
||||
'is_online_filter' => [
|
||||
'type' => 'is_online',
|
||||
'value' => request()->input('is_online'),
|
||||
'param' => 'is_online',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
private function getDayOfWeekRussian(string $dayOfWeek): string
|
||||
{
|
||||
$russianDays = [
|
||||
'Monday' => 'пн',
|
||||
'Tuesday' => 'вт',
|
||||
'Wednesday' => 'ср',
|
||||
'Thursday' => 'чт',
|
||||
'Friday' => 'пт',
|
||||
'Saturday' => 'сб',
|
||||
'Sunday' => 'вс'
|
||||
];
|
||||
|
||||
return $russianDays[$dayOfWeek] ?? '';
|
||||
}
|
||||
|
||||
private function getMonthNameRussian(int $month): string
|
||||
{
|
||||
$russianMonths = [
|
||||
1 => 'Январь',
|
||||
2 => 'Февраль',
|
||||
3 => 'Март',
|
||||
4 => 'Апрель',
|
||||
5 => 'Май',
|
||||
6 => 'Июнь',
|
||||
7 => 'Июль',
|
||||
8 => 'Август',
|
||||
9 => 'Сентябрь',
|
||||
10 => 'Октябрь',
|
||||
11 => 'Ноябрь',
|
||||
12 => 'Декабрь'
|
||||
];
|
||||
|
||||
return $russianMonths[$month] ?? '';
|
||||
}
|
||||
|
||||
private function applyOnlineFilter($query, $isOnline)
|
||||
{
|
||||
if ($isOnline === 'online') {
|
||||
$query->where('is_online', true);
|
||||
} elseif ($isOnline === 'offline') {
|
||||
$query->where('is_online', false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ClientExternalVacancyController extends Controller
|
||||
{
|
||||
//
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\FacultyResource;
|
||||
use App\Http\Resources\FullFacultyResource;
|
||||
use App\Models\Faculty;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class ClientFacultyController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$faculties = FacultyResource::collection(Faculty::query()->where('is_active', true)->get());
|
||||
return Inertia::render('Client/Faculties/Index', compact('faculties'));
|
||||
}
|
||||
|
||||
public function show(string $slug)
|
||||
{
|
||||
$faculties = FacultyResource::collection(Faculty::query()->where('is_active', true)->get());
|
||||
$faculty = new FullFacultyResource(Faculty::where('slug', $slug)->where('is_active', true)->with(['departments.faculty', 'workers.userDetail'])->first());
|
||||
return Inertia::render('Client/Faculties/Show', compact('faculty', 'faculties'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\ClientLibraryPostListResource;
|
||||
use App\Models\LibraryNews;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class ClientLibraryNewsController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$posts = ClientLibraryPostListResource::collection(LibraryNews::query()
|
||||
->where('is_active', true)
|
||||
->orderBy('id', 'desc')
|
||||
->paginate(6));
|
||||
return Inertia::render('Client/Library-news/Index', compact('posts'));
|
||||
}
|
||||
|
||||
public function show(string $id)
|
||||
{
|
||||
$post = new ClientLibraryPostListResource(LibraryNews::query()->find($id));
|
||||
return Inertia::render('Client/Library-news/Show', compact('post'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\CategoryResource;
|
||||
use App\Http\Resources\ClientNavigationResource;
|
||||
use App\Http\Resources\ClientPostListResource;
|
||||
use App\Http\Resources\ClientTagResource;
|
||||
use App\Http\Resources\MainSectionResource;
|
||||
use App\Http\Resources\PostResource;
|
||||
use App\Models\Category;
|
||||
use App\Models\MainSection;
|
||||
use App\Models\Post;
|
||||
use App\Models\Tag;
|
||||
use Doctrine\DBAL\Schema\Column;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class ClientPostController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$tagIds = DB::table('taggables')
|
||||
->distinct()
|
||||
->select('tag_id')
|
||||
->where('taggable_type', Post::class)
|
||||
->get()
|
||||
->pluck('tag_id');
|
||||
|
||||
$tags = \Spatie\Tags\Tag::whereIn('id', $tagIds)->get();
|
||||
$posts = ClientPostListResource::collection(Post::query()
|
||||
->with('category')
|
||||
->select('title', 'slug', 'authors', 'category_id', 'preview', 'search_data', 'created_at')
|
||||
->where('status', '=', 'published')
|
||||
->when(request()->input('search'), function ($query, $search) {
|
||||
$query->whereRaw('LOWER(title) like ?', ["%".strtolower($search)."%"]);
|
||||
})
|
||||
->when(request()->input('category'), function ($query) {
|
||||
$slugs = request()->input('category');
|
||||
if (is_array($slugs)) {
|
||||
$query->whereHas('category', function ($query) use ($slugs) {
|
||||
$query->whereIn('slug', $slugs);
|
||||
});
|
||||
}
|
||||
})
|
||||
->when(request()->input('tag'), function ($query, $slugs) {
|
||||
if (is_array($slugs)) {
|
||||
return $query->withAnyTags($slugs);
|
||||
}
|
||||
|
||||
$slugsArray = explode(',', $slugs);
|
||||
return $query->withAnyTags($slugsArray);
|
||||
})
|
||||
->orderBy('id', request()->input('sort', 'desc'))
|
||||
->paginate(6)
|
||||
->withQueryString());
|
||||
|
||||
$categories = CategoryResource::collection(Category::has('posts')->get());
|
||||
$categoriesContent = [];
|
||||
if (request()->input('category')) {
|
||||
foreach (request()->input('category') as $item) {
|
||||
$categoriesContent[$item] = new CategoryResource(Category::where('slug', $item)->first());
|
||||
}
|
||||
}
|
||||
|
||||
$tagsContent = [];
|
||||
if (request()->input('tag')) {
|
||||
foreach (request()->input('tag') as $item) {
|
||||
$tagsContent[$item] = new ClientTagResource(DB::table('tags')
|
||||
->where(DB::raw("JSON_UNQUOTE(JSON_EXTRACT(slug, '$.ru'))"), $item)
|
||||
->first());
|
||||
}
|
||||
}
|
||||
|
||||
$filters = [
|
||||
'search_filter' => [
|
||||
'type' => 'search',
|
||||
'value' => request()->input('search'),
|
||||
'param' => 'search'
|
||||
],
|
||||
'category_filter' => [
|
||||
'type' => 'category',
|
||||
'value' => request()->input('category'),
|
||||
'param' => 'category',
|
||||
'content' => $categoriesContent,
|
||||
],
|
||||
'tag_filter' => [
|
||||
'type' => 'tag',
|
||||
'value' => request()->input('tag'),
|
||||
'param' => 'tag',
|
||||
'content' => $tagsContent
|
||||
],
|
||||
'sortingBy_filter' => [
|
||||
'type' => 'sort',
|
||||
'value' => request()->input('sort'),
|
||||
'param' => 'sort',
|
||||
],
|
||||
];
|
||||
|
||||
return Inertia::render('Client/Posts/Index', compact('filters', 'posts', 'categories', 'tags'));
|
||||
}
|
||||
public function show($slug)
|
||||
{
|
||||
$post = new PostResource(Post::where('slug', $slug)->firstOrFail());
|
||||
return Inertia::render('Client/Posts/Show', compact('post'));
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,196 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Enums\BudgetEducation;
|
||||
use App\Enums\FormEducation;
|
||||
use App\Enums\LevelEducational;
|
||||
use App\Http\Resources\CampaignDegreeResource;
|
||||
use App\Http\Resources\ClientNavigationResource;
|
||||
use App\Http\Resources\DirectionStudyResource;
|
||||
use App\Http\Resources\EducationalProgramFullResource;
|
||||
use App\Http\Resources\MainSectionResource;
|
||||
use App\Models\AdmissionCampaign;
|
||||
use App\Models\AdmissionPlan;
|
||||
use App\Models\CampaignDegree;
|
||||
use App\Models\DirectionStudy;
|
||||
use App\Models\EducationalProgram;
|
||||
use App\Models\MainSection;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class ClientProgramController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$activeCampaign = AdmissionCampaign::query()->where('status', 1)->first();
|
||||
|
||||
$uniqueValues = EducationalProgram::distinct()->pluck('lvl_edu');
|
||||
$levelsEducational = $uniqueValues->mapWithKeys(function ($level) {
|
||||
return [$level->name => $level->getLabel()];
|
||||
});
|
||||
|
||||
$direction_studies = DirectionStudy::query()
|
||||
->withAdmissionCampaignByYear($activeCampaign->academic_year)
|
||||
->withActivePrograms()
|
||||
->get();
|
||||
|
||||
$level = request()->input('level');
|
||||
$form = request()->input('form');
|
||||
$budget = request()->input('budget');
|
||||
|
||||
$naprs = DirectionStudyResource::collection(
|
||||
DirectionStudy::query()
|
||||
->withAdmissionCampaignByYear($activeCampaign->academic_year)
|
||||
->withActivePrograms()
|
||||
->when($level, function ($query) use ($level) {
|
||||
$query->where('lvl_edu', LevelEducational::fromName($level)->value);
|
||||
})
|
||||
->when($form, function ($query) use ($form) {
|
||||
$this->applyFormFilter($query, $form);
|
||||
})
|
||||
->when($budget, function ($query) use ($budget) {
|
||||
$this->applyBudgetFilter($query, $budget);
|
||||
})
|
||||
->when(request()->input('direction'), function ($query) {
|
||||
$slugs = request()->input('direction');
|
||||
if (is_array($slugs)) {
|
||||
$query->whereIn('slug', $slugs);
|
||||
}
|
||||
})
|
||||
->get()
|
||||
);
|
||||
|
||||
|
||||
$campaignName = $this->getAdmissionCampaignName();
|
||||
$formsEducational = FormEducation::cases();
|
||||
$formsEducational = collect($formsEducational);
|
||||
$formsEdu = $formsEducational->mapWithKeys(function ($formEducational) {
|
||||
return [$formEducational->name => $formEducational->getLabel()];
|
||||
});
|
||||
$typesBudget = BudgetEducation::cases();
|
||||
$typesBudget = collect($typesBudget);
|
||||
$budgetEdu = $typesBudget->mapWithKeys(function ($typeBudget) {
|
||||
return [$typeBudget->name => $typeBudget->getLabel()];
|
||||
});
|
||||
|
||||
$filters = [
|
||||
'level_filter' => [
|
||||
'type' => 'level',
|
||||
'value' => request()->input('level'),
|
||||
'param' => 'level'
|
||||
],
|
||||
'budget_filter' => [
|
||||
'type' => 'budget',
|
||||
'value' => request()->input('budget'),
|
||||
'param' => 'budget'
|
||||
],
|
||||
'formEdu_filter' => [
|
||||
'type' => 'form',
|
||||
'value' => request()->input('form'),
|
||||
'param' => 'form'
|
||||
],
|
||||
'direction_filter' => [
|
||||
'type' => 'direction',
|
||||
'value' => request()->input('direction'),
|
||||
'param' => 'direction'
|
||||
],
|
||||
];
|
||||
|
||||
return Inertia::render('Client/Programs/Index',
|
||||
compact(
|
||||
'naprs',
|
||||
'campaignName',
|
||||
'levelsEducational',
|
||||
'filters',
|
||||
'formsEdu',
|
||||
'budgetEdu',
|
||||
'direction_studies'
|
||||
));
|
||||
}
|
||||
|
||||
public function show($id)
|
||||
{
|
||||
$program = new EducationalProgramFullResource(EducationalProgram::query()->where('id', $id)->with(['admission_plans', 'directionStudy'])->first());
|
||||
$formsEducational = BudgetEducation::cases();
|
||||
$formsEducational = collect($formsEducational);
|
||||
$formsEdu = $formsEducational->mapWithKeys(function ($formEducational) {
|
||||
return [$formEducational->value => $formEducational->getLabel()];
|
||||
});
|
||||
return Inertia::render('Client/Programs/Show', compact('program', 'formsEdu'));
|
||||
}
|
||||
|
||||
private function getAdmissionCampaignName() : string
|
||||
{
|
||||
$campaign = AdmissionCampaign::query()->where('status', 1)->first();
|
||||
return $campaign->name;
|
||||
}
|
||||
|
||||
|
||||
private function applyFormFilter($query, $form)
|
||||
{
|
||||
$formValue = Str::of(FormEducation::fromName($form)->value)->toString();
|
||||
|
||||
$query->whereHas('programs.admission_plans', function ($query) use ($formValue) {
|
||||
$query->whereJsonContains('contests', ['form_education' => $formValue]);
|
||||
})
|
||||
->with(['programs' => function ($query) use ($formValue) {
|
||||
$query->whereHas('admission_plans', function ($q) use ($formValue) {
|
||||
$q->whereJsonContains('contests', ['form_education' => $formValue]);
|
||||
});
|
||||
}]);
|
||||
}
|
||||
|
||||
private function applyBudgetFilter($query, $budget)
|
||||
{
|
||||
$budgetValue = Str::of(BudgetEducation::fromName($budget)->value)->toString();
|
||||
|
||||
$query->whereHas('programs.admission_plans', function ($query) use ($budgetValue) {
|
||||
$query->whereJsonContains('contests', [['places' => ['form_budget' => $budgetValue]]]);
|
||||
})
|
||||
->with(['programs' => function ($query) use ($budgetValue) {
|
||||
$query->whereHas('admission_plans', function ($query) use ($budgetValue) {
|
||||
$query->whereJsonContains('contests', [['places' => ['form_budget' => $budgetValue]]]);
|
||||
});
|
||||
}]);
|
||||
}
|
||||
// public function bakalavriat()
|
||||
// {
|
||||
// $naprs = DirectionStudyResource::collection(
|
||||
// DirectionStudy::forBachelorLevel()
|
||||
// ->withActiveAdmissionCampaign()
|
||||
// ->withActivePrograms()
|
||||
// ->get()
|
||||
// );
|
||||
// $campaignName = $this->getAdmissionCampaignName();
|
||||
// return Inertia::render('Client/Programs/Index', compact('naprs', 'campaignName'));
|
||||
// }
|
||||
//
|
||||
// public function spo()
|
||||
// {
|
||||
// $naprs = DirectionStudyResource::collection(
|
||||
// DirectionStudy::forMiddleLevel()
|
||||
// ->withActiveAdmissionCampaign()
|
||||
// ->withActivePrograms()
|
||||
// ->get()
|
||||
// );
|
||||
// $campaignName = $this->getAdmissionCampaignName();
|
||||
// return Inertia::render('Client/Programs/Index', compact('naprs', 'campaignName'));
|
||||
//
|
||||
// }
|
||||
//
|
||||
// public function magistratura()
|
||||
// {
|
||||
// $naprs = DirectionStudyResource::collection(
|
||||
// DirectionStudy::forMasterLevel()
|
||||
// ->withActiveAdmissionCampaign()
|
||||
// ->withActivePrograms()
|
||||
// ->get()
|
||||
// );
|
||||
// $campaignName = $this->getAdmissionCampaignName();
|
||||
// return Inertia::render('Client/Programs/Index', compact('naprs', 'campaignName'));
|
||||
//
|
||||
// }
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\ClientEducationalGroupResource;
|
||||
use App\Http\Resources\ScheduleResource;
|
||||
use App\Models\EducationalGroup;
|
||||
use App\Models\Faculty;
|
||||
use App\Models\Schedule;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class ClientScheduleController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$educationalGroups = collect();
|
||||
|
||||
if (request()->filled('search')) {
|
||||
$educationalGroups = ClientEducationalGroupResource::collection(EducationalGroup::query()
|
||||
->has('schedules')
|
||||
->whereHas('schedules', function ($q) {
|
||||
$q->when(request()->input('search'), function ($query, $search) {
|
||||
$query->whereRaw('LOWER(title) like ?', ["%".strtolower($search)."%"]);
|
||||
});
|
||||
})
|
||||
->with('schedules')
|
||||
->orderBy('title')
|
||||
->get());
|
||||
}
|
||||
|
||||
$searchRequest = request()->input('search');
|
||||
|
||||
return Inertia::render('Client/Schedules/Index', compact('educationalGroups', 'searchRequest'));
|
||||
}
|
||||
|
||||
public function show($id)
|
||||
{
|
||||
$schedule = Schedule::find($id);
|
||||
return Inertia::render('Client/Schedules/Show', compact('schedule'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ClientVacantPositionController extends Controller
|
||||
{
|
||||
//
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\ClientVirtualExhibitionListResource;
|
||||
use App\Models\VirtualExhibition;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class ClientVirtualExhibitionController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$exhibitions = ClientVirtualExhibitionListResource::collection(VirtualExhibition::query()
|
||||
->where('is_active', true)
|
||||
->orderBy('id', 'desc')
|
||||
->paginate(6));
|
||||
return Inertia::render('Client/Library-exhibitions/Index', compact('exhibitions'));
|
||||
}
|
||||
|
||||
public function show(string $id)
|
||||
{
|
||||
$exhibition = new ClientVirtualExhibitionListResource(VirtualExhibition::query()->find($id));
|
||||
return Inertia::render('Client/Library-exhibitions/Show', compact('exhibition'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Enums\CustomFormStatus;
|
||||
use App\Http\Requests\FormResponseRequest;
|
||||
use App\Http\Resources\ClientFormResource;
|
||||
use App\Models\CustomForm;
|
||||
use App\Models\CustomFormResponse;
|
||||
use App\Rules\UniqueJsonField;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
|
||||
class ClientWidgetFormController extends Controller
|
||||
{
|
||||
public function single(string $id)
|
||||
{
|
||||
return new ClientFormResource(CustomForm::query()->where('status', CustomFormStatus::PUBLISHED)->where('form_id', $id)->first());
|
||||
}
|
||||
|
||||
public function submit(int $id, Request $request)
|
||||
{
|
||||
$data = CustomForm::findOrFail($id);
|
||||
|
||||
|
||||
$rules = $this->generateValidationRules($data['columns'], $data['id']);
|
||||
|
||||
|
||||
$messages = $this->generateValidationMessages($data['columns']);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
$validateData = Validator::make($request->all(), $rules, $messages);
|
||||
|
||||
|
||||
if ($validateData->fails()) {
|
||||
return response()->json($validateData->errors(), 422);
|
||||
}
|
||||
|
||||
$this->storeResponse($id, $validateData->validated());
|
||||
|
||||
|
||||
return response()->json([
|
||||
'message' => $data['send_message'],
|
||||
'status' => 'ok'
|
||||
]);
|
||||
}
|
||||
|
||||
private function generateValidationRules(array $columns, int $id): array
|
||||
{
|
||||
$rules = [];
|
||||
|
||||
foreach ($columns as $column) {
|
||||
// Извлекаем информацию о поле
|
||||
$name = $column['data']['name_field'];
|
||||
$rulesForField = [];
|
||||
|
||||
// Проверяем, является ли поле массивом (множественный выбор)
|
||||
if ($column['type'] === 'multiple_choice') {
|
||||
$rulesForField[] = 'required'; // Обязательно для множественного выбора
|
||||
$rulesForField[] = 'array'; // Указывает, что это массив
|
||||
$rulesForField[] = 'min:1'; // Минимум один элемент
|
||||
$rules[$name] = $rulesForField; // Правила для каждого элемента массива
|
||||
} else {
|
||||
// Обработка обычных полей
|
||||
if (!empty($column['data']['rules']['required'])) {
|
||||
$rulesForField[] = 'required';
|
||||
}
|
||||
|
||||
if (!empty($column['data']['rules']['min'])) {
|
||||
$rulesForField[] = 'min:' . $column['data']['rules']['min'];
|
||||
}
|
||||
|
||||
if (!empty($column['data']['rules']['max'])) {
|
||||
$rulesForField[] = 'max:' . $column['data']['rules']['max'];
|
||||
}
|
||||
|
||||
if (!empty($column['data']['rules']['unique']) && $column['data']['rules']['unique'] === true) {
|
||||
$rulesForField[] = new UniqueJsonField($id, $name);
|
||||
}
|
||||
|
||||
$rules[$name] = $rulesForField; // Добавляем правила для обычного поля
|
||||
}
|
||||
}
|
||||
|
||||
return $rules;
|
||||
}
|
||||
|
||||
private function generateValidationMessages(array $columns): array
|
||||
{
|
||||
$messages = [];
|
||||
|
||||
foreach ($columns as $column) {
|
||||
$name = $column['data']['name_field'];
|
||||
|
||||
if (!empty($column['data']['rules']['required'])) {
|
||||
$messages[$name . '.required'] = 'Поле обязательно для заполнения.';
|
||||
}
|
||||
|
||||
if (!empty($column['data']['rules']['min'])) {
|
||||
$messages[$name . '.min'] = 'Минимальная длина поля должна быть ' . $column['data']['rules']['min'] . ' символов.';
|
||||
}
|
||||
|
||||
if (!empty($column['data']['rules']['max'])) {
|
||||
$messages[$name . '.max'] = 'Максимальная длина поля должна быть ' . $column['data']['rules']['max'] . ' символов.';
|
||||
}
|
||||
|
||||
if (!empty($column['data']['rules']['unique'])) {
|
||||
$messages[$name . '.max'] = 'Поле должно быть уникальным';
|
||||
}
|
||||
}
|
||||
|
||||
return $messages;
|
||||
}
|
||||
|
||||
private function storeResponse(int $id, array $validateData): void
|
||||
{
|
||||
CustomFormResponse::create([
|
||||
'custom_form_id' => $id,
|
||||
'answers' => $validateData,
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\ClientPageNavigateResource;
|
||||
use App\Http\Resources\PageResource;
|
||||
use App\Models\Page;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ClientWidgetPageController extends Controller
|
||||
{
|
||||
public function single(int $id)
|
||||
{
|
||||
$page = Page::query()
|
||||
->with('section')
|
||||
->find($id);
|
||||
if (isset($page->section)) {
|
||||
$breadcrumbs = [
|
||||
'mainSection' => $page->section->mainSection->title,
|
||||
'subSection' => $page->section->title,
|
||||
'page' => $page->title,
|
||||
];
|
||||
} else {
|
||||
$breadcrumbs = null;
|
||||
}
|
||||
return response()->json([
|
||||
'data' => [
|
||||
'page' => new ClientPageNavigateResource($page),
|
||||
'breadcrumbs' => $breadcrumbs
|
||||
],
|
||||
], 200);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Enums\PostStatus;
|
||||
use App\Http\Resources\ClientPostListResource;
|
||||
use App\Http\Resources\PostThumbnailResource;
|
||||
use App\Models\Post;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ClientWidgetPostController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
|
||||
return PostThumbnailResource::collection(
|
||||
Post::query()
|
||||
->where('status', PostStatus::PUBLISHED)
|
||||
->when(request()->input('category'), function ($query, $category_id) {
|
||||
$query->where('category_id', $category_id);
|
||||
})
|
||||
->with('category')
|
||||
->orderBy('created_at', 'desc')
|
||||
->take(request()->input('count', 5))
|
||||
->get());
|
||||
}
|
||||
|
||||
public function single(int $id)
|
||||
{
|
||||
return new PostThumbnailResource(
|
||||
Post::query()->with('category')->find($id)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||
use Illuminate\Routing\Controller as BaseController;
|
||||
|
||||
class Controller extends BaseController
|
||||
{
|
||||
use AuthorizesRequests, ValidatesRequests;
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\Department\StoreRequest;
|
||||
use App\Http\Requests\Department\UpdateRequest;
|
||||
use App\Http\Resources\DepartmentResource;
|
||||
use App\Http\Resources\FacultyResource;
|
||||
use App\Models\Department;
|
||||
use App\Models\Faculty;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class DepartmentController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$departments = DepartmentResource::collection(Department::all());
|
||||
$filters = [
|
||||
'search' => request()->input('search'),
|
||||
];
|
||||
return Inertia::render('AdminPanel/Departments/Index', compact('departments', 'filters'));
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
$faculties = FacultyResource::collection(Faculty::all());
|
||||
return Inertia::render('AdminPanel/Departments/Create', compact('faculties'));
|
||||
}
|
||||
|
||||
public function store(StoreRequest $request)
|
||||
{
|
||||
$data = $request->validated();
|
||||
Department::firstOrCreate($data);
|
||||
return redirect()->route('admin.department.index');
|
||||
}
|
||||
|
||||
public function edit(Department $department)
|
||||
{
|
||||
return Inertia::render('AdminPanel/Departments/Edit', compact('department'));
|
||||
}
|
||||
|
||||
public function update(UpdateRequest $request, Department $department)
|
||||
{
|
||||
$data = $request->validated();
|
||||
$department->update($data);
|
||||
return redirect()->route('admin.department.index');
|
||||
}
|
||||
|
||||
public function destroy(Department $department)
|
||||
{
|
||||
$department->delete();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\Division\StoreRequest;
|
||||
use App\Http\Requests\Division\UpdateRequest;
|
||||
use App\Http\Resources\DivisionResource;
|
||||
use App\Http\Resources\UserResource;
|
||||
use App\Models\Division;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class DivisionController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$divisions = DivisionResource::collection(Division::query()
|
||||
->when(request()->input('search'), function ($query, $search) {
|
||||
$query->where('title', 'like', "%{$search}%");
|
||||
})
|
||||
->orderBy('id', 'desc')
|
||||
->paginate(request()->input('perPage', 9))
|
||||
->withQueryString());
|
||||
$filters = [
|
||||
'search' => request()->input('search'),
|
||||
];
|
||||
return Inertia::render('AdminPanel/Divisions/Index', compact('divisions', 'filters'));
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
return Inertia::render('AdminPanel/Divisions/Create');
|
||||
}
|
||||
|
||||
public function store(StoreRequest $request)
|
||||
{
|
||||
$data = $request->validated();
|
||||
$data['description'] = json_encode($data['description']);
|
||||
Division::create($data);
|
||||
return redirect()->route('admin.division.index');
|
||||
}
|
||||
|
||||
public function edit(Division $division)
|
||||
{
|
||||
$division = new DivisionResource($division);
|
||||
$users = UserResource::collection(User::all());
|
||||
return Inertia::render('AdminPanel/Divisions/Edit', compact('division', 'users'));
|
||||
}
|
||||
|
||||
public function update(Division $division, UpdateRequest $request)
|
||||
{
|
||||
$data = $request->validated();
|
||||
$data['description'] = json_encode($data['description']);
|
||||
$division->update($data);
|
||||
return redirect()->route('admin.division.index');
|
||||
}
|
||||
|
||||
public function destroy(string $id)
|
||||
{
|
||||
$category = Division::find($id);
|
||||
$category->delete();
|
||||
|
||||
return redirect()->route('admin.division.index');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\Event\StoreRequest;
|
||||
use App\Http\Requests\Event\UpdateRequest;
|
||||
use App\Http\Resources\EventResource;
|
||||
use App\Models\Event;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class EventController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$events = EventResource::collection(Event::query()
|
||||
->when(request()->input('search'), function ($query, $search) {
|
||||
$query->where('title', 'like', "%{$search}%");
|
||||
})
|
||||
->orderBy('id', 'desc')
|
||||
->paginate(request()->input('perPage', 9))
|
||||
->withQueryString());
|
||||
$filters = [
|
||||
'search' => request()->input('search'),
|
||||
];
|
||||
return Inertia::render('AdminPanel/Posts/Index', compact('events', 'filters'));
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
return Inertia::render('AdminPanel/Posts/Create');
|
||||
}
|
||||
|
||||
public function store(StoreRequest $request)
|
||||
{
|
||||
$data = $request->validated();
|
||||
$data['content'] = json_encode($data['content']);
|
||||
Event::create($data);
|
||||
return redirect()->route('admin.event.index');
|
||||
}
|
||||
|
||||
public function edit(Event $event)
|
||||
{
|
||||
$event = new EventResource($event);
|
||||
return Inertia::render('AdminPanel/Posts/Edit', compact('event'));
|
||||
}
|
||||
|
||||
public function update(Event $event, UpdateRequest $request)
|
||||
{
|
||||
$data = $request->validated();
|
||||
$data['content'] = json_encode($data['content']);
|
||||
$event->update($data);
|
||||
return redirect()->route('admin.event.index');
|
||||
}
|
||||
|
||||
|
||||
public function destroy(Event $event)
|
||||
{
|
||||
$event->delete();
|
||||
return redirect()->route('admin.event.index');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\Faculty\StoreRequest;
|
||||
use App\Http\Requests\Faculty\UpdateRequest;
|
||||
use App\Http\Resources\FacultyResource;
|
||||
use App\Models\Faculty;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class FacultyController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$faculties = FacultyResource::collection(Faculty::all());
|
||||
$filters = [
|
||||
'search' => request()->input('search'),
|
||||
];
|
||||
return Inertia::render('AdminPanel/Faculties/Index', compact('faculties', 'filters'));
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
return Inertia::render('AdminPanel/Faculties/Create');
|
||||
}
|
||||
|
||||
public function store(StoreRequest $request)
|
||||
{
|
||||
$data = $request->validated();
|
||||
Faculty::firstOrCreate($data);
|
||||
return redirect()->route('admin.faculty.index');
|
||||
}
|
||||
|
||||
public function edit(Faculty $faculty)
|
||||
{
|
||||
return Inertia::render('AdminPanel/Faculties/Edit', compact('faculty'));
|
||||
}
|
||||
|
||||
public function update(UpdateRequest $request, Faculty $faculty)
|
||||
{
|
||||
$data = $request->validated();
|
||||
$faculty->update($data);
|
||||
return redirect()->route('admin.faculty.index');
|
||||
}
|
||||
|
||||
public function destroy(Faculty $faculty)
|
||||
{
|
||||
$faculty->delete();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
class FileUploadController extends Controller
|
||||
{
|
||||
public function uploadFile(Request $request)
|
||||
{
|
||||
if ($request->hasFile('file')) {
|
||||
$file = $request->file('file');
|
||||
|
||||
if ($file->isValid()) {
|
||||
// Генерируем уникальное имя файла
|
||||
$filename = md5(Carbon::now() . '_' . $file->getClientOriginalName()) . '.' . $file->getClientOriginalExtension();
|
||||
|
||||
// Сохраняем файл в папку public/files
|
||||
$path = Storage::disk('public')->putFileAs('/files', $file, $filename);
|
||||
|
||||
// Генерируем полный URL к загруженному файлу с использованием функции asset
|
||||
$fileUrl = '/storage/' . $path;
|
||||
|
||||
// Возвращаем JSON-ответ с заданным форматом
|
||||
return response()->json([
|
||||
'success' => 1,
|
||||
'file' => [
|
||||
'url' => $fileUrl,
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
return response()->json(['error' => 'File upload failed'], 400);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class IconController extends Controller
|
||||
{
|
||||
//
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Intervention\Image\ImageManagerStatic as ImageTool;
|
||||
|
||||
|
||||
class ImageController extends Controller
|
||||
{
|
||||
public function uploadImage(Request $request)
|
||||
{
|
||||
if ($request->hasFile('image')) {
|
||||
$image = $request->file('image');
|
||||
// Генерируем уникальное имя файла, чтобы избежать конфликтов
|
||||
$filename = md5(Carbon::now() . '_' . $image->getClientOriginalName()) . '.' . $image->getClientOriginalExtension();
|
||||
// Сохраняем изображение в директорию public
|
||||
ImageTool::configure(['driver' => 'imagick']);
|
||||
ImageTool::make($image)
|
||||
->resize(1200, null, function ($constraint) {
|
||||
$constraint->aspectRatio();
|
||||
$constraint->upsize();
|
||||
})
|
||||
->save(storage_path('app/public/images/' . $filename));
|
||||
$path = "/storage/images/" . $filename;
|
||||
// Генерируем URL для доступа к изображению
|
||||
return response()->json(['success' => 1, 'file' => ['url' => $path]]);
|
||||
}
|
||||
|
||||
return response()->json(['error' => 'Image upload failed']);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\PostResource;
|
||||
use App\Http\Resources\StudentResource;
|
||||
use App\Http\Resources\UserDetailResource;
|
||||
use App\Models\Post;
|
||||
use App\Models\Student;
|
||||
use App\Models\UserDetail;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Routing\Route;
|
||||
|
||||
class LinkToolController extends Controller
|
||||
{
|
||||
public function main(Request $request)
|
||||
{
|
||||
if ($request->input('url') == \route('client.person.show', ['userDetail' => substr($request->input('url'), -1)])) {
|
||||
$userDetail = UserDetail::find(substr($request->input('url'), -1));
|
||||
return response()->json([
|
||||
'success' => 1,
|
||||
'link' => Str($request->input('url')),
|
||||
'meta' => [
|
||||
'title' => $userDetail->surname . ' '. $userDetail->name . ' '. $userDetail->middleName,
|
||||
'description' => $userDetail->administrativePosition,
|
||||
'image' => [
|
||||
'url' => $userDetail->photo
|
||||
],
|
||||
'type' => 'person',
|
||||
'data' => new UserDetailResource($userDetail),
|
||||
]
|
||||
]);
|
||||
}
|
||||
if ($request->input('url') == \route('client.post.show', ['slug' => $this->getSlugFromUrl($request->input('url')) ])) {
|
||||
$post = Post::query()->where('slug', '=', $this->getSlugFromUrl($request->input('url')))->first();
|
||||
$content = json_decode($post->content);
|
||||
foreach ($content->blocks as $data) {
|
||||
if ($data->type === 'paragraph') {
|
||||
return response()->json([
|
||||
'success' => 1,
|
||||
'link' => Str($request->input('url')),
|
||||
'meta' => [
|
||||
'title' => $post->title,
|
||||
'description' => $data->data->text,
|
||||
'type' => 'post',
|
||||
'data' => new PostResource($post),
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($request->input('url') == \route('client.student.show', ['student' => substr($request->input('url'), -1)])) {
|
||||
$student = Student::find(substr($request->input('url'), -1));
|
||||
return response()->json([
|
||||
'success' => 1,
|
||||
'link' => Str($request->input('url')),
|
||||
'meta' => [
|
||||
'title' => $student->surname . ' '. $student->name . ' '. $student->middleName,
|
||||
'description' => $student->position,
|
||||
'image' => [
|
||||
'url' => $student->photo
|
||||
],
|
||||
'type' => 'student',
|
||||
'data' => new StudentResource($student),
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private function getSlugFromUrl($url)
|
||||
{
|
||||
$path = parse_url($url, PHP_URL_PATH);
|
||||
$segments = explode('/', $path);
|
||||
$lastSegment = end($segments);
|
||||
return $lastSegment;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\AdditionalEducationResource;
|
||||
use App\Http\Resources\ClientMainSliderResource;
|
||||
use App\Http\Resources\ClientNavigationResource;
|
||||
use App\Http\Resources\EventThumbnailResource;
|
||||
use App\Http\Resources\MainSectionResource;
|
||||
use App\Http\Resources\PostResource;
|
||||
use App\Http\Resources\PostThumbnailResource;
|
||||
use App\Models\AdditionalEducation;
|
||||
use App\Models\AdditionalEducationCategory;
|
||||
use App\Models\AdmissionCampaign;
|
||||
use App\Models\Event;
|
||||
use App\Models\MainSection;
|
||||
use App\Models\MainSlider;
|
||||
use App\Models\Post;
|
||||
use App\Services\Filament\Icon\ArrayToCollectionService;
|
||||
use DateTime;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class MainController extends Controller
|
||||
{
|
||||
|
||||
public function index()
|
||||
{
|
||||
$additional_educations = [
|
||||
'educations_count' => AdditionalEducation::where('is_active', true)->count(),
|
||||
'categories_count' => AdditionalEducationCategory::where('is_active', true)->count()
|
||||
];
|
||||
$today = new DateTime();
|
||||
$event_date_start = $today->format('Y-m-d');
|
||||
$sliders = ClientMainSliderResource::collection(MainSlider::query()->where('is_active', true)->orderBy('sort', 'asc')->get());
|
||||
$posts = PostThumbnailResource::collection(Post::query()
|
||||
->select('title', 'slug', 'authors', 'category_id', 'preview', 'search_data', 'created_at')
|
||||
->with('category')
|
||||
->where('status', '=', 'published')
|
||||
->orderBy('id', 'desc')->limit(3)
|
||||
->get());
|
||||
$events = EventThumbnailResource::collection(Event::query()
|
||||
->select('title', 'slug', 'event_date_start', 'address', 'is_online', 'category_id')
|
||||
->where('event_date_start', '>=', $event_date_start)
|
||||
->orderBy('event_date_start', 'asc')->limit(3)->get());
|
||||
return Inertia::render('Main', compact('posts', 'events', 'sliders', 'additional_educations'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\MainSectionResource;
|
||||
use App\Models\MainSection;
|
||||
use App\Models\SubSection;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class MainSectionController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$mainSections = MainSectionResource::collection(MainSection::paginate(10));
|
||||
$filters = [
|
||||
'search' => request()->input('search'),
|
||||
];
|
||||
return Inertia::render('AdminPanel/MainSection/Index', compact('mainSections', 'filters'));
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
$subSections = SubSection::query()->where('main_section_id', '=', null)->get();
|
||||
return Inertia::render('AdminPanel/MainSection/Create', compact('subSections'));
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'title' => 'required|unique:main_sections|max:50|min:5',
|
||||
'subSection_ids' => 'array',
|
||||
'subSection_ids.*' => 'exists:sub_sections,id'
|
||||
]);
|
||||
$subSection_ids = $data['subSection_ids'];
|
||||
unset($data['subSection_ids']);
|
||||
$mainSection = MainSection::create($data);
|
||||
SubSection::whereIn('id', $subSection_ids)->update(['main_section_id' => $mainSection->id]);
|
||||
return redirect()->route('admin.mainSection.index');
|
||||
}
|
||||
|
||||
public function edit(MainSection $mainSection)
|
||||
{
|
||||
$subSections = SubSection::query()->where('main_section_id', '=', $mainSection->id)->
|
||||
orWhere('main_section_id', '=', null)
|
||||
->get();
|
||||
$subSection_ids = SubSection::query()->where('main_section_id', '=', $mainSection->id)->pluck('id');
|
||||
$mainSection = new MainSectionResource($mainSection);
|
||||
return Inertia::render('AdminPanel/MainSection/Edit', compact('mainSection', 'subSections', 'subSection_ids'));
|
||||
}
|
||||
|
||||
public function update(MainSection $mainSection, Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'title' => 'required|unique:main_sections|max:50|min:5',
|
||||
'subSection_ids' => 'array',
|
||||
'subSection_ids.*' => 'exists:sub_sections,id'
|
||||
]);
|
||||
$subSection_ids = $data['subSection_ids'];
|
||||
unset($data['subSection_ids']);
|
||||
$mainSection->update($data);
|
||||
SubSection::query()->where('main_section_id', '=', $mainSection->id)->update(['main_section_id' => NULL]);
|
||||
SubSection::whereIn('id', $subSection_ids)->update(['main_section_id' => $mainSection->id]);
|
||||
return redirect()->route('admin.mainSection.index');
|
||||
}
|
||||
|
||||
public function destroy(MainSection $mainSection)
|
||||
{
|
||||
SubSection::query()->where('main_section_id', '=', $mainSection->id)->update(['main_section_id' => NULL]);
|
||||
$mainSection->delete();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,139 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\Page\StoreRequest;
|
||||
use App\Http\Requests\Page\UpdateRequest;
|
||||
use App\Http\Resources\ClientNavigationResource;
|
||||
use App\Http\Resources\MainSectionResource;
|
||||
use App\Http\Resources\PageResource;
|
||||
use App\Http\Resources\RegisteredPageResource;
|
||||
use App\Models\MainSection;
|
||||
use App\Models\Page;
|
||||
use App\Models\Post;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Support\Facades\Redirect;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class PageController extends Controller
|
||||
{
|
||||
public function getRegisteredPages()
|
||||
{
|
||||
$pages = PageResource::collection(Page::query()
|
||||
->when(request()->input('search'), function ($query, $search) {
|
||||
$query->where('title', 'like', "%{$search}%");
|
||||
})
|
||||
->where('is_registered', true)
|
||||
->where('is_visible', true)
|
||||
->orderBy('id', 'desc')
|
||||
->paginate(request()->input('perPage', 9))
|
||||
->withQueryString());
|
||||
$filters = [
|
||||
'search' => request()->input('search'),
|
||||
];
|
||||
return Inertia::render('AdminPanel/Pages/Registered', compact('pages', 'filters'));
|
||||
}
|
||||
|
||||
public function render($path)
|
||||
{
|
||||
$page = Page::where('path', '=', $path)->with('section.pages.section', 'section.mainSection')->first();
|
||||
if ($page === null) {
|
||||
abort(404);
|
||||
}
|
||||
|
||||
if (isset($page->section)) {
|
||||
$subSectionPages = PageResource::collection($page->section->pages);
|
||||
$breadcrumbs = [
|
||||
'mainSection' => $page->section->mainSection->title,
|
||||
'subSection' => $page->section->title,
|
||||
'page' => $page->title,
|
||||
];
|
||||
} else {
|
||||
$subSectionPages = null;
|
||||
$breadcrumbs = null;
|
||||
}
|
||||
|
||||
|
||||
$page = new PageResource($page);
|
||||
|
||||
|
||||
|
||||
$error = $page->code;
|
||||
|
||||
if ($page->code != 200) {
|
||||
abort($error);
|
||||
}
|
||||
|
||||
return Inertia::render($page->template, compact('page', 'subSectionPages', 'breadcrumbs'));
|
||||
}
|
||||
|
||||
|
||||
public function index()
|
||||
{
|
||||
$pages = PageResource::collection(Page::query()
|
||||
->when(request()->input('search'), function ($query, $search) {
|
||||
$query->where('title', 'like', "%{$search}%");
|
||||
})
|
||||
->where('is_registered', false)
|
||||
->orderBy('id', 'desc')
|
||||
->paginate(request()->input('perPage', 9))
|
||||
->withQueryString());
|
||||
$filters = [
|
||||
'search' => request()->input('search'),
|
||||
];
|
||||
return Inertia::render('AdminPanel/Pages/Index', compact('pages', 'filters'));
|
||||
}
|
||||
|
||||
public function edit($slug)
|
||||
{
|
||||
$page = new PageResource(Page::where('slug', '=', $slug)->first());
|
||||
return Inertia::render('AdminPanel/Pages/Edit', compact('page'));
|
||||
}
|
||||
|
||||
public function update(Page $page, UpdateRequest $request)
|
||||
{
|
||||
$data = $request->validated();
|
||||
$data['content'] = json_encode($data['content']);
|
||||
$page->update($data);
|
||||
return redirect()->route('admin.page.index');
|
||||
}
|
||||
|
||||
public function editRegisteredPage($id)
|
||||
{
|
||||
$page = new RegisteredPageResource(Page::find($id));
|
||||
return Inertia::render('AdminPanel/Pages/EditRegisteredPage', compact('page'));
|
||||
}
|
||||
|
||||
public function updateRegisteredPage($id, Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'title' => 'required',
|
||||
'path' => 'required',
|
||||
'is_visible' => 'required',
|
||||
'code' => 'required'
|
||||
]);
|
||||
$page = Page::find($id);
|
||||
$page->update($data);
|
||||
return redirect()->route('admin.registered.page.index');
|
||||
}
|
||||
|
||||
public function destroy(Page $page)
|
||||
{
|
||||
$page->delete();
|
||||
return redirect()->route('admin.page.index');
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
return Inertia::render('AdminPanel/Pages/Create');
|
||||
}
|
||||
|
||||
public function store(StoreRequest $request)
|
||||
{
|
||||
$data = $request->validated();
|
||||
$data['content'] = json_encode($data['content']);
|
||||
Page::create($data);
|
||||
return redirect()->route('admin.page.index');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\ClientFullInfoPersonResource;
|
||||
use App\Http\Resources\ClientNavigationResource;
|
||||
use App\Http\Resources\MainSectionResource;
|
||||
use App\Http\Resources\UserDetailResource;
|
||||
use App\Http\Resources\UserResource;
|
||||
use App\Models\MainSection;
|
||||
use App\Models\User;
|
||||
use App\Models\UserDetail;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class PersonController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$persons = UserDetailResource::collection(UserDetail::all());
|
||||
$filters = [
|
||||
'search' => request()->input('search'),
|
||||
];
|
||||
return Inertia::render('Client/Persons/Index', compact('persons', 'filters'));
|
||||
}
|
||||
|
||||
public function show(string $id)
|
||||
{
|
||||
$person = new ClientFullInfoPersonResource(User::query()->with(['userDetail', 'departments_work.faculty', 'departments_teach.faculty', 'divisions', 'faculties'])->where('id', $id)->firstOrFail());
|
||||
return Inertia::render('Client/Persons/Show', compact('person'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,175 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\Post\StoreRequest;
|
||||
use App\Http\Resources\CategoryResource;
|
||||
use App\Http\Resources\GalleryResource;
|
||||
use App\Http\Resources\PostResource;
|
||||
use App\Models\AuthorPost;
|
||||
use App\Models\Category;
|
||||
use App\Models\Gallery;
|
||||
use App\Models\Image;
|
||||
use App\Models\Post;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Sleep;
|
||||
use Illuminate\Support\Str;
|
||||
use Inertia\Inertia;
|
||||
use Illuminate\Support;
|
||||
use Intervention\Image\ImageManagerStatic as ImageTool;
|
||||
|
||||
class PostController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
function index(Request $request)
|
||||
{
|
||||
$posts = PostResource::collection(Post::query()
|
||||
->when(request()->input('search'), function ($query, $search) {
|
||||
$query->where('title', 'like', "%{$search}%");
|
||||
})
|
||||
->orderBy('id', 'desc')
|
||||
->paginate(request()->input('perPage', 9))
|
||||
->withQueryString());
|
||||
$filters = [
|
||||
'search' => request()->input('search'),
|
||||
];
|
||||
|
||||
return Inertia::render('AdminPanel/Events/Index', compact('posts', 'filters'));
|
||||
}
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
$categories = CategoryResource::collection(Category::all());
|
||||
return Inertia::render('AdminPanel/Events/Create', compact('categories'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(StoreRequest $request)
|
||||
{
|
||||
$data = $request->validated();
|
||||
$data['slug'] = Str::slug($data['title'], '-');
|
||||
$count = 0;
|
||||
$original_slug = $data['slug'];
|
||||
|
||||
while (Post::where('slug', '=', $data['slug'])->exists()) {
|
||||
$count++;
|
||||
$data['slug'] = $original_slug . '-' . $count + 1;
|
||||
}
|
||||
|
||||
|
||||
$data['content'] = json_encode($data['content']);
|
||||
$data['reading_time'] = $this->calculateReadingTime($data['search_data']);
|
||||
$author = $data['author'];
|
||||
$images = $data['images'];
|
||||
unset($data['author']);
|
||||
unset($data['images']);
|
||||
|
||||
$post = Post::create($data);
|
||||
if (isset($author)) {
|
||||
AuthorPost::create([
|
||||
'name' => $author,
|
||||
'post_id' => $post->id
|
||||
]);
|
||||
}
|
||||
if (isset($images)) {
|
||||
$gallery = Gallery::create([
|
||||
'post_id' => $post->id,
|
||||
]);
|
||||
foreach ($images as $image) {
|
||||
$filename = md5(Carbon::now() . '_' . $image->getClientOriginalName()) . '.' . 'jpeg';
|
||||
|
||||
ImageTool::configure(['driver' => 'imagick']);
|
||||
ImageTool::make($image)
|
||||
->resize(1200, null, function ($constraint) {
|
||||
$constraint->aspectRatio();
|
||||
$constraint->upsize();
|
||||
})
|
||||
->save(storage_path('app/public/images/' . $filename));
|
||||
$path = "/storage/images/" . $filename;
|
||||
Image::create([
|
||||
'path' => $path,
|
||||
'gallery_id' => $gallery->id,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
return redirect()->route('admin.post.index');
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show($slug)
|
||||
{
|
||||
$post = new PostResource(Post::where('slug', $slug)->firstOrFail());
|
||||
return Inertia::render('AdminPanel/Events/Show', compact('post'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit(Post $post)
|
||||
{
|
||||
$categories = CategoryResource::collection(Category::all());
|
||||
$post = new PostResource($post);
|
||||
return Inertia::render('AdminPanel/Events/Edit', compact('post', 'categories'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(Post $post, Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'title' => 'required|max:255|min:5',
|
||||
'content' => 'required|array',
|
||||
'content.blocks' => 'required|array|min:1',
|
||||
'category_id' => 'nullable|exists:categories,id',
|
||||
'is_published' => 'boolean',
|
||||
]);
|
||||
$data['slug'] = \Illuminate\Support\Str::slug($data['title'], '-');
|
||||
$data['content'] = json_encode($data['content']);
|
||||
|
||||
$post->update($data);
|
||||
return redirect()->route('admin.post.index');
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(Post $post)
|
||||
{
|
||||
$post->delete();
|
||||
return redirect()->route('admin.post.index');
|
||||
}
|
||||
|
||||
private function calculateReadingTime(string $text): int
|
||||
{
|
||||
|
||||
$text = "lorem ipsum - это текст - часто используемый в печати и вэб-дизайне lorem ipsum является стандартной для текстов на латинице с начала xvi века в то время некий безымянный печатник создал большую коллекцию размеров и форм шрифтов используя lorem ipsum для распечатки образцов lorem ipsum не только успешно пережил без заметных изменений пять веков но и перешагнул в электронный дизайн его популяризации в новое время послужили публикация листов letraset с образцами lorem ipsum в 60-х годах и в более недавнее время программы электронной вёрстки типа aldus pagemaker в шаблонах которых используется lorem ipsum lorem ipsum - это текст - часто используемый в печати и вэб-дизайне lorem ipsum является стандартной для текстов на латинице с начала xvi века в то время некий безымянный печатник создал большую коллекцию размеров и форм шрифтов используя lorem ipsum для распечатки образцов lorem ipsum не только успешно пережил без заметных изменений пять веков но и перешагнул в электронный дизайн его популяризации в новое время послужили публикация листов letraset с образцами lorem ipsum в 60-х годах и в более недавнее время программы электронной вёрстки типа aldus pagemaker в шаблонах которых используется lorem ipsum";
|
||||
// Calculate the number of words in the text
|
||||
$wordCount = str_word_count($text,0,"АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя");
|
||||
|
||||
|
||||
|
||||
|
||||
// Calculate the average reading speed in words per minute
|
||||
$wordsPerMinute = 120; // You can adjust this value based on your desired reading speed
|
||||
|
||||
// Calculate the reading time in minutes
|
||||
$readingTime = $wordCount / $wordsPerMinute;
|
||||
|
||||
// Round the reading time to the nearest integer
|
||||
$readingTime = round($readingTime);
|
||||
|
||||
|
||||
return $readingTime;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\ProfileUpdateRequest;
|
||||
use Illuminate\Contracts\Auth\MustVerifyEmail;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Redirect;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
|
||||
class ProfileController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display the user's profile form.
|
||||
*/
|
||||
public function edit(Request $request): Response
|
||||
{
|
||||
return Inertia::render('Profile/Edit', [
|
||||
'mustVerifyEmail' => $request->user() instanceof MustVerifyEmail,
|
||||
'status' => session('status'),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the user's profile information.
|
||||
*/
|
||||
public function update(ProfileUpdateRequest $request): RedirectResponse
|
||||
{
|
||||
$request->user()->fill($request->validated());
|
||||
|
||||
if ($request->user()->isDirty('email')) {
|
||||
$request->user()->email_verified_at = null;
|
||||
}
|
||||
|
||||
$request->user()->save();
|
||||
|
||||
return Redirect::route('profile.edit');
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the user's account.
|
||||
*/
|
||||
public function destroy(Request $request): RedirectResponse
|
||||
{
|
||||
$request->validate([
|
||||
'password' => ['required', 'current_password'],
|
||||
]);
|
||||
|
||||
$user = $request->user();
|
||||
|
||||
Auth::logout();
|
||||
|
||||
$user->delete();
|
||||
|
||||
$request->session()->invalidate();
|
||||
$request->session()->regenerateToken();
|
||||
|
||||
return Redirect::to('/');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\Schedule\StoreRequest;
|
||||
use App\Http\Resources\ClientNavigationResource;
|
||||
use App\Http\Resources\FacultyResource;
|
||||
use App\Http\Resources\MainSectionResource;
|
||||
use App\Http\Resources\ScheduleResource;
|
||||
use App\Models\Faculty;
|
||||
use App\Models\MainSection;
|
||||
use App\Models\Schedule;
|
||||
use App\Models\SubSchedule;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Validation\Rules\File;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class ScheduleController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$schedules = ScheduleResource::collection(Schedule::query()->ExistSubSchedule()->orderBy('name')->paginate(10));
|
||||
$filters = [
|
||||
'search' => request()->input('search'),
|
||||
];
|
||||
return Inertia::render('AdminPanel/Schedules/Index', compact('schedules', 'filters'));
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
$faculties = FacultyResource::collection(Faculty::all());
|
||||
return Inertia::render('AdminPanel/Schedules/Create', compact('faculties'));
|
||||
}
|
||||
|
||||
public function store(StoreRequest $request)
|
||||
{
|
||||
$data = $request->validated();
|
||||
|
||||
$this->storeSchedules($request->file('files'), $data);
|
||||
|
||||
return redirect()->route('admin.index');
|
||||
}
|
||||
|
||||
public function show(Schedule $schedule)
|
||||
{
|
||||
$schedule = new ScheduleResource($schedule);
|
||||
return Inertia::render('AdminPanel/Schedules/Show', compact('schedule'));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public function destroy(Schedule $schedule)
|
||||
{
|
||||
$schedule->delete();
|
||||
}
|
||||
private function storeSchedules($files, $data)
|
||||
{
|
||||
foreach ($files as $file) {
|
||||
$scheduleTitle = $this->generateScheduleTitle($file);
|
||||
$schedule = $this->storeSchedule($scheduleTitle, $data);
|
||||
$this->storeSubSchedule($file, $schedule);
|
||||
}
|
||||
}
|
||||
|
||||
private function generateScheduleTitle($file)
|
||||
{
|
||||
$str = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
|
||||
$words = explode(' ', $str);
|
||||
return implode(' ', array_slice($words, 0, 2));
|
||||
}
|
||||
|
||||
private function storeSchedule($title, $data)
|
||||
{
|
||||
return Schedule::firstOrCreate([
|
||||
'name' => $title,
|
||||
'faculty_id' => $data['faculty_id'],
|
||||
'is_fullTime' => $data['is_fullTime'],
|
||||
]);
|
||||
}
|
||||
|
||||
private function storeSubSchedule($file, $schedule)
|
||||
{
|
||||
$path = Storage::disk('public')->putFileAs('/schedules', $file, $file->getClientOriginalName());
|
||||
SubSchedule::updateOrCreate([
|
||||
'name' => pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME),
|
||||
'path_file' => '/storage/'.$path,
|
||||
'schedule_id' => $schedule->id,
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\AdditionalEducationSearchResource;
|
||||
use App\Http\Resources\EducationalProgramSearchResource;
|
||||
use App\Http\Resources\EducationGroupSearchResource;
|
||||
use App\Http\Resources\EventSearchResource;
|
||||
use App\Http\Resources\PageResource;
|
||||
use App\Http\Resources\PageSearchResource;
|
||||
use App\Http\Resources\PostResource;
|
||||
use App\Http\Resources\PostSearchResource;
|
||||
use App\Models\AdditionalEducation;
|
||||
use App\Models\EducationalGroup;
|
||||
use App\Models\EducationalProgram;
|
||||
use App\Models\Event;
|
||||
use App\Models\Page;
|
||||
use App\Models\Post;
|
||||
use Filament\Notifications\Collection;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Date;
|
||||
use Illuminate\Support\Facades\Redirect;
|
||||
use Illuminate\Support\Str;
|
||||
use ProtoneMedia\LaravelCrossEloquentSearch\Search;
|
||||
|
||||
class SearchController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$req = Str::lower($request->query('search'));
|
||||
if (!$req) {
|
||||
return response()->json([
|
||||
'searchRes' => null,
|
||||
]);
|
||||
}
|
||||
$results = Search::new()
|
||||
->add(Post::where('status', '=', 'published'), ['title', 'search_data'])
|
||||
->add(Page::where('searchable', '=', true), ['title', 'search_data'])
|
||||
->add(Event::where('event_date_start', '>', Date::now()), 'title')
|
||||
->add(AdditionalEducation::where('is_active', '=', true), 'title')
|
||||
->add(EducationalGroup::with('schedules'), 'title')
|
||||
->add(EducationalProgram::where('status', '=', true)->whereHas('admission_plans'), 'name')
|
||||
->beginWithWildcard()
|
||||
->orderByRelevance()
|
||||
->includeModelType()
|
||||
->ignoreCase(true)
|
||||
->search($req);
|
||||
|
||||
$resources = collect($results)->map(function ($result) {
|
||||
if ($result instanceof Post) {
|
||||
return new PostSearchResource($result);
|
||||
}
|
||||
if ($result instanceof Page) {
|
||||
return new PageSearchResource($result);
|
||||
}
|
||||
if ($result instanceof EducationalGroup) {
|
||||
return new EducationGroupSearchResource($result);
|
||||
}
|
||||
if ($result instanceof EducationalProgram) {
|
||||
return new EducationalProgramSearchResource($result);
|
||||
}
|
||||
if ($result instanceof Event) {
|
||||
return new EventSearchResource($result);
|
||||
}
|
||||
if ($result instanceof AdditionalEducation) {
|
||||
return new AdditionalEducationSearchResource($result);
|
||||
}
|
||||
});
|
||||
|
||||
$limitedRes = $resources->take(10);
|
||||
|
||||
return response()->json([
|
||||
'searchRes' => $this->sortByType($limitedRes, $req),
|
||||
]);
|
||||
}
|
||||
|
||||
private function sortByType(object $data, string $searchRequest): array
|
||||
{
|
||||
$sortedData = [];
|
||||
|
||||
foreach ($data as $item) {
|
||||
$searchData = $item['search_data'] ?? '';
|
||||
$matches = $this->getMatches($searchData, $searchRequest);
|
||||
$sortedData[$item['type']][] = [
|
||||
'data' => $item,
|
||||
'matches' => $matches,
|
||||
'tag' => $item['type']
|
||||
];
|
||||
}
|
||||
|
||||
return $sortedData;
|
||||
}
|
||||
|
||||
private function getMatches(string $haystack, string $needle): array
|
||||
{
|
||||
$matches = [];
|
||||
$offset = 0;
|
||||
while (($offset = mb_strpos($haystack, $needle, $offset, 'UTF-8')) !== false) {
|
||||
$left = max(0, $offset - 50);
|
||||
$right = min(mb_strlen($haystack, 'UTF-8'), $offset + 100);
|
||||
$excerpt = mb_substr($haystack, $left, $right - $left, 'UTF-8');
|
||||
$matches[] = $excerpt;
|
||||
$offset += mb_strlen($needle, 'UTF-8');
|
||||
}
|
||||
return $matches;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\User;
|
||||
use Inertia\Inertia;
|
||||
use App\Models\Student;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\UploadedFile;
|
||||
use App\Http\Requests\Student\StoreRequest;
|
||||
use App\Http\Requests\Student\UpdateRequest;
|
||||
use App\Http\Resources\StudentResource;
|
||||
use App\Models\UserDetail;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Intervention\Image\ImageManagerStatic as ImageTool;
|
||||
|
||||
|
||||
class StudentController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$students = StudentResource::collection(Student::paginate(10));
|
||||
$filters = [
|
||||
'search' => request()->input('search'),
|
||||
];
|
||||
return Inertia::render('AdminPanel/Student/Index', compact('students', 'filters'));
|
||||
}
|
||||
|
||||
public function show(Student $student)
|
||||
{
|
||||
$student = new StudentResource($student);
|
||||
return Inertia::render('Client/Student/Show', compact('student'));
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
return Inertia::render('AdminPanel/Student/Create');
|
||||
}
|
||||
|
||||
public function store(StoreRequest $request)
|
||||
{
|
||||
$data = $request->validated();
|
||||
if ($request->file('photo')) {
|
||||
$data['photo'] = $this->storePhoto($request->file('photo'));
|
||||
}
|
||||
Student::create($data);
|
||||
return redirect()->route('admin.student.index');
|
||||
}
|
||||
|
||||
public function edit(Student $student)
|
||||
{
|
||||
return Inertia::render('AdminPanel/Student/Edit', compact('student'));
|
||||
}
|
||||
|
||||
public function update(Student $student, UpdateRequest $request)
|
||||
{
|
||||
$data = $request->validated();
|
||||
if ($request->file('photo')) {
|
||||
$data['photo'] = $this->storePhoto($request->file('photo'));
|
||||
}
|
||||
$student->update($data);
|
||||
return redirect()->route('admin.student.index');
|
||||
}
|
||||
|
||||
public function destroy(Student $student)
|
||||
{
|
||||
$student->delete();
|
||||
}
|
||||
|
||||
private function storePhoto(UploadedFile $file)
|
||||
{
|
||||
if ($file->isValid()) {
|
||||
$image = $file;
|
||||
// Генерируем уникальное имя файла, чтобы избежать конфликтов
|
||||
$filename = md5(Carbon::now() . '_' . $image->getClientOriginalName()) . '.' . $image->getClientOriginalExtension();
|
||||
// Сохраняем изображение в директорию public
|
||||
ImageTool::configure(['driver' => 'imagick']);
|
||||
|
||||
ImageTool::make($image)
|
||||
->resize(1200, null, function ($constraint) {
|
||||
$constraint->aspectRatio();
|
||||
$constraint->upsize();
|
||||
})
|
||||
->save(storage_path('app/public/photos/' . $filename));
|
||||
$path = "/storage/photos/" . $filename;
|
||||
// Генерируем URL для доступа к изображению
|
||||
return $path;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\SubSchedule;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
class SubScheduleController extends Controller
|
||||
{
|
||||
public function destroy(SubSchedule $subSchedule)
|
||||
{
|
||||
Storage::delete($subSchedule->path_file);
|
||||
$subSchedule->delete();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\SubSectionResource;
|
||||
use App\Models\Page;
|
||||
use App\Models\SubSection;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class SubSectionController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$subSections = SubSectionResource::collection(SubSection::paginate(10));
|
||||
$filters = [
|
||||
'search' => request()->input('search'),
|
||||
];
|
||||
return Inertia::render('AdminPanel/SubSection/Index', compact('subSections', 'filters'));
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
$pages = Page::query()
|
||||
->where('sub_section_id', '=', null)
|
||||
->where('is_visible', '=', 1)
|
||||
->where('title', '!=', null)
|
||||
->get();
|
||||
return Inertia::render('AdminPanel/SubSection/Create', compact('pages'));
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'title' => 'required|unique:main_sections|max:50|min:5',
|
||||
'page_ids' => 'array',
|
||||
'page_ids.*' => 'exists:pages,id'
|
||||
]);
|
||||
$page_ids = $data['page_ids'];
|
||||
unset($data['page_ids']);
|
||||
$subSection = SubSection::create($data);
|
||||
Page::whereIn('id', $page_ids)->update(['sub_section_id' => $subSection->id]);
|
||||
return redirect()->route('admin.subSection.index');
|
||||
}
|
||||
|
||||
public function edit(SubSection $subSection)
|
||||
{
|
||||
$pages = Page::query()->where('sub_section_id', $subSection->id)
|
||||
->orWhere(function ($query) {
|
||||
$query->where('sub_section_id', null);
|
||||
$query->where('is_visible', 1);
|
||||
$query->where('title', '!=', null);
|
||||
})->get();
|
||||
$page_ids = Page::query()->where('sub_section_id', '=', $subSection->id)->pluck('id');
|
||||
$subSection = new SubSectionResource($subSection);
|
||||
return Inertia::render('AdminPanel/SubSection/Edit', compact('subSection', 'pages', 'page_ids'));
|
||||
}
|
||||
|
||||
public function update(SubSection $subSection, Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'title' => 'required|unique:categories|max:50|min:5',
|
||||
'page_ids' => 'array',
|
||||
'page_ids.*' => 'exists:pages,id'
|
||||
]);
|
||||
$page_ids = $data['page_ids'];
|
||||
unset($data['page_ids']);
|
||||
$subSection->update($data);
|
||||
Page::query()->where('sub_section_id', '=', $subSection->id)->update(['sub_section_id' => NULL]);
|
||||
Page::whereIn('id', $page_ids)->update(['sub_section_id' => $subSection->id]);
|
||||
return redirect()->route('admin.subSection.index');
|
||||
}
|
||||
|
||||
public function destroy(SubSection $subSection)
|
||||
{
|
||||
Page::query()->where('sub_section_id', '=', $subSection->id)->update(['sub_section_id' => NULL]);
|
||||
$subSection->delete();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class TagController extends Controller
|
||||
{
|
||||
//
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Jobs\CreateDirectionStudy;
|
||||
use App\Jobs\CreateEducationalProgram;
|
||||
use App\Services\Vicon\EducationalProgram\EducationalProgramService;
|
||||
|
||||
class UpdateEduDataApiController extends Controller
|
||||
{
|
||||
private $programService;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->programService = new EducationalProgramService();
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
$this->updateOrCreateDirectionStudy();
|
||||
$this->updateOrCreateEducationProgram();
|
||||
return redirect()->route('index');
|
||||
}
|
||||
|
||||
private function updateOrCreateDirectionStudy() : void
|
||||
{
|
||||
dispatch(new CreateDirectionStudy());
|
||||
}
|
||||
private function updateOrCreateEducationProgram() : void
|
||||
{
|
||||
dispatch(new CreateEducationalProgram());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\User\StoreRequest;
|
||||
use App\Http\Requests\User\UpdateRequest;
|
||||
use App\Http\Resources\PostResource;
|
||||
use App\Http\Resources\UserResource;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
|
||||
class UserController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$users = UserResource::collection(User::all());
|
||||
$filters = [
|
||||
'search' => request()->input('search'),
|
||||
];
|
||||
return Inertia::render('AdminPanel/Users/Index', compact('users', 'filters'));
|
||||
}
|
||||
|
||||
public function show(int $id)
|
||||
{
|
||||
$user = new PostResource(User::find($id));
|
||||
return Inertia::render('AdminPanel/Users/Show', compact('user'));
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
return Inertia::render('AdminPanel/Users/Create');
|
||||
}
|
||||
|
||||
public function store(StoreRequest $request)
|
||||
{
|
||||
$data = $request->validated();
|
||||
User::firstOrCreate($data);
|
||||
return redirect()->route('admin.user.index');
|
||||
}
|
||||
|
||||
public function edit(User $user)
|
||||
{
|
||||
$user = new UserResource($user);
|
||||
return Inertia::render('AdminPanel/Users/Edit', compact('user'));
|
||||
}
|
||||
|
||||
public function update(UpdateRequest $request, User $user)
|
||||
{
|
||||
$data = $request->validated();
|
||||
$user->update($data);
|
||||
return redirect()->route('admin.user.index');
|
||||
}
|
||||
|
||||
public function destroy(User $user)
|
||||
{
|
||||
$user->delete();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\UserDetail\StoreRequest;
|
||||
use App\Http\Requests\UserDetail\UpdateRequest;
|
||||
use App\Models\User;
|
||||
use App\Models\UserDetail;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\UploadedFile;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Inertia\Inertia;
|
||||
use Intervention\Image\ImageManagerStatic as ImageTool;
|
||||
|
||||
class UserDetailController extends Controller
|
||||
{
|
||||
public function create(User $user)
|
||||
{
|
||||
$userId = $user->id;
|
||||
return Inertia::render('AdminPanel/UserDetail/Create', compact('userId'));
|
||||
}
|
||||
|
||||
public function store(StoreRequest $request)
|
||||
{
|
||||
$data = $request->validated();
|
||||
if ($request->file('photo')) {
|
||||
$data['photo'] = $this->storePhoto($request->file('photo'));
|
||||
}
|
||||
UserDetail::create($data);
|
||||
return redirect()->route('admin.user.index');
|
||||
}
|
||||
|
||||
public function edit(UserDetail $userDetail)
|
||||
{
|
||||
return Inertia::render('AdminPanel/UserDetail/Edit', compact('userDetail'));
|
||||
}
|
||||
|
||||
public function update(UserDetail $userDetail, UpdateRequest $request)
|
||||
{
|
||||
$data = $request->validated();
|
||||
if ($request->file('photo')) {
|
||||
$data['photo'] = $this->storePhoto($request->file('photo'));
|
||||
}
|
||||
$userDetail->update($data);
|
||||
return redirect()->route('admin.user.index');
|
||||
}
|
||||
|
||||
private function storePhoto(UploadedFile $file)
|
||||
{
|
||||
if ($file->isValid()) {
|
||||
$image = $file;
|
||||
// Генерируем уникальное имя файла, чтобы избежать конфликтов
|
||||
$filename = md5(Carbon::now() . '_' . $image->getClientOriginalName()) . '.' . $image->getClientOriginalExtension();
|
||||
// Сохраняем изображение в директорию public
|
||||
ImageTool::configure(['driver' => 'imagick']);
|
||||
ImageTool::make($image)
|
||||
->resize(1200, null, function ($constraint) {
|
||||
$constraint->aspectRatio();
|
||||
$constraint->upsize();
|
||||
})
|
||||
->save(storage_path('app/public/photos/' . $filename));
|
||||
$path = "/storage/photos/" . $filename;
|
||||
// Генерируем URL для доступа к изображению
|
||||
return $path;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Resources\ClientNavigationResource;
|
||||
use App\Http\Resources\MainSectionResource;
|
||||
use App\Models\MainSection;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class NavigateController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return ClientNavigationResource::collection(MainSection::with('subSections.pages')->orderBy('sort', 'asc')->get());
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user