src/Form/Task/TaskFormType.php line 25

Open in your IDE?
  1. <?php
  2. namespace App\Form\Task;
  3. use App\Entity\Survey\Survey;
  4. use App\Entity\TaskPlanner\Task;
  5. use App\Services\Helpers\MattermostHelper;
  6. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  7. use Symfony\Component\Form\AbstractType;
  8. use Symfony\Component\Form\Extension\Core\Type\ButtonType;
  9. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  10. use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
  11. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  12. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  13. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  14. use Symfony\Component\Form\Extension\Core\Type\TextType;
  15. use Symfony\Component\Form\Extension\Core\Type\TimeType;
  16. use Symfony\Component\Form\FormBuilderInterface;
  17. use Symfony\Component\Form\FormEvent;
  18. use Symfony\Component\Form\FormEvents;
  19. use Symfony\Component\OptionsResolver\OptionsResolver;
  20. use Symfony\Component\Validator\Constraints\Length;
  21. use Symfony\Component\Validator\Constraints\NotNull;
  22. class TaskFormType extends AbstractType
  23. {
  24.     public function __construct(public MattermostHelper $helper)
  25.     {
  26.     }
  27.     public function buildForm(FormBuilderInterface $builder, array $options): void
  28.     {
  29.         $builder
  30.             ->add('type'ChoiceType::class, [
  31.                 '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'],
  32.                 'choices' => [
  33.                     array_flipTask::TYPES)
  34.                 ],
  35.                 'constraints' => [
  36.                     new NotNull(),
  37.                 ],
  38.                 'label' => 'Выберите тип задачи:',
  39.                 'label_attr' => ['class' => 'text-gray-700 dark:text-gray-400']
  40.             ])
  41.             ->add('channels'ChoiceType::class, [
  42.                 'choices' => [
  43.                     array_flip($this->getChannels())
  44.                 ],
  45.                 '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'],
  46.                 'multiple' => true,
  47.                 'label' => 'Выберите чаты:',
  48.                 'label_attr' => ['class' => 'text-gray-700 dark:text-gray-400']
  49.             ])
  50.             ->add('days'ChoiceType::class, [
  51.                 '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'],
  52.                 'choices' => [
  53.                     array_flipTask::DAYS)
  54.                 ],
  55.                 'multiple' => true,
  56.                 'required' => false,
  57.                 'label' => 'Выберите дни:',
  58.                 'label_attr' => ['class' => 'text-gray-700 dark:text-gray-400']
  59.             ])
  60.             ->add('time'TimeType::class, [
  61.                 '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'],
  62.                 'input'  => 'timestamp',
  63.                 'widget' => 'single_text',
  64.                 'label' => 'Выберите время:',
  65.                 'required' => false,
  66.                 'label_attr' => ['class' => 'text-gray-700 dark:text-gray-400'],
  67.                 'model_timezone' => 'UTC'
  68.             ])
  69.             ->add('date'DateTimeType::class, [
  70.                 'date_widget' => 'single_text',
  71.                 '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'],
  72.                 'label' => 'Выберите дату и время события:',
  73.                 'label_attr' => ['class' => 'text-gray-700 dark:text-gray-400'],
  74.                 'required' => false
  75.             ])
  76.             ->add('survey'EntityType::class, [
  77.                 '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'],
  78.                 'class' => Survey::class,
  79.                 'choice_label' => 'title',
  80.                 'label' => 'Выберите опрос:',
  81.                 'label_attr' => ['class' => 'text-gray-700 dark:text-gray-400']
  82.             ])
  83.             ->add('eventTitle'TextType::class, [
  84.                 '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'],
  85.                 'label' => 'Введите название события:',
  86.                 'label_attr' => ['class' => 'text-gray-700 dark:text-gray-400'],
  87.                 'constraints' => [
  88.                     new Length([
  89.                         'max' => 800,
  90.                     ]),
  91.                 ],
  92.             ])
  93.             ->add('eventBody'TextareaType::class, [
  94.                 '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'],
  95.                 'label' => 'Введите текст сообщения в маттермост:',
  96.                 'label_attr' => ['class' => 'text-gray-700 dark:text-gray-400'],
  97.                 'constraints' => [
  98.                     new Length([
  99.                         'max' => 800,
  100.                     ]),
  101.                 ],
  102.             ])
  103.             ->add('save'SubmitType::class, [
  104.                 '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'],
  105.                 'label' => 'Сохранить',
  106.             ])
  107.             ->add('cancel'ButtonType::class, [
  108.                 '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',
  109.                     '@click' => "openModal"
  110.                     ],
  111.                 'label' => 'Отмена',
  112.             ])
  113.         ;
  114.     }
  115.     public function configureOptions(OptionsResolver $resolver): void
  116.     {
  117.         $resolver->setDefaults([
  118.             'csrf_protection' => true,
  119.             'attr' => ['id' => 'task-create'],
  120.             'data_class' => Task::class,
  121.         ]);
  122.     }
  123.     public function getChannels()
  124.     {
  125.         $choices = [];
  126.         $channelsArray $this->helper->getChannelList();
  127.         foreach ($channelsArray as $channel){
  128.             $choices array_merge($choices, [
  129.                 $channel['id'] => $channel['name']
  130.             ]);
  131.         }
  132.         return $choices;
  133.     }
  134. }