feat: body dimensions optional
This commit is contained in:
@@ -60,6 +60,10 @@ class BodyDimensionsType extends AbstractType
|
|||||||
'height_required' => false,
|
'height_required' => false,
|
||||||
'weight_required' => false,
|
'weight_required' => false,
|
||||||
'shoeSize_required' => false,
|
'shoeSize_required' => false,
|
||||||
|
'help' => 'Du kannst die Daten auch später nachreichen',
|
||||||
|
'help_attr' => [
|
||||||
|
'class' => 'lg:col-span-3 text-sm -mt-2 px-2',
|
||||||
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$resolver->setAllowedTypes('height_required', 'bool');
|
$resolver->setAllowedTypes('height_required', 'bool');
|
||||||
|
|||||||
@@ -298,6 +298,9 @@ class ParticipantFieldOptionsProvider extends AbstractFieldOptionsProvider
|
|||||||
'maxlength' => 20,
|
'maxlength' => 20,
|
||||||
],
|
],
|
||||||
'help' => 'Bitte gib das Kennzeichen deines Fahrzeugs an. Du kannst es aber auch später nachreichen.',
|
'help' => 'Bitte gib das Kennzeichen deines Fahrzeugs an. Du kannst es aber auch später nachreichen.',
|
||||||
|
'help_attr' => [
|
||||||
|
'class' => 'text-sm px-2 mt-2',
|
||||||
|
],
|
||||||
'sanitize_html' => true,
|
'sanitize_html' => true,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -13,26 +13,9 @@ class ParticipantValidator extends ConstraintValidator
|
|||||||
/** @var ParticipantDto $participant */
|
/** @var ParticipantDto $participant */
|
||||||
$participant = $value;
|
$participant = $value;
|
||||||
|
|
||||||
$this->assertBodyMeasurementsValid($participant);
|
|
||||||
$this->assertPickupSelected($participant);
|
$this->assertPickupSelected($participant);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function assertBodyMeasurementsValid(ParticipantDto $participant): void
|
|
||||||
{
|
|
||||||
if (0 === count($participant->rentals)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (['height', 'shoeSize', 'weight'] as $property) {
|
|
||||||
if (empty($participant->{$property})) {
|
|
||||||
$this->context->buildViolation('Bitte angeben wegen Leihmaterial')
|
|
||||||
->atPath($property)
|
|
||||||
->addViolation()
|
|
||||||
;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function assertPickupSelected(ParticipantDto $participant): void
|
public function assertPickupSelected(ParticipantDto $participant): void
|
||||||
{
|
{
|
||||||
// Check if either outbound or inbound transportation is bus
|
// Check if either outbound or inbound transportation is bus
|
||||||
|
|||||||
@@ -334,6 +334,7 @@
|
|||||||
{{ form_row(form.bodyDimensions.height) }}
|
{{ form_row(form.bodyDimensions.height) }}
|
||||||
{{ form_row(form.bodyDimensions.shoeSize) }}
|
{{ form_row(form.bodyDimensions.shoeSize) }}
|
||||||
{{ form_row(form.bodyDimensions.weight) }}
|
{{ form_row(form.bodyDimensions.weight) }}
|
||||||
|
{{ form_help(form.bodyDimensions) }}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
|||||||
@@ -17,20 +17,7 @@ class ParticipantValidatorTest extends ConstraintValidatorTestCase
|
|||||||
return new ParticipantValidator();
|
return new ParticipantValidator();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testParticipantWithoutRentalsPassesBodyMeasurementValidation(): void
|
public function testParticipantWithRentalsButNoBodyMeasurementsPassesValidation(): void
|
||||||
{
|
|
||||||
$participant = $this->createValidParticipant();
|
|
||||||
$participant->rentals = []; // No rentals, so body measurements not required
|
|
||||||
$participant->height = null;
|
|
||||||
$participant->weight = null;
|
|
||||||
$participant->shoeSize = null;
|
|
||||||
|
|
||||||
$this->validator->validate($participant, new Participant());
|
|
||||||
|
|
||||||
$this->assertNoViolation();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testParticipantWithRentalsButNoBodyMeasurementsFailsValidation(): void
|
|
||||||
{
|
{
|
||||||
$participant = $this->createValidParticipant();
|
$participant = $this->createValidParticipant();
|
||||||
$participant->rentals = [$this->createMockService()];
|
$participant->rentals = [$this->createMockService()];
|
||||||
@@ -40,40 +27,7 @@ class ParticipantValidatorTest extends ConstraintValidatorTestCase
|
|||||||
|
|
||||||
$this->validator->validate($participant, new Participant());
|
$this->validator->validate($participant, new Participant());
|
||||||
|
|
||||||
$this->buildViolation('Bitte angeben wegen Leihmaterial')
|
// Body measurements are optional and can be provided later
|
||||||
->atPath('property.path.height')
|
|
||||||
->buildNextViolation('Bitte angeben wegen Leihmaterial')
|
|
||||||
->atPath('property.path.shoeSize')
|
|
||||||
->buildNextViolation('Bitte angeben wegen Leihmaterial')
|
|
||||||
->atPath('property.path.weight')
|
|
||||||
->assertRaised();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testParticipantWithRentalsAndPartialBodyMeasurementsFailsValidation(): void
|
|
||||||
{
|
|
||||||
$participant = $this->createValidParticipant();
|
|
||||||
$participant->rentals = [$this->createMockService()];
|
|
||||||
$participant->height = '175';
|
|
||||||
$participant->weight = null; // Missing
|
|
||||||
$participant->shoeSize = '42';
|
|
||||||
|
|
||||||
$this->validator->validate($participant, new Participant());
|
|
||||||
|
|
||||||
$this->buildViolation('Bitte angeben wegen Leihmaterial')
|
|
||||||
->atPath('property.path.weight')
|
|
||||||
->assertRaised();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testParticipantWithRentalsAndCompleteBodyMeasurementsPassesValidation(): void
|
|
||||||
{
|
|
||||||
$participant = $this->createValidParticipant();
|
|
||||||
$participant->rentals = [$this->createMockService()];
|
|
||||||
$participant->height = '175';
|
|
||||||
$participant->weight = '70';
|
|
||||||
$participant->shoeSize = '42';
|
|
||||||
|
|
||||||
$this->validator->validate($participant, new Participant());
|
|
||||||
|
|
||||||
$this->assertNoViolation();
|
$this->assertNoViolation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user