From cdc25d9da2fcbac8d8d8ee2bcad19bf195e0e951 Mon Sep 17 00:00:00 2001 From: Manuk Date: Mon, 13 Apr 2026 23:53:50 +0400 Subject: [PATCH 1/7] feat: add DescriptionPosition enum and translations --- resources/lang/en/custom-fields.php | 5 +++++ src/Enums/DescriptionPosition.php | 19 +++++++++++++++++++ tests/Feature/DescriptionPositionTest.php | 15 +++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 src/Enums/DescriptionPosition.php create mode 100644 tests/Feature/DescriptionPositionTest.php diff --git a/resources/lang/en/custom-fields.php b/resources/lang/en/custom-fields.php index ec3ae2c0..1276be23 100644 --- a/resources/lang/en/custom-fields.php +++ b/resources/lang/en/custom-fields.php @@ -41,6 +41,11 @@ 'code' => 'Code', 'code_helper_text' => 'Unique code to identify this field throughout the resource.', 'description' => 'Description', + 'description_position' => 'Description Position', + 'description_position_options' => [ + 'below' => 'Below field', + 'above' => 'Above field', + ], 'settings' => 'Settings', 'encrypted' => 'Encrypted', 'encrypted_help' => 'When enabled, this field\'s values will be stored securely using encryption.', diff --git a/src/Enums/DescriptionPosition.php b/src/Enums/DescriptionPosition.php new file mode 100644 index 00000000..18cdff78 --- /dev/null +++ b/src/Enums/DescriptionPosition.php @@ -0,0 +1,19 @@ + __('custom-fields::custom-fields.field.form.description_position_options.below'), + self::ABOVE => __('custom-fields::custom-fields.field.form.description_position_options.above'), + }; + } +} diff --git a/tests/Feature/DescriptionPositionTest.php b/tests/Feature/DescriptionPositionTest.php new file mode 100644 index 00000000..9d031ae6 --- /dev/null +++ b/tests/Feature/DescriptionPositionTest.php @@ -0,0 +1,15 @@ +value)->toBe('below'); + expect(DescriptionPosition::ABOVE->value)->toBe('above'); +}); + +it('returns translatable labels', function (): void { + expect(DescriptionPosition::BELOW->getLabel())->toBeString()->not->toBeEmpty(); + expect(DescriptionPosition::ABOVE->getLabel())->toBeString()->not->toBeEmpty(); +}); From e6890d1dbecb2aed3005215e9d277e36d9f8932a Mon Sep 17 00:00:00 2001 From: Manuk Date: Mon, 13 Apr 2026 23:55:41 +0400 Subject: [PATCH 2/7] feat: add FIELD_DESCRIPTION_POSITION feature flag (disabled by default) --- src/Enums/CustomFieldsFeature.php | 1 + tests/Feature/DescriptionPositionTest.php | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/Enums/CustomFieldsFeature.php b/src/Enums/CustomFieldsFeature.php index 6ab961f5..2f754673 100644 --- a/src/Enums/CustomFieldsFeature.php +++ b/src/Enums/CustomFieldsFeature.php @@ -19,6 +19,7 @@ enum CustomFieldsFeature: string case FIELD_UNIQUE_VALUE = 'field_unique_value'; case FIELD_VALIDATION_RULES = 'field_validation_rules'; case FIELD_DESCRIPTION = 'field_description'; + case FIELD_DESCRIPTION_POSITION = 'field_description_position'; // Visibility features case MODEL_ATTRIBUTE_CONDITIONS = 'model_attribute_conditions'; diff --git a/tests/Feature/DescriptionPositionTest.php b/tests/Feature/DescriptionPositionTest.php index 9d031ae6..ff442366 100644 --- a/tests/Feature/DescriptionPositionTest.php +++ b/tests/Feature/DescriptionPositionTest.php @@ -13,3 +13,20 @@ expect(DescriptionPosition::BELOW->getLabel())->toBeString()->not->toBeEmpty(); expect(DescriptionPosition::ABOVE->getLabel())->toBeString()->not->toBeEmpty(); }); + +use Relaticle\CustomFields\Enums\CustomFieldsFeature; +use Relaticle\CustomFields\FeatureSystem\FeatureConfigurator; +use Relaticle\CustomFields\FeatureSystem\FeatureManager; + +it('has FIELD_DESCRIPTION_POSITION feature flag disabled by default', function (): void { + expect(FeatureManager::isEnabled(CustomFieldsFeature::FIELD_DESCRIPTION_POSITION))->toBeFalse(); +}); + +it('can enable FIELD_DESCRIPTION_POSITION feature flag', function (): void { + $config = FeatureConfigurator::configure() + ->enable(CustomFieldsFeature::FIELD_DESCRIPTION_POSITION); + + config(['custom-fields.features' => $config]); + + expect(FeatureManager::isEnabled(CustomFieldsFeature::FIELD_DESCRIPTION_POSITION))->toBeTrue(); +}); From 33edb01b37abdfa3aca549febe246e413288f5ba Mon Sep 17 00:00:00 2001 From: Manuk Date: Tue, 14 Apr 2026 00:00:44 +0400 Subject: [PATCH 3/7] feat: add descriptionPosition property to CustomFieldSettingsData --- src/Data/CustomFieldSettingsData.php | 2 ++ tests/Feature/DescriptionPositionTest.php | 27 +++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/Data/CustomFieldSettingsData.php b/src/Data/CustomFieldSettingsData.php index af2b84d5..fbe5d645 100644 --- a/src/Data/CustomFieldSettingsData.php +++ b/src/Data/CustomFieldSettingsData.php @@ -5,6 +5,7 @@ namespace Relaticle\CustomFields\Data; use Relaticle\CustomFields\Enums\CustomFieldsFeature; +use Relaticle\CustomFields\Enums\DescriptionPosition; use Relaticle\CustomFields\FeatureSystem\FeatureManager; use Spatie\LaravelData\Attributes\MapName; use Spatie\LaravelData\Data; @@ -24,6 +25,7 @@ public function __construct( public int $max_values = 1, public bool $unique_per_entity_type = false, public ?string $description = null, + public ?DescriptionPosition $descriptionPosition = null, public VisibilityData $visibility = new VisibilityData, public array $additional = [], ) { diff --git a/tests/Feature/DescriptionPositionTest.php b/tests/Feature/DescriptionPositionTest.php index ff442366..7dbee0a1 100644 --- a/tests/Feature/DescriptionPositionTest.php +++ b/tests/Feature/DescriptionPositionTest.php @@ -30,3 +30,30 @@ expect(FeatureManager::isEnabled(CustomFieldsFeature::FIELD_DESCRIPTION_POSITION))->toBeTrue(); }); + +use Relaticle\CustomFields\Data\CustomFieldSettingsData; + +it('includes descriptionPosition as null by default in settings', function (): void { + $settings = new CustomFieldSettingsData; + + expect($settings->descriptionPosition)->toBeNull(); +}); + +it('stores descriptionPosition enum in settings', function (): void { + $settings = new CustomFieldSettingsData( + descriptionPosition: DescriptionPosition::ABOVE, + ); + + expect($settings->descriptionPosition)->toBe(DescriptionPosition::ABOVE); +}); + +it('serializes and deserializes descriptionPosition through settings', function (): void { + $settings = new CustomFieldSettingsData( + descriptionPosition: DescriptionPosition::ABOVE, + ); + + $array = $settings->toArray(); + $restored = CustomFieldSettingsData::from($array); + + expect($restored->descriptionPosition)->toBe(DescriptionPosition::ABOVE); +}); From d2556d5b88d63314ceca4abd184ca0f515c27203 Mon Sep 17 00:00:00 2001 From: Manuk Date: Tue, 14 Apr 2026 00:04:30 +0400 Subject: [PATCH 4/7] feat: position-aware description rendering in AbstractFormComponent --- .../Base/AbstractFormComponent.php | 20 +++- tests/Feature/DescriptionPositionTest.php | 97 +++++++++++++++++++ 2 files changed, 113 insertions(+), 4 deletions(-) diff --git a/src/Filament/Integration/Base/AbstractFormComponent.php b/src/Filament/Integration/Base/AbstractFormComponent.php index 7238996a..132492bc 100644 --- a/src/Filament/Integration/Base/AbstractFormComponent.php +++ b/src/Filament/Integration/Base/AbstractFormComponent.php @@ -5,10 +5,12 @@ namespace Relaticle\CustomFields\Filament\Integration\Base; use Filament\Forms\Components\Field; +use Filament\Schemas\Components\Text; use Illuminate\Support\Carbon; use Illuminate\Support\Collection; use Relaticle\CustomFields\Contracts\FormComponentInterface; use Relaticle\CustomFields\Enums\CustomFieldsFeature; +use Relaticle\CustomFields\Enums\DescriptionPosition; use Relaticle\CustomFields\FeatureSystem\FeatureManager; use Relaticle\CustomFields\Models\CustomField; use Relaticle\CustomFields\Services\ValidationService; @@ -55,10 +57,20 @@ protected function configure( $field ->name($customField->getFieldName()) ->label($customField->name) - ->helperText( - FeatureManager::isEnabled(CustomFieldsFeature::FIELD_DESCRIPTION) - ? ($customField->settings->description ?? null) - : null + ->when( + FeatureManager::isEnabled(CustomFieldsFeature::FIELD_DESCRIPTION) && + filled($customField->settings->description), + function (Field $field) use ($customField): Field { + $description = $customField->settings->description; + $position = $customField->settings->descriptionPosition; + + if (FeatureManager::isEnabled(CustomFieldsFeature::FIELD_DESCRIPTION_POSITION) && + $position === DescriptionPosition::ABOVE) { + return $field->aboveContent(fn (): Text => Text::make($description)); + } + + return $field->helperText($description); + } ) ->afterStateHydrated( fn (mixed $component, mixed $state, mixed $record): mixed => $component->state( diff --git a/tests/Feature/DescriptionPositionTest.php b/tests/Feature/DescriptionPositionTest.php index 7dbee0a1..0f0ae429 100644 --- a/tests/Feature/DescriptionPositionTest.php +++ b/tests/Feature/DescriptionPositionTest.php @@ -57,3 +57,100 @@ expect($restored->descriptionPosition)->toBe(DescriptionPosition::ABOVE); }); + +use Relaticle\CustomFields\Models\CustomField; +use Relaticle\CustomFields\Models\CustomFieldSection; +use Relaticle\CustomFields\Tests\Fixtures\Models\Post; +use Relaticle\CustomFields\Tests\Fixtures\Models\User; +use Relaticle\CustomFields\Tests\Fixtures\Resources\Posts\Pages\CreatePost; + +it('renders description below field by default', function (): void { + $this->actingAs(User::factory()->create()); + + $config = FeatureConfigurator::configure() + ->enable( + CustomFieldsFeature::FIELD_DESCRIPTION, + CustomFieldsFeature::SYSTEM_SECTIONS, + ); + config(['custom-fields.features' => $config]); + + $section = CustomFieldSection::factory()->create([ + 'entity_type' => Post::class, + ]); + + CustomField::factory()->create([ + 'custom_field_section_id' => $section->id, + 'name' => 'Test Field', + 'code' => 'test_field', + 'type' => 'text', + 'entity_type' => Post::class, + 'settings' => new CustomFieldSettingsData( + description: 'Help text below', + ), + ]); + + livewire(CreatePost::class) + ->assertSuccessful(); +}); + +it('renders description above field when position is ABOVE and feature enabled', function (): void { + $this->actingAs(User::factory()->create()); + + $config = FeatureConfigurator::configure() + ->enable( + CustomFieldsFeature::FIELD_DESCRIPTION, + CustomFieldsFeature::FIELD_DESCRIPTION_POSITION, + CustomFieldsFeature::SYSTEM_SECTIONS, + ); + config(['custom-fields.features' => $config]); + + $section = CustomFieldSection::factory()->create([ + 'entity_type' => Post::class, + ]); + + CustomField::factory()->create([ + 'custom_field_section_id' => $section->id, + 'name' => 'Test Field Above', + 'code' => 'test_field_above', + 'type' => 'text', + 'entity_type' => Post::class, + 'settings' => new CustomFieldSettingsData( + description: 'Help text above', + descriptionPosition: DescriptionPosition::ABOVE, + ), + ]); + + livewire(CreatePost::class) + ->assertSuccessful(); +}); + +it('ignores description position when FIELD_DESCRIPTION_POSITION feature is disabled', function (): void { + $this->actingAs(User::factory()->create()); + + $config = FeatureConfigurator::configure() + ->enable( + CustomFieldsFeature::FIELD_DESCRIPTION, + CustomFieldsFeature::SYSTEM_SECTIONS, + ) + ->disable(CustomFieldsFeature::FIELD_DESCRIPTION_POSITION); + config(['custom-fields.features' => $config]); + + $section = CustomFieldSection::factory()->create([ + 'entity_type' => Post::class, + ]); + + CustomField::factory()->create([ + 'custom_field_section_id' => $section->id, + 'name' => 'Test Field Fallback', + 'code' => 'test_field_fallback', + 'type' => 'text', + 'entity_type' => Post::class, + 'settings' => new CustomFieldSettingsData( + description: 'Should render below despite ABOVE setting', + descriptionPosition: DescriptionPosition::ABOVE, + ), + ]); + + livewire(CreatePost::class) + ->assertSuccessful(); +}); From e0d44cdcc800a473712dfc2acf5c8f8a0dfe7d74 Mon Sep 17 00:00:00 2001 From: Manuk Date: Tue, 14 Apr 2026 00:07:18 +0400 Subject: [PATCH 5/7] feat: add description position Select to field management form --- src/Filament/Management/Schemas/FieldForm.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/Filament/Management/Schemas/FieldForm.php b/src/Filament/Management/Schemas/FieldForm.php index 40381561..82f63dcf 100644 --- a/src/Filament/Management/Schemas/FieldForm.php +++ b/src/Filament/Management/Schemas/FieldForm.php @@ -27,6 +27,7 @@ use Relaticle\CustomFields\Contracts\ValidationCapability; use Relaticle\CustomFields\CustomFields; use Relaticle\CustomFields\Enums\CustomFieldsFeature; +use Relaticle\CustomFields\Enums\DescriptionPosition; use Relaticle\CustomFields\Facades\CustomFieldsType; use Relaticle\CustomFields\Facades\Entities; use Relaticle\CustomFields\FeatureSystem\FeatureManager; @@ -273,8 +274,23 @@ public static function schema(bool $withOptionsRelationship = true): array ->label(__('custom-fields::custom-fields.field.form.description')) ->maxLength(255) ->rows(2) + ->live() ->columnSpanFull() ->visible(fn (): bool => FeatureManager::isEnabled(CustomFieldsFeature::FIELD_DESCRIPTION)), + Select::make('settings.description_position') + ->label(__('custom-fields::custom-fields.field.form.description_position')) + ->options( + collect(DescriptionPosition::cases()) + ->mapWithKeys(fn (DescriptionPosition $position): array => [ + $position->value => $position->getLabel(), + ]) + ->all() + ) + ->placeholder(__('custom-fields::custom-fields.field.form.description_position_options.below')) + ->visible(fn (Get $get): bool => FeatureManager::isEnabled(CustomFieldsFeature::FIELD_DESCRIPTION) && + FeatureManager::isEnabled(CustomFieldsFeature::FIELD_DESCRIPTION_POSITION) && + filled($get('settings.description')) + ), Fieldset::make( __( 'custom-fields::custom-fields.field.form.settings' From 6fb12ed956d2f4ea4d587ede6fa8fde1cf96555d Mon Sep 17 00:00:00 2001 From: Manuk Date: Tue, 14 Apr 2026 00:32:07 +0400 Subject: [PATCH 6/7] fix: resolve PHPStan errors and simplify code - Add HasLabel interface to DescriptionPosition enum, simplify Select options to use enum class string - Change description Textarea ->live() to ->live(onBlur: true) - Remove dead $default parameter from getDecimalPlaces() - Remove redundant null coalescing on non-nullable properties - Tighten getVisibilityData() return type to non-nullable VisibilityData --- src/Enums/DescriptionPosition.php | 4 ++- src/Filament/Management/Schemas/FieldForm.php | 10 ++---- src/Models/CustomField.php | 4 +-- .../Visibility/CoreVisibilityLogicService.php | 36 ++++++------------- 4 files changed, 17 insertions(+), 37 deletions(-) diff --git a/src/Enums/DescriptionPosition.php b/src/Enums/DescriptionPosition.php index 18cdff78..6f61379a 100644 --- a/src/Enums/DescriptionPosition.php +++ b/src/Enums/DescriptionPosition.php @@ -4,7 +4,9 @@ namespace Relaticle\CustomFields\Enums; -enum DescriptionPosition: string +use Filament\Support\Contracts\HasLabel; + +enum DescriptionPosition: string implements HasLabel { case BELOW = 'below'; case ABOVE = 'above'; diff --git a/src/Filament/Management/Schemas/FieldForm.php b/src/Filament/Management/Schemas/FieldForm.php index 82f63dcf..226f7aaa 100644 --- a/src/Filament/Management/Schemas/FieldForm.php +++ b/src/Filament/Management/Schemas/FieldForm.php @@ -274,18 +274,12 @@ public static function schema(bool $withOptionsRelationship = true): array ->label(__('custom-fields::custom-fields.field.form.description')) ->maxLength(255) ->rows(2) - ->live() + ->live(onBlur: true) ->columnSpanFull() ->visible(fn (): bool => FeatureManager::isEnabled(CustomFieldsFeature::FIELD_DESCRIPTION)), Select::make('settings.description_position') ->label(__('custom-fields::custom-fields.field.form.description_position')) - ->options( - collect(DescriptionPosition::cases()) - ->mapWithKeys(fn (DescriptionPosition $position): array => [ - $position->value => $position->getLabel(), - ]) - ->all() - ) + ->options(DescriptionPosition::class) ->placeholder(__('custom-fields::custom-fields.field.form.description_position_options.below')) ->visible(fn (Get $get): bool => FeatureManager::isEnabled(CustomFieldsFeature::FIELD_DESCRIPTION) && FeatureManager::isEnabled(CustomFieldsFeature::FIELD_DESCRIPTION_POSITION) && diff --git a/src/Models/CustomField.php b/src/Models/CustomField.php index fbb0d06a..6b1b2392 100644 --- a/src/Models/CustomField.php +++ b/src/Models/CustomField.php @@ -225,9 +225,9 @@ public function getCurrencySettings(): CurrencyFieldSettingsData return CurrencyFieldSettingsData::fromAdditional($additional); } - public function getDecimalPlaces(int $default = 2): int + public function getDecimalPlaces(): int { - return $this->getCurrencySettings()->decimalPlaces ?? $default; + return $this->getCurrencySettings()->decimalPlaces; } public function getCurrencyCode(): string diff --git a/src/Services/Visibility/CoreVisibilityLogicService.php b/src/Services/Visibility/CoreVisibilityLogicService.php index fddcfbe4..1c35e36f 100644 --- a/src/Services/Visibility/CoreVisibilityLogicService.php +++ b/src/Services/Visibility/CoreVisibilityLogicService.php @@ -31,11 +31,9 @@ * Extract visibility data from a custom field. * This is the authoritative method for getting visibility configuration. */ - public function getVisibilityData(CustomField $field): ?VisibilityData + public function getVisibilityData(CustomField $field): VisibilityData { - $settings = $field->settings; - - return $settings->visibility ?? null; + return $field->settings->visibility; } /** @@ -43,9 +41,7 @@ public function getVisibilityData(CustomField $field): ?VisibilityData */ public function getVisibilityDataFromSection(CustomFieldSection $section): ?VisibilityData { - $settings = $section->settings; - - return $settings->visibility ?? null; + return $section->settings->visibility; } /** @@ -54,9 +50,7 @@ public function getVisibilityDataFromSection(CustomFieldSection $section): ?Visi */ public function hasVisibilityConditions(CustomField $field): bool { - $visibility = $this->getVisibilityData($field); - - return $visibility?->requiresConditions() ?? false; + return $this->getVisibilityData($field)->requiresConditions(); } /** @@ -77,9 +71,7 @@ public function hasSectionVisibilityConditions(CustomFieldSection $section): boo */ public function getDependentFields(CustomField $field): array { - $visibility = $this->getVisibilityData($field); - - return $visibility?->getDependentFields() ?? []; + return $this->getVisibilityData($field)->getDependentFields(); } /** @@ -90,9 +82,7 @@ public function getDependentFields(CustomField $field): array */ public function evaluateVisibility(CustomField $field, array $fieldValues, ?Model $record = null): bool { - $visibility = $this->getVisibilityData($field); - - return $visibility?->evaluate($fieldValues, $record) ?? true; + return $this->getVisibilityData($field)->evaluate($fieldValues, $record); } /** @@ -185,9 +175,7 @@ private function evaluateVisibilityWithCascadingInternal( */ public function getVisibilityMode(CustomField $field): VisibilityMode { - $visibility = $this->getVisibilityData($field); - - return $visibility->mode ?? VisibilityMode::ALWAYS_VISIBLE; + return $this->getVisibilityData($field)->mode; } /** @@ -196,9 +184,7 @@ public function getVisibilityMode(CustomField $field): VisibilityMode */ public function getVisibilityLogic(CustomField $field): VisibilityLogic { - $visibility = $this->getVisibilityData($field); - - return $visibility->logic ?? VisibilityLogic::ALL; + return $this->getVisibilityData($field)->logic; } /** @@ -211,7 +197,7 @@ public function getVisibilityConditions(CustomField $field): array { $visibility = $this->getVisibilityData($field); - if (! $visibility instanceof VisibilityData || ! $visibility->conditions instanceof DataCollection) { + if (! $visibility->conditions instanceof DataCollection) { return []; } @@ -223,9 +209,7 @@ public function getVisibilityConditions(CustomField $field): array */ public function shouldAlwaysSave(CustomField $field): bool { - $visibility = $this->getVisibilityData($field); - - return $visibility->alwaysSave ?? false; + return $this->getVisibilityData($field)->alwaysSave; } /** From 2b4609f400ee8029a771e223c8647996a7e0ce00 Mon Sep 17 00:00:00 2001 From: Manuk Date: Tue, 14 Apr 2026 00:36:39 +0400 Subject: [PATCH 7/7] fix: consolidate test imports and add HTML content assertions --- tests/Feature/DescriptionPositionTest.php | 30 +++++++++++------------ 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/tests/Feature/DescriptionPositionTest.php b/tests/Feature/DescriptionPositionTest.php index 0f0ae429..a82e43a5 100644 --- a/tests/Feature/DescriptionPositionTest.php +++ b/tests/Feature/DescriptionPositionTest.php @@ -2,7 +2,16 @@ declare(strict_types=1); +use Relaticle\CustomFields\Data\CustomFieldSettingsData; +use Relaticle\CustomFields\Enums\CustomFieldsFeature; use Relaticle\CustomFields\Enums\DescriptionPosition; +use Relaticle\CustomFields\FeatureSystem\FeatureConfigurator; +use Relaticle\CustomFields\FeatureSystem\FeatureManager; +use Relaticle\CustomFields\Models\CustomField; +use Relaticle\CustomFields\Models\CustomFieldSection; +use Relaticle\CustomFields\Tests\Fixtures\Models\Post; +use Relaticle\CustomFields\Tests\Fixtures\Models\User; +use Relaticle\CustomFields\Tests\Fixtures\Resources\Posts\Pages\CreatePost; it('has the correct backing values', function (): void { expect(DescriptionPosition::BELOW->value)->toBe('below'); @@ -14,10 +23,6 @@ expect(DescriptionPosition::ABOVE->getLabel())->toBeString()->not->toBeEmpty(); }); -use Relaticle\CustomFields\Enums\CustomFieldsFeature; -use Relaticle\CustomFields\FeatureSystem\FeatureConfigurator; -use Relaticle\CustomFields\FeatureSystem\FeatureManager; - it('has FIELD_DESCRIPTION_POSITION feature flag disabled by default', function (): void { expect(FeatureManager::isEnabled(CustomFieldsFeature::FIELD_DESCRIPTION_POSITION))->toBeFalse(); }); @@ -31,8 +36,6 @@ expect(FeatureManager::isEnabled(CustomFieldsFeature::FIELD_DESCRIPTION_POSITION))->toBeTrue(); }); -use Relaticle\CustomFields\Data\CustomFieldSettingsData; - it('includes descriptionPosition as null by default in settings', function (): void { $settings = new CustomFieldSettingsData; @@ -58,12 +61,6 @@ expect($restored->descriptionPosition)->toBe(DescriptionPosition::ABOVE); }); -use Relaticle\CustomFields\Models\CustomField; -use Relaticle\CustomFields\Models\CustomFieldSection; -use Relaticle\CustomFields\Tests\Fixtures\Models\Post; -use Relaticle\CustomFields\Tests\Fixtures\Models\User; -use Relaticle\CustomFields\Tests\Fixtures\Resources\Posts\Pages\CreatePost; - it('renders description below field by default', function (): void { $this->actingAs(User::factory()->create()); @@ -90,7 +87,8 @@ ]); livewire(CreatePost::class) - ->assertSuccessful(); + ->assertSuccessful() + ->assertSeeHtml('Help text below'); }); it('renders description above field when position is ABOVE and feature enabled', function (): void { @@ -121,7 +119,8 @@ ]); livewire(CreatePost::class) - ->assertSuccessful(); + ->assertSuccessful() + ->assertSeeHtml('Help text above'); }); it('ignores description position when FIELD_DESCRIPTION_POSITION feature is disabled', function (): void { @@ -152,5 +151,6 @@ ]); livewire(CreatePost::class) - ->assertSuccessful(); + ->assertSuccessful() + ->assertSeeHtml('Should render below despite ABOVE setting'); });