Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
96.43% |
27 / 28 |
|
75.00% |
3 / 4 |
CRAP | |
0.00% |
0 / 1 |
| FieldDisplayComponentFactory | |
96.43% |
27 / 28 |
|
75.00% |
3 / 4 |
6 | |
0.00% |
0 / 1 |
| __construct | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| create | |
100.00% |
15 / 15 |
|
100.00% |
1 / 1 |
1 | |||
| doCreateDisplayFor | |
75.00% |
3 / 4 |
|
0.00% |
0 / 1 |
3.14 | |||
| createDisplayFor | |
100.00% |
8 / 8 |
|
100.00% |
1 / 1 |
1 | |||
| 1 | <?php |
| 2 | namespace Apie\HtmlBuilders\Factories; |
| 3 | |
| 4 | use Apie\Core\Context\ApieContext; |
| 5 | use Apie\HtmlBuilders\Columns\ColumnSelector; |
| 6 | use Apie\HtmlBuilders\FieldDisplayBuildContext; |
| 7 | use Apie\HtmlBuilders\FieldDisplayProviders\ArrayDisplayProvider; |
| 8 | use Apie\HtmlBuilders\FieldDisplayProviders\BooleanDisplayProvider; |
| 9 | use Apie\HtmlBuilders\FieldDisplayProviders\EnumDisplayProvider; |
| 10 | use Apie\HtmlBuilders\FieldDisplayProviders\FallbackDisplayProvider; |
| 11 | use Apie\HtmlBuilders\FieldDisplayProviders\ListDisplayProvider; |
| 12 | use Apie\HtmlBuilders\FieldDisplayProviders\NullDisplayProvider; |
| 13 | use Apie\HtmlBuilders\FieldDisplayProviders\SafeHtmlDisplayProvider; |
| 14 | use Apie\HtmlBuilders\FieldDisplayProviders\SegmentDisplayProvider; |
| 15 | use Apie\HtmlBuilders\FieldDisplayProviders\UploadedFileDisplayProvider; |
| 16 | use Apie\HtmlBuilders\FieldDisplayProviders\ValueObjectDisplayProvider; |
| 17 | use Apie\HtmlBuilders\Interfaces\ComponentInterface; |
| 18 | use Apie\HtmlBuilders\Interfaces\FieldDisplayComponentProviderInterface; |
| 19 | |
| 20 | final class FieldDisplayComponentFactory |
| 21 | { |
| 22 | /** |
| 23 | * @var array<int, FieldDisplayComponentProviderInterface> |
| 24 | */ |
| 25 | private array $valueComponentProviders; |
| 26 | |
| 27 | public function __construct(FieldDisplayComponentProviderInterface ...$valueComponentProviders) |
| 28 | { |
| 29 | $this->valueComponentProviders = $valueComponentProviders; |
| 30 | } |
| 31 | |
| 32 | /** |
| 33 | * @param iterable<int, FieldDisplayComponentProviderInterface> $customDisplayProviders |
| 34 | */ |
| 35 | public static function create( |
| 36 | iterable $customDisplayProviders, |
| 37 | ?ColumnSelector $columnSelector = null |
| 38 | ): self { |
| 39 | return new self( |
| 40 | ...[ |
| 41 | ...$customDisplayProviders, |
| 42 | new SafeHtmlDisplayProvider(), |
| 43 | new UploadedFileDisplayProvider(), |
| 44 | new ArrayDisplayProvider(), |
| 45 | new ListDisplayProvider($columnSelector ?? new ColumnSelector()), |
| 46 | new ValueObjectDisplayProvider(), |
| 47 | new EnumDisplayProvider(), |
| 48 | new BooleanDisplayProvider(), |
| 49 | new NullDisplayProvider(), |
| 50 | new SegmentDisplayProvider(), |
| 51 | new FallbackDisplayProvider(), |
| 52 | ] |
| 53 | ); |
| 54 | } |
| 55 | |
| 56 | private function doCreateDisplayFor(mixed $object, FieldDisplayBuildContext $fieldDisplayBuildContext): ComponentInterface |
| 57 | { |
| 58 | foreach ($this->valueComponentProviders as $valueComponentProvider) { |
| 59 | if ($valueComponentProvider->supports($object, $fieldDisplayBuildContext)) { |
| 60 | return $valueComponentProvider->createComponentFor($object, $fieldDisplayBuildContext); |
| 61 | } |
| 62 | } |
| 63 | return (new FallbackDisplayProvider)->createComponentFor($object, $fieldDisplayBuildContext); |
| 64 | } |
| 65 | |
| 66 | public function createDisplayFor(mixed $object, ApieContext $apieContext): ComponentInterface |
| 67 | { |
| 68 | $context = new FieldDisplayBuildContext( |
| 69 | function (mixed $object, FieldDisplayBuildContext $fieldDisplayBuildContext) { |
| 70 | return $this->doCreateDisplayFor($object, $fieldDisplayBuildContext); |
| 71 | }, |
| 72 | $apieContext, |
| 73 | $object |
| 74 | ); |
| 75 | |
| 76 | return $this->doCreateDisplayFor($object, $context); |
| 77 | } |
| 78 | } |