From a4bdde6382794c5cbbed453d93dd544b1e4b6c5e Mon Sep 17 00:00:00 2001 From: F4ilji Date: Sun, 27 Jul 2025 12:52:04 +0500 Subject: [PATCH] refactor educational components and API routes; update form handling in various actions and Vue components, enhance user interface for form display, and improve data retrieval logic in CreateAdmissionPlan job --- .../GetAdditionalEducationBySlugAction.php | 5 +- .../Actions/GetEducationalProgramAction.php | 10 +- .../Education/Jobs/CreateAdmissionPlan.php | 137 ++++++++++ .../Education/Jobs/CreateDirectionStudy.php | 67 +++++ .../Jobs/CreateEducationalProgram.php | 83 ++++++ .../Jobs/UpdateAdmissionCampaign.php | 28 ++ ...dateAdmissionCampaignDataApiController.php | 77 ++++++ .../UpdateAdmissionPlansDataApiController.php | 5 +- .../UpdateEduDataApiController.php | 4 +- .../Education/UI/API/Routes/api.php | 2 + app/Filament/Components/Forms/PageForm.php | 15 +- .../Pages/EditAdmissionCampaign.php | 45 ++++ app/Http/Middleware/AccessCheck.php | 2 +- app/Jobs/CreateAdmissionPlan.php | 4 +- .../Client/Additional-educations/Show.vue | 12 +- resources/js/Pages/Client/Programs/Show.vue | 60 +++++ resources/js/Pages/Page.vue | 170 ++++++++---- .../js/componentss/features/forms/Form.vue | 58 ++++ .../components/builder/FormModalBuilder.vue | 247 ++++++++++++++++++ .../blocks/EducationalChoiceBlock.vue | 2 +- 20 files changed, 961 insertions(+), 72 deletions(-) create mode 100644 app/Containers/Education/Jobs/CreateAdmissionPlan.php create mode 100644 app/Containers/Education/Jobs/CreateDirectionStudy.php create mode 100644 app/Containers/Education/Jobs/CreateEducationalProgram.php create mode 100644 app/Containers/Education/Jobs/UpdateAdmissionCampaign.php create mode 100644 app/Containers/Education/UI/API/Controllers/UpdateAdmissionCampaignDataApiController.php create mode 100644 resources/js/componentss/features/forms/Form.vue create mode 100644 resources/js/componentss/features/forms/components/builder/FormModalBuilder.vue diff --git a/app/Containers/AdditionalEducation/Actions/GetAdditionalEducationBySlugAction.php b/app/Containers/AdditionalEducation/Actions/GetAdditionalEducationBySlugAction.php index 85ca9d6..9ebd44c 100644 --- a/app/Containers/AdditionalEducation/Actions/GetAdditionalEducationBySlugAction.php +++ b/app/Containers/AdditionalEducation/Actions/GetAdditionalEducationBySlugAction.php @@ -4,7 +4,6 @@ namespace App\Containers\AdditionalEducation\Actions; use App\Containers\AdditionalEducation\Data\Resources\AdditionalEducationResource; use App\Containers\AdditionalEducation\Tasks\FindAdditionalEducationBySlugTask; -use App\Ship\Actions\Action; use App\Ship\Contracts\SeoServiceInterface; use Illuminate\Http\Request; @@ -22,8 +21,8 @@ class GetAdditionalEducationBySlugAction $settingsPage = $request->attributes->get('settings_page') ?? []; - if (array_key_exists('custom_form', $settingsPage)) { - $form = $settingsPage['custom_form']; + if (array_key_exists('form', $settingsPage)) { + $form = $settingsPage['form']; } else { $form = null; } diff --git a/app/Containers/Education/Actions/GetEducationalProgramAction.php b/app/Containers/Education/Actions/GetEducationalProgramAction.php index 82d11d2..757a750 100644 --- a/app/Containers/Education/Actions/GetEducationalProgramAction.php +++ b/app/Containers/Education/Actions/GetEducationalProgramAction.php @@ -23,8 +23,16 @@ class GetEducationalProgramAction $formsEdu = $this->getEducationalFormsTask->run(); $seo = $this->getSeoForModelTask->run($this->seoPageProvider, $programModel); + $settingsPage = request()->attributes->get('settings_page') ?? []; + + if (array_key_exists('form', $settingsPage)) { + $form = $settingsPage['form']; + } else { + $form = null; + } + $program = new EducationalProgramResource($programModel); - return compact('program', 'formsEdu', 'seo'); + return compact('program', 'formsEdu', 'seo', 'form'); } } diff --git a/app/Containers/Education/Jobs/CreateAdmissionPlan.php b/app/Containers/Education/Jobs/CreateAdmissionPlan.php new file mode 100644 index 0000000..61ea6f5 --- /dev/null +++ b/app/Containers/Education/Jobs/CreateAdmissionPlan.php @@ -0,0 +1,137 @@ +admissionPlanService = app(AdmissionPlanService::class); + } + + /** + * Execute the job. + */ + public function handle(): void + { + AdmissionPlan::truncate(); + try { + $items = $this->admissionPlanService->getCampaigns(); + + if (empty($items)) { + Log::warning('Empty campaigns list received'); + return; // или обработка пустого случая + } + + $campaign = $this->admissionPlanService->findActiveCampaign($items); + + if (empty($campaign)) { + Log::warning('No active campaign found in the list'); + return; + } + + $levels_codes = $this->admissionPlanService->getLevelEducationCodes($campaign); + + if (empty($levels_codes)) { + Log::warning('No education level codes found for campaign'); + return; + } + + foreach ($levels_codes as $code) { + $admissionPlans = $this->admissionPlanService->getAdmissionPlans($code); + + // Проверка на пустой результат или отсутствие нужного свойства + if (empty($admissionPlans) || !isset($admissionPlans->competitons_groups)) { + Log::warning("Empty admission plans or missing property for code: {$code}", [ + 'admissionPlans' => $admissionPlans + ]); + continue; + } + + $filteredPlans = $this->admissionPlanService->filterEmptyNaprOrProg($admissionPlans->competitons_groups); + + if (empty($filteredPlans)) { + Log::info("No valid plans after filtering for code: {$code}"); + continue; + } + + $items = $this->admissionPlanService->transformData($filteredPlans); + + if (empty($items)) { + Log::info("No items after transformation for code: {$code}"); + continue; + } + + foreach ($items as $item) { + // Проверка структуры $item + if (!isset($item['id'], $item['plan']->competitions, $item['plan']->exams)) { + Log::warning("Invalid item structure", ['item' => $item]); + continue; + } + + $eduPrograms = EducationalProgram::where('inner_code', $item['id'])->get(); + + if ($eduPrograms->isEmpty()) { + Log::info("No educational programs found for inner_code: {$item['id']}"); + continue; + } + + try { + $contestData = $this->admissionPlanService->convertToSaveContestData($item['plan']->competitions); + $examData = $this->admissionPlanService->convertToSaveExamData($item['plan']->exams); + + foreach ($eduPrograms as $eduProgram) { + $eduProgram->admission_plans()->updateOrCreate([ + 'admission_campaigns_id' => $this->getActiveCampaign()->id, + 'exams' => $examData, + 'contests' => $contestData, + ]); + } + } catch (\Exception $e) { + Log::error("Error processing admission plan for item: {$item['id']}", [ + 'error' => $e->getMessage(), + 'item' => $item + ]); + continue; + } + } + } + } catch (\Exception $e) { + Log::error('Error in admission plans processing', [ + 'error' => $e->getMessage(), + 'trace' => $e->getTraceAsString() + ]); + } + } + + + private function getActiveCampaign() + { + $activeCampaign = AdmissionCampaign::where('status', 1)->first(); + + if (!$activeCampaign) { + throw new \Exception('No active admission campaign found'); + } + + return $activeCampaign; + } +} \ No newline at end of file diff --git a/app/Containers/Education/Jobs/CreateDirectionStudy.php b/app/Containers/Education/Jobs/CreateDirectionStudy.php new file mode 100644 index 0000000..754639a --- /dev/null +++ b/app/Containers/Education/Jobs/CreateDirectionStudy.php @@ -0,0 +1,67 @@ +directionStudyService = new DirectionStudyService(); + } + + /** + * Execute the job. + */ + public function handle(): void + { + $naprs = []; + $naprsUuid = $this->directionStudyService->getAllNaprsUuid(); + foreach ($naprsUuid as $uuid) { + array_push($naprs, $this->directionStudyService->getNapr($uuid)); + } + foreach ($naprs as $napr) { + $slug = $this->generateUniqueSlug($napr->name_napr, DirectionStudy::class, LevelEducational::from($napr->lvl_edu)); + + DirectionStudy::updateOrCreate( + ['uuid' => $napr->uuid], + [ + 'name' => $napr->name_napr, + 'slug' => $slug, + 'code' => $napr->kod_napr, + 'lvl_edu' => $napr->lvl_edu, + ] + ); + }; + } + + private function generateUniqueSlug($name, $model, $levelEducational) { + $slug = Str::slug($name); + $originalSlug = $slug; + $slug = $originalSlug . '-' . Str::lower($levelEducational->name); + $count = 1; + + while ($model::where('slug', $slug)->exists()) { + $slug = $originalSlug . '-' . $count; + $count++; + } + return $slug; + } +} diff --git a/app/Containers/Education/Jobs/CreateEducationalProgram.php b/app/Containers/Education/Jobs/CreateEducationalProgram.php new file mode 100644 index 0000000..b39d957 --- /dev/null +++ b/app/Containers/Education/Jobs/CreateEducationalProgram.php @@ -0,0 +1,83 @@ +educatinalProgramService = app(EducationalProgramService::class); + } + + /** + * Execute the job. + */ + public function handle(): void + { + $programs = []; + $programsUuid = $this->educatinalProgramService->getAllProgramsUuid(); + + foreach ($programsUuid as $uuid) { + $program = $this->educatinalProgramService->getProgram($uuid); + if ($program !== null) { + array_push($programs, $program); + } else { + Log::error("Не удалось получить данные о программе с UUID: $uuid"); + } + } + + foreach ($programs as $program) { + $direction = DirectionStudy::where('uuid', $program->napr_uuid)->first(); + if ($direction !== null) { + $slug = $this->generateUniqueSlug($program->name_op, EducationalProgram::class, LevelEducational::from($program->lvl_edu)); + EducationalProgram::updateOrCreate( + ['uuid' => $program->uuid], + [ + 'name' => $program->name_op, + 'slug' => $slug, // Добавляем slug + 'inner_code' => $program->inner_code, + 'lvl_edu' => $program->lvl_edu, + 'status' => $program->status, + 'learning_forms' => $program->learning_forms, + 'direction_study_id' => $direction->id, + ] + ); + } else { + Log::error("Не удалось найти направление обучения с UUID: {$program->napr_uuid}"); + } + } + } + + private function generateUniqueSlug($name, $model, $levelEducational) { + $slug = Str::slug($name); + $originalSlug = $slug; + $slug = $originalSlug . '-' . Str::lower($levelEducational->name); + $count = 1; + + while ($model::where('slug', $slug)->exists()) { + $slug = $originalSlug . '-' . $count; + $count++; + } + return $slug; + } +} \ No newline at end of file diff --git a/app/Containers/Education/Jobs/UpdateAdmissionCampaign.php b/app/Containers/Education/Jobs/UpdateAdmissionCampaign.php new file mode 100644 index 0000000..f79f805 --- /dev/null +++ b/app/Containers/Education/Jobs/UpdateAdmissionCampaign.php @@ -0,0 +1,28 @@ +find($this->id); +// $ap = AdmissionPlan::query()->all(); +// $uep = $ap-> + } +} \ No newline at end of file diff --git a/app/Containers/Education/UI/API/Controllers/UpdateAdmissionCampaignDataApiController.php b/app/Containers/Education/UI/API/Controllers/UpdateAdmissionCampaignDataApiController.php new file mode 100644 index 0000000..e059d65 --- /dev/null +++ b/app/Containers/Education/UI/API/Controllers/UpdateAdmissionCampaignDataApiController.php @@ -0,0 +1,77 @@ +updateAdmissionCampaignData($id); + return redirect()->route('index'); + } + + private function updateAdmissionCampaignData($id) : void + { + $ac = AdmissionCampaign::query()->find($id); + $ap = AdmissionPlan::with('educationalProgram')->get(); + $info = []; + + $ap->map(function ($item) use (&$info) { + $lvlEduKey = is_object($item->educationalProgram->lvl_edu) + ? $item->educationalProgram->lvl_edu->value + : $item->educationalProgram->lvl_edu; + + // Инициализируем поля для нового ключа, если он еще не существует + if (!isset($info[$lvlEduKey])) { + $info[$lvlEduKey] = [ + 'total_programs' => 0, + 'och_count' => 0, + 'zaoch_count' => 0, + 'budget_places' => 0, + 'non_budget_places' => 0 + ]; + } + + // Увеличиваем счетчик total_programs + $info[$lvlEduKey]['total_programs'] += 1; + + // Итерируемся по contests и агрегируем данные + // Передаем $info и $lvlEduKey по ссылке во внутреннее замыкание + foreach ($item->contests as $contest) { + $formEdu = $contest['form_education']; + $formBudget = $contest['places']['form_budget']; + $places = $contest['places']['count']; + + // Агрегируем значения + $info[$lvlEduKey]['och_count'] += ($formEdu == 1) ? $places : 0; + $info[$lvlEduKey]['zaoch_count'] += ($formEdu == 3) ? $places : 0; + $info[$lvlEduKey]['budget_places'] += ($formBudget == 1) ? $places : 0; + $info[$lvlEduKey]['non_budget_places'] += ($formBudget == 4) ? $places : 0; + } + }); + + $result = []; + + foreach ($info as $edu_name_key => $data) { + // Создаем новый массив, добавляя 'edu_name' как свойство + $data['edu_name'] = $edu_name_key; + + // Добавляем преобразованный массив в результат + $result[] = $data; + } + $ac->update(['info' => $result]); + // dispatch(new UpdateAdmissionCampaign($id)); + } +} diff --git a/app/Containers/Education/UI/API/Controllers/UpdateAdmissionPlansDataApiController.php b/app/Containers/Education/UI/API/Controllers/UpdateAdmissionPlansDataApiController.php index 8210854..86048e5 100644 --- a/app/Containers/Education/UI/API/Controllers/UpdateAdmissionPlansDataApiController.php +++ b/app/Containers/Education/UI/API/Controllers/UpdateAdmissionPlansDataApiController.php @@ -2,11 +2,8 @@ namespace App\Containers\Education\UI\API\Controllers; +use App\Containers\Education\Jobs\CreateAdmissionPlan; use App\Http\Controllers\Controller; -use App\Jobs\CreateAdmissionPlan; -use App\Jobs\CreateDirectionStudy; -use App\Jobs\CreateEducationalProgram; -use App\Services\Vicon\EducationalProgram\EducationalProgramService; class UpdateAdmissionPlansDataApiController extends Controller { diff --git a/app/Containers/Education/UI/API/Controllers/UpdateEduDataApiController.php b/app/Containers/Education/UI/API/Controllers/UpdateEduDataApiController.php index 0e6c5a3..54749e8 100644 --- a/app/Containers/Education/UI/API/Controllers/UpdateEduDataApiController.php +++ b/app/Containers/Education/UI/API/Controllers/UpdateEduDataApiController.php @@ -2,9 +2,9 @@ namespace App\Containers\Education\UI\API\Controllers; +use App\Containers\Education\Jobs\CreateDirectionStudy; +use App\Containers\Education\Jobs\CreateEducationalProgram; use App\Http\Controllers\Controller; -use App\Jobs\CreateDirectionStudy; -use App\Jobs\CreateEducationalProgram; class UpdateEduDataApiController extends Controller { diff --git a/app/Containers/Education/UI/API/Routes/api.php b/app/Containers/Education/UI/API/Routes/api.php index 94d5146..739e29c 100644 --- a/app/Containers/Education/UI/API/Routes/api.php +++ b/app/Containers/Education/UI/API/Routes/api.php @@ -1,6 +1,7 @@ name('academic.ye Route::middleware(['web', 'superadmin'])->group(function () { Route::get('/get-edu-program-data', [UpdateEduDataApiController::class, 'index']); Route::get('/get-admission-plans-data', [UpdateAdmissionPlansDataApiController::class, 'index']); + Route::get('/update-admission-campaign-data/{id}', [UpdateAdmissionCampaignDataApiController::class, 'update']); }); diff --git a/app/Filament/Components/Forms/PageForm.php b/app/Filament/Components/Forms/PageForm.php index d66cec3..5f82a1e 100644 --- a/app/Filament/Components/Forms/PageForm.php +++ b/app/Filament/Components/Forms/PageForm.php @@ -142,12 +142,21 @@ class PageForm ->label('Скрыть хлебные крошки') ->helperText('Скрывает навигационную цепочку вверху страницы') ->columnSpan(1), - Select::make('settings.custom_form')->label('Прикрепить форму для страницы') + ]) + ->columns(2), + Section::make('Отображение плавающей формы на странице') + ->description('Управление плавающей формой на странице') + ->collapsible() + ->schema([ + Select::make('settings.form.id')->label('Прикрепить форму для страницы') ->searchable() ->preload() ->options(CustomForm::query() ->where('status', CustomFormStatus::PUBLISHED)->pluck('title', 'form_id')) - ->columnSpanFull() + ->columnSpanFull(), + Textinput::make('settings.form.title')->label('Заголовок плавающего окна'), + Textinput::make('settings.form.description')->label('Описание плавающего окна'), + Textinput::make('settings.form.button')->label('Текст кнопки'), ]) ->columns(2), ]), @@ -155,4 +164,4 @@ class PageForm ]) ]); } -} \ No newline at end of file +} diff --git a/app/Filament/Resources/AdmissionCampaignResource/Pages/EditAdmissionCampaign.php b/app/Filament/Resources/AdmissionCampaignResource/Pages/EditAdmissionCampaign.php index b6d5749..e101bdb 100644 --- a/app/Filament/Resources/AdmissionCampaignResource/Pages/EditAdmissionCampaign.php +++ b/app/Filament/Resources/AdmissionCampaignResource/Pages/EditAdmissionCampaign.php @@ -4,6 +4,7 @@ namespace App\Filament\Resources\AdmissionCampaignResource\Pages; use App\Filament\Resources\AdmissionCampaignResource; use Filament\Actions; +use Filament\Notifications\Notification; use Filament\Resources\Pages\EditRecord; class EditAdmissionCampaign extends EditRecord @@ -13,6 +14,50 @@ class EditAdmissionCampaign extends EditRecord protected function getHeaderActions(): array { return [ + Actions\Action::make('fetchData') // Кастомная кнопка + ->label('Обновить данные о местах набора') + ->color('primary') // Цвет кнопки + ->icon('heroicon-o-arrow-path') // Иконка + ->action(function () { + // Отправляем запрос в фоновом режиме + $this->js(<< response.json()) + .then(() => { + // Показываем уведомление об успешном завершении + window.dispatchEvent(new CustomEvent('filament-notify', { + detail: { + type: 'success', + title: 'Данные обновлены', + body: 'Данные успешно обновлены.' + } + })); + }) + .catch(() => { + // Показываем уведомление об ошибке + window.dispatchEvent(new CustomEvent('filament-notify', { + detail: { + type: 'danger', + title: 'Ошибка', + body: 'Произошла ошибка при обновлении данных.' + } + })); + }); + JS); + + // Показываем уведомление + Notification::make() + ->title('Данные обновляются') + ->body('Данные обновляются в фоновом режиме.') + ->success() + ->send(); + }), Actions\DeleteAction::make(), ]; } diff --git a/app/Http/Middleware/AccessCheck.php b/app/Http/Middleware/AccessCheck.php index f00b2d5..b5d2e46 100644 --- a/app/Http/Middleware/AccessCheck.php +++ b/app/Http/Middleware/AccessCheck.php @@ -35,4 +35,4 @@ class AccessCheck // Если все проверки пройдены, продолжаем выполнение запроса return $next($request); } -} \ No newline at end of file +} diff --git a/app/Jobs/CreateAdmissionPlan.php b/app/Jobs/CreateAdmissionPlan.php index 87e3db5..68ed23d 100644 --- a/app/Jobs/CreateAdmissionPlan.php +++ b/app/Jobs/CreateAdmissionPlan.php @@ -3,6 +3,7 @@ namespace App\Jobs; use App\Containers\Education\Models\AdmissionCampaign; +use App\Containers\Education\Models\AdmissionPlan; use App\Containers\Education\Models\EducationalProgram; use App\Services\Vicon\DirectionStudy\AdmissionPlanService; use Illuminate\Bus\Queueable; @@ -32,6 +33,7 @@ class CreateAdmissionPlan implements ShouldQueue */ public function handle(): void { + AdmissionPlan::truncate(); try { $items = $this->admissionPlanService->getCampaigns(); @@ -98,7 +100,7 @@ class CreateAdmissionPlan implements ShouldQueue $examData = $this->admissionPlanService->convertToSaveExamData($item['plan']->exams); foreach ($eduPrograms as $eduProgram) { - $eduProgram->admission_plans()->create([ + $eduProgram->admission_plans()->updateOrCreate([ 'admission_campaigns_id' => $this->getActiveCampaign()->id, 'exams' => $examData, 'contests' => $contestData, diff --git a/resources/js/Pages/Client/Additional-educations/Show.vue b/resources/js/Pages/Client/Additional-educations/Show.vue index 7e53370..8ffa0cb 100644 --- a/resources/js/Pages/Client/Additional-educations/Show.vue +++ b/resources/js/Pages/Client/Additional-educations/Show.vue @@ -18,11 +18,13 @@ import FormBuilder from "@/componentss/shared/builder/formBuilder/FormBuilder.vu import BreadcrumbsItem from "@/componentss/shared/Breadcrumbs/BreadcrumbsItem.vue"; import BasicIcon from "@/componentss/ui/icons/BasicIcon.vue"; import BaseBreadcrumbs from "@/componentss/shared/Breadcrumbs/BaseBreadcrumbs.vue"; +import Form from "@/componentss/features/forms/Form.vue"; export default { name: "Show", components: { + Form, BaseBreadcrumbs, BasicIcon, BreadcrumbsItem, FormBuilder, @@ -193,7 +195,7 @@ export default {
@@ -238,7 +240,7 @@ export default {
- +
@@ -251,4 +253,4 @@ export default { - \ No newline at end of file + diff --git a/resources/js/Pages/Client/Programs/Show.vue b/resources/js/Pages/Client/Programs/Show.vue index 231224f..e22a063 100644 --- a/resources/js/Pages/Client/Programs/Show.vue +++ b/resources/js/Pages/Client/Programs/Show.vue @@ -15,6 +15,7 @@ import BasicPageWrapper from "@/componentss/ui/wrappers/BasicPageWrapper.vue"; import BasicPageContainer from "@/componentss/ui/templates/BasicPageContainer.vue"; import BreadcrumbsItem from "@/componentss/shared/Breadcrumbs/BreadcrumbsItem.vue"; import BaseBreadcrumbs from "@/componentss/shared/Breadcrumbs/BaseBreadcrumbs.vue"; +import Form from "@/componentss/features/forms/Form.vue"; export default { @@ -51,6 +52,7 @@ export default { } }, components: { + Form, BaseBreadcrumbs, BreadcrumbsItem, BasicPageContainer, BasicPageWrapper, @@ -76,6 +78,9 @@ export default { }, breadcrumbs: { type: Object + }, + form: { + type: String } }, } @@ -232,6 +237,61 @@ export default { +
+
+
+ +
+
+
+
+

+ {{ form?.description }} +

+
+ +
+
+
+
+
+
+
+
+ + + + diff --git a/resources/js/Pages/Page.vue b/resources/js/Pages/Page.vue index 7f30e3a..3c17aac 100644 --- a/resources/js/Pages/Page.vue +++ b/resources/js/Pages/Page.vue @@ -1,21 +1,35 @@ - + diff --git a/resources/js/componentss/features/forms/Form.vue b/resources/js/componentss/features/forms/Form.vue new file mode 100644 index 0000000..a6ac3e9 --- /dev/null +++ b/resources/js/componentss/features/forms/Form.vue @@ -0,0 +1,58 @@ + + + + + \ No newline at end of file diff --git a/resources/js/componentss/features/forms/components/builder/FormModalBuilder.vue b/resources/js/componentss/features/forms/components/builder/FormModalBuilder.vue new file mode 100644 index 0000000..34571f2 --- /dev/null +++ b/resources/js/componentss/features/forms/components/builder/FormModalBuilder.vue @@ -0,0 +1,247 @@ + + + + + diff --git a/resources/js/componentss/shared/builder/formBuilder/blocks/EducationalChoiceBlock.vue b/resources/js/componentss/shared/builder/formBuilder/blocks/EducationalChoiceBlock.vue index 4176994..7ad7056 100644 --- a/resources/js/componentss/shared/builder/formBuilder/blocks/EducationalChoiceBlock.vue +++ b/resources/js/componentss/shared/builder/formBuilder/blocks/EducationalChoiceBlock.vue @@ -8,7 +8,7 @@