validation: no more workflow without dest

This commit is contained in:
Julien Fastré 2022-02-01 12:19:22 +01:00
parent a612d7dd9f
commit de1dddbb85
5 changed files with 105 additions and 6 deletions

View File

@ -19,6 +19,7 @@ use Chill\MainBundle\Pagination\PaginatorFactory;
use Chill\MainBundle\Repository\Workflow\EntityWorkflowRepository;
use Chill\MainBundle\Security\Authorization\EntityWorkflowVoter;
use Chill\MainBundle\Workflow\EntityWorkflowManager;
use Chill\MainBundle\Workflow\Validator\StepDestValid;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
@ -201,9 +202,18 @@ class WorkflowController extends AbstractController
$entityWorkflow->getCurrentStep()->addDestUser($user);
}
$this->entityManager->flush();
$errors = $this->validator->validate(
$entityWorkflow->getCurrentStep(),
new StepDestValid()
);
return $this->redirectToRoute('chill_main_workflow_show', ['id' => $entityWorkflow->getId()]);
if (count($errors) === 0) {
$this->entityManager->flush();
return $this->redirectToRoute('chill_main_workflow_show', ['id' => $entityWorkflow->getId()]);
}
return new Response((string) $errors, Response::HTTP_UNPROCESSABLE_ENTITY);
}
if ($transitionForm->isSubmitted() && !$transitionForm->isValid()) {
@ -235,6 +245,7 @@ class WorkflowController extends AbstractController
'handler_template_data' => $handler->getTemplateData($entityWorkflow),
'transition_form' => isset($transitionForm) ? $transitionForm->createView() : null,
'entity_workflow' => $entityWorkflow,
'transition_form_errors' => $errors ?? [],
//'comment_form' => $commentForm->createView(),
]
);

View File

@ -38,8 +38,6 @@ window.addEventListener('DOMContentLoaded', function() {
transitions.querySelectorAll('.form-check').forEach(function(row) {
const isForward = row.querySelector('input').dataset.isForward;
console.log(row);
console.log(isForward);
new ShowHide({
load_event: null,
@ -69,7 +67,24 @@ window.addEventListener('DOMContentLoaded', function() {
});
}
// validate form
let form = document.querySelector('form[name="workflow_step"]');
if (form === null) {
console.error('form to validate not found');
}
form.addEventListener('submit', function (event) {
const datas = new FormData(event.target);
if (datas.has('workflow_step[future_dest_users]')) {
const dests = JSON.parse(datas.get('workflow_step[future_dest_users]'));
if (dests === null || (dests instanceof Array && dests.length === 0)) {
event.preventDefault();
console.log('no users!');
window.alert('Indiquez un utilisateur pour traiter la prochaine étape.');
}
}
});
});

View File

@ -46,8 +46,6 @@
</div>
</div>
<div id="transitionFilter">
{% if transition_form.transitionFilter is defined %}
{{ form_row(transition_form.transitionFilter) }}

View File

@ -0,0 +1,26 @@
<?php
/**
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Chill\MainBundle\Workflow\Validator;
use Symfony\Component\Validator\Constraint;
class StepDestValid extends Constraint
{
public string $messageDestNotAllowed = 'workflow.As the step is final, no dest are allowed';
public string $messageRequireDest = 'workflow.As the step is not final, dest are required';
public function getTargets()
{
return [self::CLASS_CONSTRAINT];
}
}

View File

@ -0,0 +1,49 @@
<?php
/**
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Chill\MainBundle\Workflow\Validator;
use Chill\MainBundle\Entity\Workflow\EntityWorkflowStep;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;
use function count;
class StepDestValidValidator extends ConstraintValidator
{
/**
* @param EntityWorkflowStep $value
* @param Constraint|StepDestValid $constraint
*
* @return void
*/
public function validate($value, Constraint $constraint)
{
if (!$constraint instanceof StepDestValid) {
throw new UnexpectedTypeException($constraint, StepDestValid::class);
}
if (!$value instanceof EntityWorkflowStep) {
throw new UnexpectedValueException($value, EntityWorkflowStep::class);
}
if ($value->isFinal() && 0 < count($value->getDestUser())) {
$this->context->buildViolation($constraint->messageDestNotAllowed)
->addViolation();
}
if (!$value->isFinal() && 0 === count($value->getDestUser())) {
$this->context->buildViolation($constraint->messageRequireDest)
->addViolation();
}
}
}