getMappedFlexibleLayouts()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 3
c 1
b 0
f 0
nc 1
nop 2
dl 0
loc 5
ccs 4
cts 4
cp 1
crap 1
rs 10
1
<?php
2
3
namespace NovaFlexibleContent\Layouts;
4
5
use Illuminate\Support\Collection as BaseCollection;
6
use Laravel\Nova\Makeable;
7
use NovaFlexibleContent\Layouts\Collections\LayoutsCollection;
8
9
class ContentToFlexibleCollectionTransformer
10
{
11
    use Makeable;
12
13 4
    public function transform(mixed $value, array|Preset $layoutMapping = []): LayoutsCollection
14
    {
15 4
        $flexible = $this->getFlexibleArrayFromValue($value);
16
17 4
        if (is_null($flexible)) {
18 2
            return LayoutsCollection::make();
19
        }
20
21 3
        return LayoutsCollection::make($this->getMappedFlexibleLayouts($flexible, $layoutMapping))->filter()->values();
0 ignored issues
show
Bug introduced by
$this->getMappedFlexible...exible, $layoutMapping) of type array is incompatible with the type Illuminate\Contracts\Support\Arrayable expected by parameter $items of Illuminate\Support\Collection::make(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

21
        return LayoutsCollection::make(/** @scrutinizer ignore-type */ $this->getMappedFlexibleLayouts($flexible, $layoutMapping))->filter()->values();
Loading history...
22
    }
23
24
    /**
25
     * Transform incoming value into an array of usable layouts.
26
     */
27 4
    protected function getFlexibleArrayFromValue(mixed $value): ?array
28
    {
29 4
        if (is_string($value)) {
30 1
            $value = json_decode($value, true);
31
32 1
            return is_array($value) ? $value : null;
33
        }
34
35 4
        if (is_a($value, BaseCollection::class)) {
36 2
            return $value->all();
37
        }
38
39 2
        if (is_array($value)) {
40 1
            return $value;
41
        }
42
43 2
        return null;
44
    }
45
46
    /**
47
     * Map array with Flexible Content Layouts.
48
     */
49 3
    protected function getMappedFlexibleLayouts(array $flexible, array|Preset $layoutMapping = []): array
50
    {
51 3
        return array_map(function ($item) use ($layoutMapping) {
52 3
            return $this->getMappedLayout($item, $layoutMapping);
53 3
        }, $flexible);
54
    }
55
56
    /**
57
     * Transform given layout value into a usable Layout instance.
58
     */
59 3
    protected function getMappedLayout(mixed $item, array|Preset $layoutMapping = []): ?Layout
60
    {
61 3
        $name       = null;
62 3
        $key        = null;
63 3
        $attributes = [];
64
65 3
        if (is_a($item, \stdClass::class)) {
66 1
            $item = json_decode(json_encode($item), true);
67
        }
68
69 3
        if (is_string($item)) {
70 1
            $item = json_decode($item, true);
71
        }
72
73 3
        if (is_array($item)) {
74 3
            $name       = $item['layout']             ?? null;
75 3
            $key        = $item['key']                ?? null;
76 3
            $attributes = (array) $item['attributes'] ?? [];
77 1
        } elseif (is_a($item, Layout::class)) {
78 1
            $name       = $item->name();
79 1
            $key        = (string) $item->key();
80 1
            $attributes = $item->getAttributes();
81
        }
82
83 3
        if (!$name) {
84 1
            return null;
85
        }
86
87 3
        return $this->createMappedLayout($name, $key, $attributes, $layoutMapping);
88
    }
89
90
    /**
91
     * Transform given layout value into a usable Layout instance.
92
     */
93 3
    protected function createMappedLayout(string $name, string $key, array $attributes, array|Preset $layoutMapping = []): Layout
94
    {
95 3
        if($layoutMapping instanceof Preset) {
0 ignored issues
show
introduced by
$layoutMapping is never a sub-type of NovaFlexibleContent\Layouts\Preset.
Loading history...
96 1
            $layoutMapping = $layoutMapping->layouts();
97
        }
98
99 3
        $classname = array_key_exists($name, $layoutMapping)
100 3
            ? $layoutMapping[$name]
101 2
            : Layout::class;
102
103 3
        return new $classname($name, $name, [], $key, $attributes);
104
    }
105
}
106