*/ final class FormFieldFactory extends Factory { protected $model = FormField::class; /** @return array */ public function definition(): array { $fieldType = fake()->randomElement([ FormFieldType::TEXT, FormFieldType::TEXTAREA, FormFieldType::EMAIL, FormFieldType::NUMBER, FormFieldType::BOOLEAN, FormFieldType::SELECT, ]); $label = fake('nl_NL')->randomElement([ 'Voornaam', 'Achternaam', 'E-mail', 'Telefoon', 'Opmerkingen', 'Shirtmaat', 'Allergieën', 'Motivatie', 'Geboortedatum', ]); return [ 'form_schema_id' => FormSchema::factory(), 'form_schema_section_id' => null, 'library_field_id' => null, 'field_type' => $fieldType->value, 'slug' => Str::slug($label).'-'.Str::lower(Str::random(4)), 'label' => $label, 'help_text' => fake()->boolean(30) ? fake('nl_NL')->sentence() : null, 'options' => $fieldType === FormFieldType::SELECT ? ['Optie A', 'Optie B', 'Optie C'] : null, 'validation_rules' => null, 'is_required' => fake()->boolean(40), 'is_filterable' => false, 'is_portal_visible' => true, 'is_admin_only' => false, 'is_unique' => false, 'is_pii' => false, 'display_width' => FormFieldDisplayWidth::FULL, 'conditional_logic' => null, 'role_restrictions' => null, 'translations' => null, 'value_storage_hint' => $fieldType->recommendedValueStorageHint(), 'review_required' => false, 'sort_order' => 0, ]; } public function ofType(FormFieldType $type): static { return $this->state(fn () => [ 'field_type' => $type->value, 'value_storage_hint' => $type->recommendedValueStorageHint(), ]); } public function filterable(): static { return $this->state(fn () => ['is_filterable' => true]); } /** * Attach an entity-binding row in `form_field_bindings` after the field * is persisted. Use this instead of populating the legacy `binding` JSON * column — which WS-5a will drop in commit 3. */ public function withEntityBinding( string $entity, string $attribute, FormFieldBindingMode $mode = FormFieldBindingMode::EntityOwned, ?string $syncDirection = null, ): static { return $this->afterCreating(function (FormField $field) use ($entity, $attribute, $mode, $syncDirection): void { FormFieldBinding::factory() ->forField($field) ->state([ 'target_entity' => $entity, 'target_attribute' => $attribute, 'mode' => $mode->value, 'sync_direction' => $mode === FormFieldBindingMode::Mirrored ? ($syncDirection ?? 'write_on_submit') : null, ]) ->create(); }); } /** * Attach a validation-rule row in `form_field_validation_rules` after * the field is persisted. Replaces populating the legacy * `validation_rules` JSON column — which WS-5b commit 5 drops. * * @param array $parameters */ public function withValidationRule(FormFieldValidationRuleType $type, array $parameters): static { return $this->afterCreating(function (FormField $field) use ($type, $parameters): void { FormFieldValidationRule::factory() ->forField($field) ->ofType($type, $parameters) ->create(); }); } }