<?php
declare(strict_types=1);
namespace App\Nolimit\OfficialHoliday\Admin;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Route\RouteCollectionInterface;
use Sonata\AdminBundle\Show\ShowMapper;
use Sonata\Form\Type\DatePickerType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
final class OfficialHolidayAdmin extends AbstractAdmin
{
protected function configureRoutes(RouteCollectionInterface $collection): void
{
parent::configureRoutes($collection);
$collection->add('generate_leaves', 'generate_leaves');
}
protected function configure(): void
{
parent::configure();
$this->setTemplate('list', 'official_holiday/CRUD/list__action_generate.html.twig');
}
protected function configureQuery($query): \Sonata\AdminBundle\Datagrid\ProxyQueryInterface
{
$query = parent::configureQuery($query);
$rootAlias = current($query->getRootAliases());
// Default: show only current year if no filter is applied
$filters = $this->getRequest()->query->get('filter', []);
if (empty($filters)) {
$query->andWhere($query->expr()->eq($rootAlias . '.year', ':currentYear'));
$query->setParameter('currentYear', (int) date('Y'));
}
$query->orderBy($rootAlias . '.date', 'ASC');
return $query;
}
protected function configureDatagridFilters(DatagridMapper $filter): void
{
$filter
->add('year', null, ['show_filter' => true])
->add('name')
->add('isWeekendWorkDay');
}
protected function configureListFields(ListMapper $list): void
{
$list
->addIdentifier('name', null, ['label' => 'Name'])
->add('date', 'date', ['label' => 'Date', 'format' => 'Y-m-d'])
->add('year', null, ['label' => 'Year'])
->add('isWeekendWorkDay', 'boolean', ['label' => 'Weekend Work Day'])
->add(ListMapper::NAME_ACTIONS, null, [
'actions' => [
'edit' => [],
'delete' => [],
],
]);
}
protected function configureFormFields(FormMapper $form): void
{
$form
->add('name', TextType::class, ['label' => 'Name'])
->add('date', DatePickerType::class, [
'label' => 'Date',
'format' => 'yyyy-MM-dd',
'required' => true,
])
->add('year', IntegerType::class, [
'label' => 'Year',
'data' => $this->getSubject()?->getYear() ?: (int) date('Y'),
])
->add('isWeekendWorkDay', CheckboxType::class, [
'label' => 'Weekend Work Day',
'required' => false,
]);
}
protected function configureShowFields(ShowMapper $show): void
{
$show
->add('name')
->add('date')
->add('year')
->add('isWeekendWorkDay');
}
public function prePersist($object): void
{
parent::prePersist($object);
if ($object->getDate() && !$object->getYear()) {
$object->setYear((int) $object->getDate()->format('Y'));
}
}
public function preUpdate($object): void
{
parent::preUpdate($object);
if ($object->getDate() && !$object->getYear()) {
$object->setYear((int) $object->getDate()->format('Y'));
}
}
}