Completed
Push — master ( 4ca583...a67af2 )
by Song
02:43
created

HasFields::extend()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 2
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Encore\Admin\Form\Concerns;
4
5
use Encore\Admin\Form\Field;
6
use Illuminate\Support\Arr;
7
8
/**
9
 * @method Field\Text           text($column, $label = '')
10
 * @method Field\Checkbox       checkbox($column, $label = '')
11
 * @method Field\Radio          radio($column, $label = '')
12
 * @method Field\Select         select($column, $label = '')
13
 * @method Field\MultipleSelect multipleSelect($column, $label = '')
14
 * @method Field\Textarea       textarea($column, $label = '')
15
 * @method Field\Hidden         hidden($column, $label = '')
16
 * @method Field\Id             id($column, $label = '')
17
 * @method Field\Ip             ip($column, $label = '')
18
 * @method Field\Url            url($column, $label = '')
19
 * @method Field\Color          color($column, $label = '')
20
 * @method Field\Email          email($column, $label = '')
21
 * @method Field\Mobile         mobile($column, $label = '')
22
 * @method Field\Slider         slider($column, $label = '')
23
 * @method Field\File           file($column, $label = '')
24
 * @method Field\Image          image($column, $label = '')
25
 * @method Field\Date           date($column, $label = '')
26
 * @method Field\Datetime       datetime($column, $label = '')
27
 * @method Field\Time           time($column, $label = '')
28
 * @method Field\Year           year($column, $label = '')
29
 * @method Field\Month          month($column, $label = '')
30
 * @method Field\DateRange      dateRange($start, $end, $label = '')
31
 * @method Field\DateTimeRange  datetimeRange($start, $end, $label = '')
32
 * @method Field\TimeRange      timeRange($start, $end, $label = '')
33
 * @method Field\Number         number($column, $label = '')
34
 * @method Field\Currency       currency($column, $label = '')
35
 * @method Field\HasMany        hasMany($relationName, $label = '', $callback)
36
 * @method Field\SwitchField    switch($column, $label = '')
37
 * @method Field\Display        display($column, $label = '')
38
 * @method Field\Rate           rate($column, $label = '')
39
 * @method Field\Divider        divider($title = '')
40
 * @method Field\Password       password($column, $label = '')
41
 * @method Field\Decimal        decimal($column, $label = '')
42
 * @method Field\Html           html($html, $label = '')
43
 * @method Field\Tags           tags($column, $label = '')
44
 * @method Field\Icon           icon($column, $label = '')
45
 * @method Field\Embeds         embeds($column, $label = '', $callback)
46
 * @method Field\MultipleImage  multipleImage($column, $label = '')
47
 * @method Field\MultipleFile   multipleFile($column, $label = '')
48
 * @method Field\Captcha        captcha($column, $label = '')
49
 * @method Field\Listbox        listbox($column, $label = '')
50
 * @method Field\Table          table($column, $label, $builder)
51
 * @method Field\Timezone       timezone($column, $label = '')
52
 * @method Field\KeyValue       keyValue($column, $label = '')
53
 * @method Field\ListField      list($column, $label = '')
54
 * @method Field\BelongsTo      belongsTo($column, $selectable, $label = '')
55
 * @method Field\BelongsToMany  belongsToMany($column, $selectable, $label = '')
56
 * @method Field\FileSelect     fileSelect($column, $selectable, $label = '')
57
 */
