get_primitive_field()   B
last analyzed

Complexity

Conditions 9
Paths 16

Size

Total Lines 23
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 9
eloc 20
nc 16
nop 5
dl 0
loc 23
rs 8.0555
c 0
b 0
f 0
1
<?php
2
    function get_primitive_field($type, $name, $data, $list, $extras) {
3
        $out = "";
4
        $field_name = "data[$name]" . ($list ? "[]" : "");
5
        switch ($type) {
6
            case 'color':
7
                if (!$data) {
8
                    $data = 'rgba(0, 0, 0, 0)';
9
                }
10
                $out .= "<input type='text' data-type='color' name='$field_name' value='" . htmlentities($data, ENT_QUOTES) . "' $extras/>";
11
                break;
12
            case 'longtext':
13
                $out .= "<br><textarea name='$field_name' rows='10' cols='50' $extras>" . htmlentities($data, ENT_QUOTES) . "</textarea>";
14
                break;
15
            case 'time':
16
            case 'date':
17
            case 'datetime':
18
                $out .= "<input type='text' data-type='$type' name='$field_name' value='" . htmlentities($data, ENT_QUOTES) . "' $extras/>";
19
                break;
20
            case 'text':
21
            default:
22
                $out .= "<input type='text' name='$field_name' value='" . htmlentities($data, ENT_QUOTES) . "' $extras/>";
23
        }
24
        return $out;
25
    }
26
27
    function get_field($name, $meta, $data) {
28
        $opt = empty($meta['optional']) ? 'required' : '';
29
        $required_notice = empty($meta['optional']) ? '(*)' : '(optional)';
30
31
        $out = "<label for='$name'>$meta[name] $required_notice: ";
32
33
        switch ($meta["type"]) {
34
            case "list":
35
                $item_actions = " <a onclick='removeListItem(this)' href='javascript:void(0)'><i class='fa fa-trash'></i> Remove</a>"
36
                    . " <a onclick='moveUpListItem(this)' href='javascript:void(0)'><i class='fa fa-angle-up'></i> Move Up</a>"
37
                    . " <a onclick='moveDownListItem(this)' href='javascript:void(0)'><i class='fa fa-angle-down'></i> Move Down</a>";
38
39
                $out .= "<div class='jugaad-list' data-type='$meta[listType]'>"
40
                    . "<div class='example-input' style='display:none'>"
41
                    . get_primitive_field($meta["listType"], $name, "", true, "disabled")
42
                    . $item_actions
43
                    . "</div><input type='hidden' name='data[$name]' value='' />"
44
                    . "<br><div class='input-list'>";
45
46
                if (!is_array($data)) {
47
                    $data = [];
48
                }
49
                foreach ($data as $list_elem) {
50
                    $out .= "<div>"
51
                        . get_primitive_field($meta["listType"], $name, $list_elem, true, "")
52
                        . $item_actions
53
                        . "</div>";
54
                }
55
                $out .= "</div><br><a onclick='addListItem(this)' href='javascript:void(0)'><i class='fa fa-plus'></i> Add item</a></div>";
56
                break;
57
            case 'external':
58
                $out .= "<a onclick='foldNext(this)' href='javascript:void(0)'>Show</a>"
59
                    . "<pre style='display: none'>"
60
                    . htmlentities(json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES), ENT_QUOTES)
61
                    . "</pre>";
62
                break;
63
            default:
64
                $out .= get_primitive_field($meta["type"], $name, $data, false, $opt);
65
        }
66
67
        return $out . "</label>";
68
    }
69
?>
70
<?php
71
    if (is_array($template_meta)):
72
        foreach ($template_meta as $name => $meta):
73
            echo get_field($name, $meta, $data[$name]);
74
        endforeach;
75
    endif;
76
?>
77
<script>
78
    /* exported foldNext */
79
    function foldNext(elem) {
80
        var nextElem = elem.nextElementSibling;
81
        var display = nextElem.style.display;
82
        if (display == "none") {
83
            nextElem.style.display = "";
84
            elem.innerHTML = "Hide";
85
        } else {
86
            nextElem.style.display = "none";
87
            elem.innerHTML = "Show";
88
        }
89
    }
90
91
    /* exported addListItem, moveUpListItem, moveDownListItem */
92
    function addListItem(elem) {
93
        var jugaadList = elem.parentNode;
94
        var exampleListItem = jugaadList.getElementsByClassName("example-input")[0];
95
        var listItem = exampleListItem.cloneNode(true);
96
        listItem.className = "";
97
        listItem.style.display = "";
98
        var inputElem;
99
        switch (jugaadList.dataset.type) {
100
            case "text":
101
                inputElem = listItem.getElementsByTagName('input')[0];
102
                inputElem.disabled = false;
103
                break;
104
            case "color":
105
                inputElem = listItem.getElementsByTagName('input')[0];
106
                inputElem.disabled = false;
107
                setupColorInput($(inputElem));
108
                break;
109
            case "longtext":
110
                inputElem = listItem.getElementsByTagName('textarea')[0];
111
                inputElem.disabled = false;
112
                break;
113
            case "time":
114
            case "date":
115
            case "datetime":
116
                inputElem = listItem.getElementsByTagName('input')[0];
117
                inputElem.disabled = false;
118
                setupDateTime($(inputElem));
119
                break;
120
            default:
121
122
        }
123
        jugaadList.getElementsByClassName("input-list")[0].appendChild(listItem);
124
    }
125
126
    function moveUpListItem(elem) {
127
        var listItem = elem.parentNode;
128
        var prevItem = listItem.previousElementSibling;
129
        if (prevItem) {
130
            prevItem.parentNode.insertBefore(listItem, prevItem);
131
        }
132
    }
133
134
    function moveDownListItem(elem) {
135
        var listItem = elem.parentNode;
136
        var nextItem = listItem.nextElementSibling;
137
        if (nextItem) {
138
            nextItem.parentNode.insertBefore(listItem, nextItem.nextSibling);
139
        }
140
    }
141
142
    /* exported removeListItem */
143
    function removeListItem(elem) {
144
        var listItem = elem.parentNode;
145
        listItem.parentNode.removeChild(listItem);
146
    }
147
148
    /* global $ */
149
    function setupColorInput($elem) {
150
        $elem.spectrum({
151
            showInput: true,
152
            showAlpha: true,
153
            showPalette: true,
154
            palette: [
155
                ["transparent"],
156
                ["#000","#444","#666","#999","#ccc","#eee","#f3f3f3","#fff"],
157
                ["#f00","#f90","#ff0","#0f0","#0ff","#00f","#90f","#f0f"],
158
                ["#f4cccc","#fce5cd","#fff2cc","#d9ead3","#d0e0e3","#cfe2f3","#d9d2e9","#ead1dc"],
159
                ["#ea9999","#f9cb9c","#ffe599","#b6d7a8","#a2c4c9","#9fc5e8","#b4a7d6","#d5a6bd"],
160
                ["#e06666","#f6b26b","#ffd966","#93c47d","#76a5af","#6fa8dc","#8e7cc3","#c27ba0"],
161
                ["#c00","#e69138","#f1c232","#6aa84f","#45818e","#3d85c6","#674ea7","#a64d79"],
162
                ["#900","#b45f06","#bf9000","#38761d","#134f5c","#0b5394","#351c75","#741b47"],
163
                ["#600","#783f04","#7f6000","#274e13","#0c343d","#073763","#20124d","#4c1130"]
164
            ],
165
            preferredFormat: "rgb"
166
        });
167
    }
168
169
    function setupDateTime($elem) {
170
        $elem.each(function() {
171
            var $this = $(this);
172
            var pickerType = $this.data('type');
173
            var datepicker = (pickerType == 'date' || pickerType == 'datetime');
174
            var timepicker = (pickerType == 'time' || pickerType == 'datetime');
175
            var format = ((datepicker ? "Y-m-d" : "") + " " + (timepicker ? "H:i": "")).trim();
176
            $this.datetimepicker({
177
                datepicker: datepicker,
178
                timepicker: timepicker,
179
                format: format,
180
                defaultTime: "8:00",
181
                step: 15
182
            });
183
        });
184
    }
185
186
    setupColorInput($('input[data-type=color]:enabled'));
187
    setupDateTime(
188
        $('input[data-type=time]:enabled, input[data-type=date]:enabled, input[data-type=datetime]:enabled')
189
    );
190
</script>
191