diff --git a/src/Filament/Integration/Components/Infolists/MultiChoiceEntry.php b/src/Filament/Integration/Components/Infolists/MultiChoiceEntry.php index ddfc9687..029b3237 100644 --- a/src/Filament/Integration/Components/Infolists/MultiChoiceEntry.php +++ b/src/Filament/Integration/Components/Infolists/MultiChoiceEntry.php @@ -4,17 +4,31 @@ namespace Relaticle\CustomFields\Filament\Integration\Components\Infolists; +use Filament\Infolists\Components\Entry; +use Filament\Infolists\Components\TextEntry as BaseTextEntry; use Filament\Infolists\Components\ViewEntry; use Relaticle\CustomFields\Enums\CustomFieldsFeature; use Relaticle\CustomFields\FeatureSystem\FeatureManager; use Relaticle\CustomFields\Filament\Integration\Base\AbstractInfolistEntry; +use Relaticle\CustomFields\Filament\Integration\Concerns\Shared\ConfiguresBadgeColors; use Relaticle\CustomFields\Models\Contracts\HasCustomFields; use Relaticle\CustomFields\Models\CustomField; +use Relaticle\CustomFields\Services\ValueResolver\LookupMultiValueResolver; final class MultiChoiceEntry extends AbstractInfolistEntry { - public function make(CustomField $customField): ViewEntry + use ConfiguresBadgeColors; + + public function __construct( + private readonly LookupMultiValueResolver $valueResolver, + ) {} + + public function make(CustomField $customField): Entry { + if ($customField->typeData->acceptsArbitraryValues) { + return $this->makeTagsEntry($customField); + } + $options = $customField->options->pluck('name', 'id')->all(); $optionColors = $this->resolveOptionColors($customField); @@ -28,6 +42,16 @@ public function make(CustomField $customField): ViewEntry ]); } + private function makeTagsEntry(CustomField $customField): BaseTextEntry + { + $entry = BaseTextEntry::make($customField->getFieldName()) + ->label($customField->name) + ->placeholder('—') + ->state(fn (HasCustomFields $record): array => $this->valueResolver->resolve($record, $customField)); + + return $this->applyBadgeColorsIfEnabled($entry, $customField); + } + /** @return array */ private function resolveOptionColors(CustomField $customField): array { diff --git a/tests/Feature/Filament/Components/MultiChoiceEntryTest.php b/tests/Feature/Filament/Components/MultiChoiceEntryTest.php new file mode 100644 index 00000000..c060ad90 --- /dev/null +++ b/tests/Feature/Filament/Components/MultiChoiceEntryTest.php @@ -0,0 +1,30 @@ +ofType('checkbox-list')->create(); + + $entry = app(MultiChoiceEntry::class)->make($field); + + expect($entry) + ->toBeInstanceOf(ViewEntry::class) + ->getView()->toBe('custom-fields::infolists.checkbox-list-entry'); + }); + + it('renders a badge text entry for arbitrary-value fields (tags-input)', function (): void { + $field = CustomField::factory()->ofType('tags-input')->create(); + + $entry = app(MultiChoiceEntry::class)->make($field); + + expect($entry) + ->toBeInstanceOf(BaseTextEntry::class) + ->isBadge()->toBeTrue(); + }); +});