58
trait HasFields
59
{
60
    /**
61
     * Available fields.
62
     *
63
     * @var array
64
     */
65
    public static $availableFields = [
66
        'button'         => Field\Button::class,
67
        'checkbox'       => Field\Checkbox::class,
68
        'color'          => Field\Color::class,
69
        'currency'       => Field\Currency::class,
70
        'date'           => Field\Date::class,
71
        'dateRange'      => Field\DateRange::class,
72
        'datetime'       => Field\Datetime::class,
73
        'dateTimeRange'  => Field\DatetimeRange::class,
74
        'datetimeRange'  => Field\DatetimeRange::class,
75
        'decimal'        => Field\Decimal::class,
76
        'display'        => Field\Display::class,
77
        'divider'        => Field\Divider::class,
78
        'embeds'         => Field\Embeds::class,
79
        'email'          => Field\Email::class,
80
        'file'           => Field\File::class,
81
        'hasMany'        => Field\HasMany::class,
82
        'hidden'         => Field\Hidden::class,
83
        'id'             => Field\Id::class,
84
        'image'          => Field\Image::class,
85
        'ip'             => Field\Ip::class,
86
        'mobile'         => Field\Mobile::class,
87
        'month'          => Field\Month::class,
88
        'multipleSelect' => Field\MultipleSelect::class,
89
        'number'         => Field\Number::class,
90
        'password'       => Field\Password::class,
91
        'radio'          => Field\Radio::class,
92
        'rate'           => Field\Rate::class,
93
        'select'         => Field\Select::class,
94
        'slider'         => Field\Slider::class,
95
        'switch'         => Field\SwitchField::class,
96
        'text'           => Field\Text::class,
97
        'textarea'       => Field\Textarea::class,
98
        'time'           => Field\Time::class,
99
        'timeRange'      => Field\TimeRange::class,
100
        'url'            => Field\Url::class,
101
        'year'           => Field\Year::class,
102
        'html'           => Field\Html::class,
103
        'tags'           => Field\Tags::class,
104
        'icon'           => Field\Icon::class,
105
        'multipleFile'   => Field\MultipleFile::class,
106
        'multipleImage'  => Field\MultipleImage::class,
107
        'captcha'        => Field\Captcha::class,
108
        'listbox'        => Field\Listbox::class,
109
        'table'          => Field\Table::class,
110
        'timezone'       => Field\Timezone::class,
111
        'keyValue'       => Field\KeyValue::class,
112
        'list'           => Field\ListField::class,
113
        'belongsTo'      => Field\BelongsTo::class,
114
        'belongsToMany'  => Field\BelongsToMany::class,
115
        'fileSelect'     => Field\FileSelect::class,
116
    ];
117
118
    /**
119
     * Form field alias.
120
     *
121
     * @var array
122
     */
123
    public static $fieldAlias = [];
124
125
    /**
126
     * Register custom field.
127
     *
128
     * @param string $abstract
129
     * @param string $class
130
     *
131
     * @return void
132
     */
133
    public static function extend($abstract, $class)
134
    {
135
        static::$availableFields[$abstract] = $class;
136
    }
137
138
    /**
139
     * Set form field alias.
140
     *
141
     * @param string $field
142
     * @param string $alias
143
     *
144
     * @return void
145
     */
146
    public static function alias($field, $alias)
147
    {
148
        static::$fieldAlias[$alias] = $field;
149
    }
150
151
    /**
152
     * Remove registered field.
153
     *
154
     * @param array|string $abstract
155
     */
156
    public static function forget($abstract)
157
    {
158
        Arr::forget(static::$availableFields, $abstract);
159
    }
160
161
    /**
162
     * Find field class.
163
     *
164
     * @param string $method
165
     *
166
     * @return bool|mixed
167
     */
168
    public static function findFieldClass($method)
169
    {
170
        // If alias exists.
171
        if (isset(static::$fieldAlias[$method])) {
172
            $method = static::$fieldAlias[$method];
173
        }
174
175
        $class = Arr::get(static::$availableFields, $method);
176
177
        if (class_exists($class)) {
178
            return $class;
179
        }
180
181
        return false;
182
    }
183
184
    /**
185
     * Collect assets required by registered field.
186
     *
187
     * @return array
188
     */
189
    public static function collectFieldAssets(): array
190
    {
191
        if (!empty(static::$collectedAssets)) {
192
            return static::$collectedAssets;
193
        }
194
195
        $css = collect();
196
        $js = collect();
197
198
        foreach (static::$availableFields as $field) {
199
            if (!method_exists($field, 'getAssets')) {
200
                continue;
201
            }
202
203
            $assets = call_user_func([$field, 'getAssets']);
204
205
            $css->push(Arr::get($assets, 'css'));
206
            $js->push(Arr::get($assets, 'js'));
207
        }
208
209
        return static::$collectedAssets = [
210
            'css' => $css->flatten()->unique()->filter()->toArray(),
211
            'js'  => $js->flatten()->unique()->filter()->toArray(),
212
        ];
213
    }
214
}
215