File: D:/HostingSpaces/SBogers10/werkenbijanvil.komma.nl/app/Components/Types/FeaturedVacancies.php
<?php
namespace App\Components\Types;
use App\Buttons\Kms\ButtonService;
use App\Buttons\Models\Button;
use App\Components\ComponentTypes;
use App\Services\Models\Service;
use App\Vacancies\VacancyService;
use Illuminate\Database\Eloquent\Builder;
use Komma\KMS\Components\Component\ViewComponent;
use Komma\KMS\Components\ComponentType\Types\AbstractComponentType;
use Komma\KMS\Core\Attributes\MultiSelect;
use Komma\KMS\Core\Attributes\Numeric;
use Komma\KMS\Core\Attributes\TextField;
use Komma\KMS\Core\ModelService;
use TeamTNT\TNTSearch\Support\Collection;
class FeaturedVacancies extends AbstractComponentType
{
protected int $id = ComponentTypes::FEATURED_VACANCIES;
protected string $name = 'featured-vacancies';
public function defineAttributesAndTabs()
{
$buttonsService = app(ButtonService::class);
/** @var ModelService $serviceService */
$serviceService = app(ModelService::class);
$serviceService->setModelClassName(Service::class);
$serviceOptions = $serviceService->getOptionsForSelect(false);
$this->addItems([
(new TextField())
->setLabelText(__('KMS::attributes/components.title'))
->setReference('header'),
(new Numeric())
->setLabelText('Aantal vacatures')
->setValue(3)
->setWholeMin(1)
->setWholeMax(8)
->setReference('amount_of_vacancies')
->setExplanation('Alleen actieve vacatures aflopend'),
(new MultiSelect())
->setLabelText('Bedrijven')
->setItems($serviceOptions->toArray())
->canBeLinkedWith(Service::class)
->setReference('services'),
]);
}
public function prepare(ViewComponent $viewComponent)
{
$amountOfVacancies = (int) $viewComponent->amount_of_vacancies ?? 1;
$serviceIds = ($viewComponent->services ?? new Collection())->map(function(Service $service) {
return $service->id;
});
/** @var VacancyService $vacancyService */
$vacancyService = app(VacancyService::class);
$viewComponent->vacancies = $vacancyService->query()
->take($amountOfVacancies)->whereHas('services', function(Builder $query) use($serviceIds) {
if($serviceIds->count() > 0){
$query->whereIn('services.id', $serviceIds);
}
})
->get();
;
return $viewComponent;
}
}