Add validation for other member fields
This commit is contained in:
parent
a830f366ad
commit
b194e77966
|
@ -6,6 +6,7 @@ use App\Form\Models\Form;
|
|||
use App\Form\Models\Participant;
|
||||
use App\Member\Member;
|
||||
use Faker\Generator;
|
||||
use Generator as LazyGenerator;
|
||||
|
||||
class NamiField extends Field
|
||||
{
|
||||
|
@ -38,7 +39,21 @@ class NamiField extends Field
|
|||
*/
|
||||
public function getRegistrationRules(): array
|
||||
{
|
||||
return [$this->key => []];
|
||||
$rules = [];
|
||||
$fields = request()->route('form')->getFields();
|
||||
|
||||
$c = collect($fields)->filter(fn ($field) => $field['nami_type'] === null)->filter(fn ($field) => $field['type'] !== class_basename(static::class))->map(fn ($field) => Field::fromConfig($field)->getRegistrationRules());
|
||||
|
||||
foreach ($c as $field) {
|
||||
foreach ($field as $ruleKey => $rule) {
|
||||
$rules[$this->key . '.*.' . $ruleKey] = $rule;
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
$this->key . '.*.id' => ['required', 'numeric', 'exists:members,mitgliedsnr'],
|
||||
...$rules,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -46,7 +61,34 @@ class NamiField extends Field
|
|||
*/
|
||||
public function getRegistrationAttributes(): array
|
||||
{
|
||||
return [$this->key => $this->name];
|
||||
$rules = [];
|
||||
$fields = request()->route('form')->getFields();
|
||||
$inputMembers = request($this->key);
|
||||
|
||||
$c = collect($fields)->filter(fn ($field) => $field['type'] !== class_basename(static::class))->map(fn ($field) => Field::fromConfig($field));
|
||||
|
||||
foreach ($c as $field) {
|
||||
foreach ($field->getRegistrationRules() as $ruleKey => $rule) {
|
||||
foreach ($inputMembers as $memberIndex => $inputMember) {
|
||||
if (str($ruleKey)->contains('*')) {
|
||||
foreach (request($this->key . '.' . $memberIndex . '.' . $field->key) as $i => $k) {
|
||||
$rules[$this->key . '.' . $memberIndex . '.' . str($ruleKey)->replace('*', $i)] = $field->name . ' für Mitglied Nr ' . $inputMember['id'];
|
||||
}
|
||||
} else {
|
||||
$rules[$this->key . '.' . $memberIndex . '.' . $ruleKey] = $field->name . ' für Mitglied Nr ' . $inputMember['id'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($inputMembers as $memberIndex => $inputMember) {
|
||||
$rules[$this->key . '.' . $memberIndex . '.id'] = 'Mitglied Nr ' . $inputMember['id'];
|
||||
}
|
||||
|
||||
return [
|
||||
$this->key => $this->name,
|
||||
...$rules,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
namespace Tests\Feature\Form;
|
||||
|
||||
use App\Form\Enums\NamiField as EnumsNamiField;
|
||||
use App\Form\Enums\NamiType;
|
||||
use App\Form\Fields\CheckboxesField;
|
||||
use App\Form\Fields\CheckboxField;
|
||||
|
@ -313,18 +312,62 @@ class FormRegisterActionTest extends TestCase
|
|||
{
|
||||
$this->login()->loginNami();
|
||||
Member::factory()->defaults()->create(['mitgliedsnr' => '5505']);
|
||||
Member::factory()->defaults()->create(['mitgliedsnr' => '5506']);
|
||||
$form = Form::factory()
|
||||
->sections([FormtemplateSectionRequest::new()->fields([
|
||||
FormtemplateFieldRequest::type(NamiField::class)->key('members'),
|
||||
FormtemplateFieldRequest::type(TextField::class)->key('other')->namiType(null),
|
||||
FormtemplateFieldRequest::type(TextField::class)->key('other')->namiType(null)->required(false),
|
||||
])])
|
||||
->create();
|
||||
|
||||
$this->postJson(route('form.register', ['form' => $form]), ['other' => 'ooo', 'members' => [['id' => '5505', 'other' => 'O1'], ['id' => '5506', 'other' => 'O2']]])
|
||||
$this->postJson(route('form.register', ['form' => $form]), ['other' => 'ooo', 'members' => [['id' => '5505', 'other' => 'O1']]])
|
||||
->assertOk();
|
||||
$this->assertEquals('ooo', $form->participants->get(0)->data['other']);
|
||||
$this->assertEquals('O1', $form->participants->get(1)->data['other']);
|
||||
$this->assertEquals('O2', $form->participants->get(2)->data['other']);
|
||||
}
|
||||
|
||||
public function testItValidatesMembersFields(): void
|
||||
{
|
||||
$this->login()->loginNami();
|
||||
Member::factory()->defaults()->create(['mitgliedsnr' => '5505', 'firstname' => 'Paula', 'lastname' => 'Schirm']);
|
||||
Member::factory()->defaults()->create(['mitgliedsnr' => '5506', 'firstname' => 'Paula', 'lastname' => 'Schirm']);
|
||||
$form = Form::factory()
|
||||
->sections([FormtemplateSectionRequest::new()->fields([
|
||||
FormtemplateFieldRequest::type(NamiField::class)->key('members'),
|
||||
FormtemplateFieldRequest::type(TextField::class)->name('Andere')->key('other')->namiType(null)->required(true),
|
||||
])])
|
||||
->create();
|
||||
|
||||
$this->postJson(route('form.register', ['form' => $form]), ['other' => 'ooo', 'members' => [['id' => '5505', 'other' => ''], ['id' => '5506', 'other' => '']]])
|
||||
->assertJsonValidationErrors(['members.0.other' => 'Andere für Mitglied Nr 5505 ist erforderlich.'])
|
||||
->assertJsonValidationErrors(['members.1.other' => 'Andere für Mitglied Nr 5506 ist erforderlich.']);
|
||||
}
|
||||
|
||||
public function testItValidatesIfMemberExists(): void
|
||||
{
|
||||
$this->login()->loginNami();
|
||||
$form = Form::factory()
|
||||
->sections([FormtemplateSectionRequest::new()->fields([
|
||||
FormtemplateFieldRequest::type(NamiField::class)->key('members'),
|
||||
FormtemplateFieldRequest::type(TextField::class)->name('Andere')->key('other')->namiType(null)->required(true),
|
||||
])])
|
||||
->create();
|
||||
|
||||
$this->postJson(route('form.register', ['form' => $form]), ['other' => 'ooo', 'members' => [['id' => '9999', 'other' => 'other']]])
|
||||
->assertJsonValidationErrors(['members.0.id' => 'Mitglied Nr 9999 ist nicht vorhanden.']);
|
||||
}
|
||||
|
||||
public function testItValidatesMembersCheckboxesOptions(): void
|
||||
{
|
||||
$this->login()->loginNami();
|
||||
Member::factory()->defaults()->create(['mitgliedsnr' => '5505', 'firstname' => 'Paula', 'lastname' => 'Schirm']);
|
||||
$form = Form::factory()
|
||||
->sections([FormtemplateSectionRequest::new()->fields([
|
||||
FormtemplateFieldRequest::type(NamiField::class)->key('members'),
|
||||
FormtemplateFieldRequest::type(CheckboxesField::class)->name('Andere')->key('other')->namiType(null)->options(['A', 'B']),
|
||||
])])
|
||||
->create();
|
||||
|
||||
$this->postJson(route('form.register', ['form' => $form]), ['other' => [], 'members' => [['id' => '5505', 'other' => ['A', 'missing']]]])
|
||||
->assertJsonValidationErrors(['members.0.other.1' => 'Der gewählte Wert für Andere für Mitglied Nr 5505 ist ungültig.']);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,6 +31,7 @@ class FormtemplateFieldRequest extends RequestFactory
|
|||
'key' => str($this->faker->words(5, true))->snake()->toString(),
|
||||
'columns' => ['mobile' => 2, 'tablet' => 4, 'desktop' => 6],
|
||||
'default' => '',
|
||||
'nami_type' => null,
|
||||
];
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue