|
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
|
|
|
|