From cac319fa8184cea141d32721419c7c4d0e54a15c Mon Sep 17 00:00:00 2001 From: F4ilji Date: Mon, 14 Apr 2025 19:24:18 +0500 Subject: [PATCH] fixing search module, and schedule module --- .../Resources/EducationalGroupResource.php | 17 +++-- .../Resources/PostResource/Pages/EditPost.php | 2 +- app/Filament/Resources/ScheduleResource.php | 37 ++++------ .../Controllers/ClientProgramController.php | 31 ++++++--- .../Controllers/ClientScheduleController.php | 10 +-- app/Http/Controllers/SearchController.php | 24 +++++-- app/Models/Schedule.php | 10 +-- resources/js/Enum/BudgetEducation.js | 4 ++ resources/js/Enum/EducationForm.js | 2 - resources/js/Pages/Client/Programs/Index.vue | 22 ++++-- resources/js/Pages/Client/Schedules/Index.vue | 69 ++++++++++++------- resources/js/assets/icons/icons.js | 56 +++++++++++++++ .../components/Items/BasicResultItem.vue | 42 +++++++++++ .../Items/ResultAdditionalEducationItem.vue | 33 ++++----- .../Items/ResultEducationalGroupItem.vue | 42 +++++++---- .../Items/ResultEducationalProgramItem.vue | 33 ++++----- .../components/Items/ResultEventItem.vue | 35 ++++------ .../components/Items/ResultFacultyItem.vue | 33 ++++----- .../components/Items/ResultPagetItem.vue | 48 +++++++------ .../components/Items/ResultPersonItem.vue | 32 ++++----- .../components/Items/ResultPostItem.vue | 36 ++++------ .../features/search/components/ResultList.vue | 7 +- .../components/MainBodyResultItem.vue | 47 +++++++++++++ .../shared/badge/BasicListBadge.vue | 7 +- .../shared/badge/badges/EduBudgetBadge.vue | 48 +++++++++++++ 25 files changed, 470 insertions(+), 257 deletions(-) create mode 100644 resources/js/componentss/features/search/components/Items/BasicResultItem.vue create mode 100644 resources/js/componentss/features/search/components/components/MainBodyResultItem.vue create mode 100644 resources/js/componentss/shared/badge/badges/EduBudgetBadge.vue diff --git a/app/Filament/Resources/EducationalGroupResource.php b/app/Filament/Resources/EducationalGroupResource.php index dbf0871..fa72cb4 100644 --- a/app/Filament/Resources/EducationalGroupResource.php +++ b/app/Filament/Resources/EducationalGroupResource.php @@ -65,6 +65,11 @@ class EducationalGroupResource extends Resource ]); } + public static function getEloquentQuery(): Builder + { + return parent::getEloquentQuery()->with('faculty'); + } + public static function table(Table $table): Table { return $table @@ -81,14 +86,11 @@ class EducationalGroupResource extends Resource ->searchable() ->description(fn ($record) => $record->faculty->title ?? ''), - BadgeColumn::make('education_form_id') + TextColumn::make('education_form_id') ->label('Форма обучения') - ->formatStateUsing(fn ($state) => FormEducation::tryFrom($state)?->label()) - ->color(fn ($state) => match($state) { - FormEducation::FULL_TIME->value => 'success', - FormEducation::PART_TIME->value => 'warning', - default => 'gray', - }) + ->badge() + ->formatStateUsing(fn ($state) => FormEducation::tryFrom($state)?->getLabel()) + ->color(fn ($state) => FormEducation::tryFrom($state)?->getColor()) ->sortable(), TextColumn::make('created_at') @@ -97,6 +99,7 @@ class EducationalGroupResource extends Resource ->sortable() ->toggleable(), ]) + ->filters([ Tables\Filters\SelectFilter::make('faculty_id') ->label('Факультет') diff --git a/app/Filament/Resources/PostResource/Pages/EditPost.php b/app/Filament/Resources/PostResource/Pages/EditPost.php index 2d16bc3..7a190c3 100644 --- a/app/Filament/Resources/PostResource/Pages/EditPost.php +++ b/app/Filament/Resources/PostResource/Pages/EditPost.php @@ -30,7 +30,7 @@ class EditPost extends EditRecord protected function mutateFormDataBeforeFill(array $data): array { $post = Post::query()->with(['seo', 'slide'])->find($data['id']); - $data['slide'] = $post->slide->toArray() ?? null; + $data['slide'] = $post->slide ? $post->slide->toArray() : null; return $data; } diff --git a/app/Filament/Resources/ScheduleResource.php b/app/Filament/Resources/ScheduleResource.php index b617227..70504d6 100644 --- a/app/Filament/Resources/ScheduleResource.php +++ b/app/Filament/Resources/ScheduleResource.php @@ -2,6 +2,7 @@ namespace App\Filament\Resources; +use App\Enums\FormEducation; use App\Filament\Resources\ScheduleResource\Pages; use App\Models\EducationalGroup; use App\Models\Schedule; @@ -48,16 +49,6 @@ class ScheduleResource extends Resource ->required() ->live() ->helperText('Выберите группу для которой создается расписание'), - - Toggle::make('is_zaoch') - ->label('Форма обучения') - ->inline(false) - ->onColor('success') - ->offColor('primary') - ->helperText('Очная | Заочная') - ->afterStateHydrated(function (Toggle $component, $state) { - $component->state((bool) $state); - }), ]), ]), @@ -91,10 +82,11 @@ class ScheduleResource extends Resource fn (TemporaryUploadedFile $file): string => str(Str::slug(pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME) . '-' . Carbon::now()->timestamp) . '.' . $file->getClientOriginalExtension() ) - ->afterStateUpdated(function ($set, $state) { - $set('title', pathinfo($state?->getClientOriginalName(), PATHINFO_FILENAME)); - }) - ->visibility('public')), + ) + ->afterStateUpdated(function ($set, $state) { + $set('title', pathinfo($state?->getClientOriginalName(), PATHINFO_FILENAME)); + }) + ->visibility('public'), ]) ->itemLabel(fn (array $state): ?string => $state['title'] ?? 'Новый файл') ->collapsible() @@ -108,7 +100,7 @@ class ScheduleResource extends Resource { return $table ->columns([ - TextColumn::make('educational_group.title') + TextColumn::make('educationalGroup.title') ->label('Учебная группа') ->sortable() ->searchable(), @@ -118,13 +110,11 @@ class ScheduleResource extends Resource ->getStateUsing(fn ($record) => count($record->file ?? [])) ->badge(), - IconColumn::make('is_zaoch') - ->label('Форма обучения') - ->boolean() - ->trueIcon('heroicon-o-academic-cap') - ->falseIcon('heroicon-o-building-office') - ->trueColor('success') - ->falseColor('primary'), + TextColumn::make('educationalGroup.education_form_id') + ->formatStateUsing(fn ($state) => FormEducation::tryFrom($state)->getLabel()) + ->color(fn ($state) => FormEducation::tryFrom($state)?->getColor()) + ->badge() + ->label('Форма обучения'), TextColumn::make('updated_at') ->label('Обновлено') @@ -163,8 +153,7 @@ class ScheduleResource extends Resource ->emptyStateActions([ Tables\Actions\CreateAction::make() ->label('Добавить расписание'), - ]) - ->defaultSort('educational_group.title'); + ]); } public static function getRelations(): array diff --git a/app/Http/Controllers/ClientProgramController.php b/app/Http/Controllers/ClientProgramController.php index 362bddb..29e8804 100644 --- a/app/Http/Controllers/ClientProgramController.php +++ b/app/Http/Controllers/ClientProgramController.php @@ -9,6 +9,7 @@ use App\Enums\LevelEducational; use App\Http\Resources\DirectionStudyResource; use App\Http\Resources\EducationalProgramFullResource; use App\Models\AdmissionCampaign; +use App\Models\AdmissionPlan; use App\Models\DirectionStudy; use App\Models\EducationalProgram; use App\Services\App\Seo\SeoPageProvider; @@ -39,19 +40,33 @@ class ClientProgramController extends Controller }); $formsEdu = Cache::remember($cacheKeyForms, now()->addDay(), function () { - return collect(FormEducation::cases()) - ->mapWithKeys(fn($form) => [$form->name => $form->getLabel()]); + return AdmissionPlan::distinct() + ->pluck('contests') + ->flatten(1) + ->filter(fn ($item) => isset($item['form_education'])) + ->pluck('form_education') + ->unique() + ->map(fn ($item) => FormEducation::tryFrom((int)$item)) + ->filter() + ->mapWithKeys(fn ($form) => [$form->name => $form->getLabel()]); }); + $budgetEdu = Cache::remember($cacheKeyBudgets, now()->addDay(), function () { - return collect(BudgetEducation::cases()) - ->mapWithKeys(fn($type) => [$type->name => $type->getLabel()]); + return AdmissionPlan::distinct() + ->pluck('contests') + ->flatten(1) + ->filter(fn ($item) => isset($item['places']['form_budget'])) + ->pluck('places.form_budget') + ->unique() + ->map(fn ($item) => BudgetEducation::tryFrom($item)) + ->filter() + ->mapWithKeys(fn ($form) => [$form->name => $form->getLabel()]); }); $seo = Cache::remember($cacheKeySeo, now()->addDay(), function () { return $this->seoPageProvider->getSeoForCurrentPage(); }); - ; $naprs = Cache::remember($cacheKey, now()->addHours(), function () use ($request, $activeCampaign) { return DirectionStudyResource::collection( @@ -144,16 +159,16 @@ class ClientProgramController extends Controller }]); } - private function applyBudgetFilter($query, $budget) + private function applyBudgetFilter($query, $budget): void { $budgetValue = Str::of(BudgetEducation::fromName($budget)->value)->toString(); $query->whereHas('programs.admission_plans', function ($query) use ($budgetValue) { - $query->whereJsonContains('contests', ['financing_source' => $budgetValue]); + $query->where('contests', 'like', '%"form_budget":"'.$budgetValue.'"%'); }) ->with(['programs' => function ($query) use ($budgetValue) { $query->whereHas('admission_plans', function ($query) use ($budgetValue) { - $query->whereJsonContains('contests', ['financing_source' => $budgetValue]); + $query->where('contests', 'like', '%"form_budget":"'.$budgetValue.'"%'); }); }]); } diff --git a/app/Http/Controllers/ClientScheduleController.php b/app/Http/Controllers/ClientScheduleController.php index 0be3318..972973e 100644 --- a/app/Http/Controllers/ClientScheduleController.php +++ b/app/Http/Controllers/ClientScheduleController.php @@ -39,14 +39,11 @@ class ClientScheduleController extends Controller ->get()); $schedulesByFaculty = $educationalGroups->groupBy(function ($group) { - return $group->faculty->title; // Предполагаем, что у факультета есть поле 'name' + return $group->faculty->title; }); $schedulesByFaculty = $schedulesByFaculty->toArray(); - if ($request->has('favorite') && empty($request->input('favorite'))) { - $schedulesByFaculty = []; - } $forms_education = []; @@ -55,11 +52,6 @@ class ClientScheduleController extends Controller } $filters = [ - 'direction_filter' => [ - 'type' => 'direction', - 'value' => request()->input('direction'), - 'param' => 'direction' - ], 'form_education_filter' => [ 'type' => 'form', 'value' => request()->input('form'), diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php index b2e2655..8cfcbe1 100644 --- a/app/Http/Controllers/SearchController.php +++ b/app/Http/Controllers/SearchController.php @@ -77,7 +77,7 @@ class SearchController extends Controller $resources = $this->sortResourcesByCategory($resources, $request->query('category')); } - $paginate_data = $this->createPaginate($resources, $request, 10); + $paginate_data = $this->createPaginate($resources, $request, 7); $sortedData = $this->sortByType($paginate_data['paginator'], $req); @@ -114,14 +114,24 @@ class SearchController extends Controller private function getMatches(string $haystack, string $needle): array { $matches = []; +// 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'); +// } + $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'); + if (($offset = mb_strpos($haystack, $needle, $offset, 'UTF-8')) !== false) { + for ($i = 0; 1 > count($matches); $i++) { + $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; + } } + return $matches; } diff --git a/app/Models/Schedule.php b/app/Models/Schedule.php index 7999e61..69fcc1a 100644 --- a/app/Models/Schedule.php +++ b/app/Models/Schedule.php @@ -15,15 +15,15 @@ class Schedule extends Model 'file' => 'array', ]; - public function subSchedules() - { - return $this->hasMany(SubSchedule::class); - } - public function faculty() { return $this->belongsTo(Faculty::class); } + public function educationalGroup(): \Illuminate\Database\Eloquent\Relations\BelongsTo + { + return $this->belongsTo(EducationalGroup::class); + } + } diff --git a/resources/js/Enum/BudgetEducation.js b/resources/js/Enum/BudgetEducation.js index 928560f..b0b4540 100644 --- a/resources/js/Enum/BudgetEducation.js +++ b/resources/js/Enum/BudgetEducation.js @@ -101,6 +101,10 @@ class EducationForm { this.DETAILED_TARGET_QUOTA ]; } + + getName() { + return this.name; + } } export default EducationForm; \ No newline at end of file diff --git a/resources/js/Enum/EducationForm.js b/resources/js/Enum/EducationForm.js index b55f0e7..24ba4d2 100644 --- a/resources/js/Enum/EducationForm.js +++ b/resources/js/Enum/EducationForm.js @@ -12,8 +12,6 @@ class EducationForm { return Object.values(this).find(item => item.value == value) || null; } - - // Метод для получения имени getName() { return this.name; } diff --git a/resources/js/Pages/Client/Programs/Index.vue b/resources/js/Pages/Client/Programs/Index.vue index 48f67d5..9fec871 100644 --- a/resources/js/Pages/Client/Programs/Index.vue +++ b/resources/js/Pages/Client/Programs/Index.vue @@ -14,10 +14,12 @@ import BasicPageContainer from "@/componentss/ui/templates/BasicPageContainer.vu import AcademicJournalsListBreadcrumbs from "@/componentss/features/academicJournals/components/AcademicJournalsListBreadcrumbs.vue.vue"; import BasicPageWrapper from "@/componentss/ui/wrappers/BasicPageWrapper.vue"; +import BasicListBadge from "@/componentss/shared/badge/BasicListBadge.vue"; export default { name: "Index", components: { + BasicListBadge, BasicPageWrapper, AcademicJournalsListBreadcrumbs, BasicPageContainer, ProgramLevelEduFilter, FormEducationalFilter, @@ -32,10 +34,10 @@ export default { Link, Head, }, - data() { - return { - - }; + computed: { + hasActiveFilters() { + return this.filters.budget_filter.value || this.filters.direction_filter.value || this.filters.formEdu_filter.value; + } }, props: { campaignName: { @@ -98,7 +100,7 @@ export default {
-
+
@@ -110,7 +112,15 @@ export default {
-
+ +
+ +
+ +
+
+ +