<?php
namespace App\Form\Task;
use App\Entity\Survey\Survey;
use App\Entity\TaskPlanner\Task;
use App\Services\Helpers\MattermostHelper;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ButtonType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TimeType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotNull;
class TaskFormType extends AbstractType
{
public function __construct(public MattermostHelper $helper)
{
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('type', ChoiceType::class, [
'attr' => ['class' => 'block w-80 mt-1 text-sm dark:text-gray-300 dark:border-gray-600 dark:bg-gray-700 form-select focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray'],
'choices' => [
array_flip( Task::TYPES)
],
'constraints' => [
new NotNull(),
],
'label' => 'Выберите тип задачи:',
'label_attr' => ['class' => 'text-gray-700 dark:text-gray-400']
])
->add('channels', ChoiceType::class, [
'choices' => [
array_flip($this->getChannels())
],
'attr' => ['class' => 'block w-80 mt-1 text-sm dark:text-gray-300 dark:border-gray-600 dark:bg-gray-700 form-select focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray'],
'multiple' => true,
'label' => 'Выберите чаты:',
'label_attr' => ['class' => 'text-gray-700 dark:text-gray-400']
])
->add('days', ChoiceType::class, [
'attr' => ['class' => 'block w-80 mt-1 text-sm dark:text-gray-300 dark:border-gray-600 dark:bg-gray-700 form-select focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray'],
'choices' => [
array_flip( Task::DAYS)
],
'multiple' => true,
'required' => false,
'label' => 'Выберите дни:',
'label_attr' => ['class' => 'text-gray-700 dark:text-gray-400']
])
->add('time', TimeType::class, [
'attr' => ['class' => 'block w-40 mt-1 text-sm dark:border-gray-600 dark:bg-gray-700 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:text-gray-300 dark:focus:shadow-outline-gray form-input'],
'input' => 'timestamp',
'widget' => 'single_text',
'label' => 'Выберите время:',
'required' => false,
'label_attr' => ['class' => 'text-gray-700 dark:text-gray-400'],
'model_timezone' => 'UTC'
])
->add('date', DateTimeType::class, [
'date_widget' => 'single_text',
'attr' => ['class' => 'block w-40 mt-1 text-sm dark:border-gray-600 dark:bg-gray-700 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:text-gray-300 dark:focus:shadow-outline-gray form-input'],
'label' => 'Выберите дату и время события:',
'label_attr' => ['class' => 'text-gray-700 dark:text-gray-400'],
'required' => false
])
->add('survey', EntityType::class, [
'attr' => ['class' => 'block w-80mt-1 text-sm dark:text-gray-300 dark:border-gray-600 dark:bg-gray-700 form-select focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray'],
'class' => Survey::class,
'choice_label' => 'title',
'label' => 'Выберите опрос:',
'label_attr' => ['class' => 'text-gray-700 dark:text-gray-400']
])
->add('eventTitle', TextType::class, [
'attr' => ['class' => 'block w-80 mt-1 text-sm dark:border-gray-600 dark:bg-gray-700 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:text-gray-300 dark:focus:shadow-outline-gray form-input'],
'label' => 'Введите название события:',
'label_attr' => ['class' => 'text-gray-700 dark:text-gray-400'],
'constraints' => [
new Length([
'max' => 800,
]),
],
])
->add('eventBody', TextareaType::class, [
'attr' => ['class' => 'block w-80 mt-1 text-sm dark:border-gray-600 dark:bg-gray-700 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:text-gray-300 dark:focus:shadow-outline-gray form-input'],
'label' => 'Введите текст сообщения в маттермост:',
'label_attr' => ['class' => 'text-gray-700 dark:text-gray-400'],
'constraints' => [
new Length([
'max' => 800,
]),
],
])
->add('save', SubmitType::class, [
'attr' => ['class' => 'mt-5 w-80 py-3 font-medium leading-5 text-white transition-colors duration-150 bg-green-600 border border-transparent rounded-lg active:bg-green-600 hover:bg-green-700 focus:outline-none focus:shadow-outline-green'],
'label' => 'Сохранить',
])
->add('cancel', ButtonType::class, [
'attr' => ['class' => 'mt-5 w-80 py-3 font-medium leading-5 text-white transition-colors duration-150 bg-purple-600 border border-transparent rounded-lg active:bg-purple-600 hover:bg-purple-700 focus:outline-none focus:shadow-outline-purple',
'@click' => "openModal"
],
'label' => 'Отмена',
])
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'csrf_protection' => true,
'attr' => ['id' => 'task-create'],
'data_class' => Task::class,
]);
}
public function getChannels()
{
$choices = [];
$channelsArray = $this->helper->getChannelList();
foreach ($channelsArray as $channel){
$choices = array_merge($choices, [
$channel['id'] => $channel['name']
]);
}
return $choices;
}
}