Completed
Push — master ( c7aa45...252bdf )
by Yaro
04:53
created

ColumnsAndFieldsTrait::addColumn()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 1
1
<?php
2
3
namespace Yaro\Jarboe\Table\CrudTraits;
4
5
use Yaro\Jarboe\Table\Fields\AbstractField;
6
use Yaro\Jarboe\Table\Fields\Text;
7
8
trait ColumnsAndFieldsTrait
9
{
10
    private $fields = [];
11
    private $columns = [];
12
13
    /**
14
     * @param string|AbstractField $column
15
     */
16 5
    public function addColumn($column)
17
    {
18 5
        $this->columns[] = $column;
19 5
    }
20
21 52
    public function getColumns()
0 ignored issues
show
Documentation introduced by
The return type could not be reliably inferred; please add a @return annotation.

Our type inference engine in quite powerful, but sometimes the code does not provide enough clues to go by. In these cases we request you to add a @return annotation as described here.

Loading history...
22
    {
23 52
        return $this->columns;
24
    }
25
26
    /**
27
     * Get columns as field objects, or fields if there are no columns.
28
     *
29
     * @return array
30
     */
31 6
    public function getColumnsAsFields()
32
    {
33 6
        $columns = [];
34 6
        foreach ($this->getColumns() as $column) {
35 3
            if (!is_object($column)) {
36 3
                $column = $this->getFieldByName($column) ?: $this->makeDefaultColumnField($column);
37
            }
38
39 3
            if ($column) {
40 3
                $columns[] = $column;
41
            }
42
        }
43
44 6
        return $columns ?: $this->getFields();
45
    }
46
47
    /**
48
     * Get list of columns that initialized as field object.
49
     *
50
     * @return array
51
     */
52 50
    public function getColumnsWithoutRelatedField()
53
    {
54 50
        $columns = [];
55 50
        foreach ($this->getColumns() as $column) {
56 1
            if (is_object($column)) {
57 1
                $columns[] = $column;
58
            }
59
        }
60
61 50
        return $columns;
62
    }
63
64 50
    public function getAllFieldObjects()
65
    {
66 50
        $fieldsAndColumns = array_merge(
67 50
            $this->getFieldsWithoutMarkup(),
68 50
            $this->getColumnsWithoutRelatedField()
69
        );
70
71 50
        return $fieldsAndColumns;
72
    }
73
74
    /**
75
     * @param $name
76
     * @return null|AbstractField
77
     */
78 4
    public function getFieldByName($name)
79
    {
80 4
        $fields = $this->getFieldsWithoutMarkup();
81 4
        foreach ($fields as $field) {
82 3
            if ($field->name() === $name) {
83 2
                return $field;
84
            }
85
        }
86
87 2
        return null;
88
    }
89
90 50
    public function addField(AbstractField $field)
91
    {
92 50
        $this->fields[] = $field;
93 50
    }
94
95 53
    public function getFields()
0 ignored issues
show
Documentation introduced by
The return type could not be reliably inferred; please add a @return annotation.

Our type inference engine in quite powerful, but sometimes the code does not provide enough clues to go by. In these cases we request you to add a @return annotation as described here.

Loading history...
96
    {
97 53
        return $this->fields;
98
    }
99
100 52
    public function getFieldsWithoutMarkup(): array
101
    {
102 52
        $fields = [];
103 52
        foreach ($this->getFields() as $field) {
104 50
            $this->extractField($field, $fields);
105
        }
106
107 52
        return $fields;
108
    }
109
110 50
    private function extractField(AbstractField $field, &$fields)
111
    {
112 50
        if (!$field->isMarkupRow()) {
113 50
            $fields[] = $field;
114 50
            return;
115
        }
116
117 1
        foreach ($field->getFields() as $field) {
118 1
            $this->extractField($field, $fields);
119
        }
120 1
    }
121
122 2
    public function hasAnyFieldFilter()
123
    {
124
        /** @var AbstractField $field */
125 2
        foreach ($this->getColumnsAsFields() as $field) {
126 2
            if (!$field->hidden('list') && $field->filter()) {
127 1
                return true;
128
            }
129
        }
130
131 1
        return false;
132
    }
133
134 2
    private function makeDefaultColumnField($column)
135
    {
136 2
        return Text::make($column);
137
    }
138
}
139