Jake Vanderwerf
2026-09-04 32ce5c542c90be348895328078e392dde2052957
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<?php
namespace JVBase\integrations;
 
use Closure;
 
if (!defined('ABSPATH')) {
    exit;
}
 
class Field {
    public string $name;
    public string $label;
    public string $type;
    public string $hint;
    public bool $required;
    public string|Closure|bool $permission;
    protected array $options;
    protected mixed $default;
    protected string $subtype;
    protected string $placeholder;
    protected bool $hidden = false;
    protected int $min;
    protected int $max;
 
    public function __construct(string $name, string $label, string $type, callable|string|bool $permission)
    {
        $this->name = $name;
        $this->label = $label;
        $this->type = $type;
        $this->permission = is_callable($permission) ? Closure::fromCallable($permission) : $permission;
    }
 
    public function checkPermission():bool
    {
        if (is_bool($this->permission)) {
            return $this->permission;
        }
        if (is_string($this->permission)) {
            return current_user_can($this->permission);
        }
        if (is_callable($this->permission)) {
            return ($this->permission)();
        }
        error_log('Check Permission failed as no permission set. '.print_r([
            'permission' => $this->permission,
                'field' => $this->name,
            ], true));
        return false;
    }
 
    public function setRequired():void
    {
        $this->required = true;
    }
    public function setOptions(array $options):void
    {
        $this->options = $options;
    }
    public function setDefault(mixed $default):void
    {
        $this->default = $default;
    }
 
    public function setHint(string $hint):void
    {
        $this->hint = $hint;
    }
    public function setHidden(bool $hidden = true):void
    {
        $this->hidden = $hidden;
    }
 
    public function setSubType(string $type):void
    {
        $this->subtype = $type;
    }
 
    public function setMin(int $min):void
    {
        $this->min = $min;
    }
    public function setMax(int $max):void
    {
        $this->max = $max;
    }
 
    public function setPlaceholder(string $string):void
    {
        $this->placeholder = sanitize_text_field($string);
    }
 
    public function getConfig():array
    {
        $conf = [
            'name'  => $this->name,
            'label' => $this->label,
            'type'  => $this->type,
        ];
        if (isset($this->required)) {
            $conf['required'] = true;
        }
        if (isset($this->options)) {
            $conf['options'] = $this->options;
        }
        if (isset($this->default)) {
            $conf['default'] = $this->default;
        }
        if (isset($this->hint)) {
            $conf['hint'] = $this->hint;
        }
        if (isset($this->subType)) {
            $conf['subtype'] = $this->subType;
        }
        if ($this->hidden) {
            $conf['hidden'] = true;
        }
        if (isset($this->min)) {
            $conf['min'] = $this->min;
        }
        if (isset($this->max)) {
            $conf['max'] = $this->max;
        }
        if (isset($this->placeholder)) {
            $conf['placeholder'] = $this->placeholder;
        }
        return $conf;
    }
 
}