ezframe 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/asset/js/ezframe.js +262 -162
- data/exe/dbmigrate +43 -9
- data/exe/html2ruby +61 -0
- data/lib/ezframe.rb +0 -1
- data/lib/ezframe/column_type.rb +50 -13
- data/lib/ezframe/database.rb +7 -7
- data/lib/ezframe/editor_common.rb +26 -8
- data/lib/ezframe/ht.rb +5 -5
- data/lib/ezframe/html.rb +20 -13
- data/lib/ezframe/main_editor.rb +13 -232
- data/lib/ezframe/main_page_kit.rb +226 -0
- data/lib/ezframe/page_base.rb +1 -8
- data/lib/ezframe/single_page_editor.rb +7 -190
- data/lib/ezframe/single_page_kit.rb +199 -0
- data/lib/ezframe/sub_editor.rb +3 -200
- data/lib/ezframe/sub_page_kit.rb +213 -0
- data/lib/ezframe/version.rb +1 -1
- metadata +7 -3
- data/lib/ezframe/editor.rb +0 -176
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dda752b637e89872dec11e1949353922cab172fc7931d22f32188afb713c39ec
|
4
|
+
data.tar.gz: 579e00d496d8692c205023e49961befcbcf79b4d879765e1c36bcf326ea74b54
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 449ab7af3d8d6cd3b8d0b81a80358e27746fb6dc065ece3dd101bcb6731299bf4a5f438234830016606aa1db89c91414fbe6d164a16627d40c98ead8d84a7a40
|
7
|
+
data.tar.gz: 41a9b647f6cc4ec6e37f4febd61e109e9719760f59f6981920b0a3d7b2eb23a893feda34f15055a2677a9ae1dbcc4eab9740a433fea5c09ac963506cbf8a8b21
|
data/asset/js/ezframe.js
CHANGED
@@ -1,31 +1,216 @@
|
|
1
|
+
// 2020年05月25日(月) 6
|
2
|
+
var extra_event_funcs = []
|
3
|
+
var event_commands = {
|
4
|
+
/*
|
5
|
+
switch_hide: function(event) {
|
6
|
+
console.log("switch")
|
7
|
+
var a = event.between
|
8
|
+
for(var i = 0; i<a.length; i++) {
|
9
|
+
switch_hide(a[i])
|
10
|
+
}
|
11
|
+
},*/
|
12
|
+
set_validation: function(event, form_dom) {
|
13
|
+
console.log("set_validation")
|
14
|
+
var inputs = collect_all_input_elements(form_dom)
|
15
|
+
for(var i = 0; i < inputs.length; i++) {
|
16
|
+
var elem = inputs[i]
|
17
|
+
var send_with = "input";
|
18
|
+
var on = "change"
|
19
|
+
var target_key = elem.name
|
20
|
+
var ezvalid = elem.getAttribute("ezvalid")
|
21
|
+
if (ezvalid) {
|
22
|
+
ezvalid = parse_one_event(ezvalid)
|
23
|
+
if (ezvalid.with) { send_with = ezvalid.with }
|
24
|
+
if (ezvalid.on) { on = ezvalid.on }
|
25
|
+
if (ezvalid.target_key) { target_key = ezvalid.target_key }
|
26
|
+
}
|
27
|
+
var ev_s = "on=" + on + ":branch=single_validate:target_key=" + target_key + ":with=" + send_with + ":url=" + event.validate_url
|
28
|
+
console.log("set_validation: ev_s="+ev_s)
|
29
|
+
elem.setAttribute("ezevent", ev_s)
|
30
|
+
elem.addEventListener(on, function(ev) {
|
31
|
+
execute_event(ev.srcElement)
|
32
|
+
})
|
33
|
+
}
|
34
|
+
},
|
35
|
+
redirect: function(event) {
|
36
|
+
console.log("redirect:" + event.url)
|
37
|
+
location.href = event.url
|
38
|
+
},
|
39
|
+
/*
|
40
|
+
toggle_hide: function(event) {
|
41
|
+
console.log("toggle_hide: target=", event.target)
|
42
|
+
for(var i=0; i < event.target.length; i++) {
|
43
|
+
var elem = document.querySelector(event.target[i])
|
44
|
+
if (elem) {
|
45
|
+
var list = elem.classList
|
46
|
+
if (list.contains("hide")) {
|
47
|
+
elem.classList.remove("hide")
|
48
|
+
} else {
|
49
|
+
elem.classList.add("hide")
|
50
|
+
}
|
51
|
+
}
|
52
|
+
}
|
53
|
+
}
|
54
|
+
*/
|
55
|
+
}
|
56
|
+
|
57
|
+
// サーバからのレスポンスを処理する関数
|
58
|
+
var response_funcs = {
|
59
|
+
inject: function(res, obj) {
|
60
|
+
var elem
|
61
|
+
console.log("inject: " + res.inject + ", body=" + res.body)
|
62
|
+
if (res.inject == "this") {
|
63
|
+
elem = obj
|
64
|
+
} else {
|
65
|
+
elem = document.querySelector(res.inject)
|
66
|
+
}
|
67
|
+
if (elem) {
|
68
|
+
elem.innerHTML = (res.body || "")
|
69
|
+
add_event(elem)
|
70
|
+
exec_ezload(elem)
|
71
|
+
} else {
|
72
|
+
console.log("inject: no such element: " + res.inject)
|
73
|
+
}
|
74
|
+
},
|
75
|
+
set_value: function(res, obj) {
|
76
|
+
var elem
|
77
|
+
console.log("set_value: " + res.set_value + ", value=", res.value)
|
78
|
+
if (res.set_value == "this") {
|
79
|
+
elem = obj
|
80
|
+
} else {
|
81
|
+
elem = document.querySelector(res.set_value)
|
82
|
+
}
|
83
|
+
if (elem) {
|
84
|
+
if (res.set_value.indexOf("select") > 0) {
|
85
|
+
elem.selectedIndex = res.value
|
86
|
+
} else {
|
87
|
+
elem.value = res.value
|
88
|
+
}
|
89
|
+
} else {
|
90
|
+
console.log("set_value: no such element: " + res.set_value)
|
91
|
+
}
|
92
|
+
},
|
93
|
+
reset_error: function(res, obj) {
|
94
|
+
console.log("reset_error: " + res.reset_error)
|
95
|
+
var elems = document.querySelectorAll(res.reset_error)
|
96
|
+
if (elems) {
|
97
|
+
for(var i=0; i < elems.length; i++) {
|
98
|
+
elem = elems[i]
|
99
|
+
elem.innerHTML = ""
|
100
|
+
elem.classList.add("hide")
|
101
|
+
}
|
102
|
+
}
|
103
|
+
},
|
104
|
+
set_error: function(res, obj) {
|
105
|
+
var elem;
|
106
|
+
console.log("set_error: " + res.set_error + ", value=", res.value)
|
107
|
+
elem = document.querySelector(res.set_error)
|
108
|
+
if (elem) {
|
109
|
+
elem.innerHTML = res.value
|
110
|
+
if (!res.value || res.value.length == 0) {
|
111
|
+
elem.classList.add("hide")
|
112
|
+
} else {
|
113
|
+
elem.classList.remove("hide")
|
114
|
+
}
|
115
|
+
} else {
|
116
|
+
console.log("set_error: no such element: " + res.set_error)
|
117
|
+
}
|
118
|
+
},
|
119
|
+
add_class: function(res, obj) {
|
120
|
+
var elem;
|
121
|
+
console.log("add_class: " + res.add_class + ", value=", res.value)
|
122
|
+
if (res.add_class == "this") {
|
123
|
+
elem = obj
|
124
|
+
} else {
|
125
|
+
elem = document.querySelector(res.add_class)
|
126
|
+
}
|
127
|
+
if (elem) {
|
128
|
+
elem.classList.add(res.value)
|
129
|
+
}
|
130
|
+
},
|
131
|
+
remove_class: function(res, obj) {
|
132
|
+
var elem;
|
133
|
+
console.log("remove_class: " + res.remove_class + ", value=", res.value)
|
134
|
+
if (res.remove_class == "this") {
|
135
|
+
elem = obj
|
136
|
+
} else {
|
137
|
+
elem = document.querySelector(res.remove_class)
|
138
|
+
}
|
139
|
+
if (elem) {
|
140
|
+
elem.classList.remove(res.value)
|
141
|
+
}
|
142
|
+
}
|
143
|
+
}
|
144
|
+
|
145
|
+
// register events included in a object
|
1
146
|
function add_event(obj) {
|
2
|
-
var elems = obj.querySelectorAll('[
|
147
|
+
var elems = obj.querySelectorAll('[ezevent]')
|
148
|
+
if (elems) {
|
149
|
+
console.log("add_event: events=" + elems.length)
|
150
|
+
for (var i = 0; i < elems.length; i++) {
|
151
|
+
var elem = elems[i]
|
152
|
+
var event_s = elem.getAttribute("ezevent")
|
153
|
+
var event_a = parse_event(event_s)
|
154
|
+
if (event_a.length > 1) {
|
155
|
+
console.log("inculde multi events: "+event_a.length)
|
156
|
+
console.dir(event_a)
|
157
|
+
}
|
158
|
+
for(var j = 0; j < event_a.length; j++) {
|
159
|
+
var event = event_a[j]
|
160
|
+
if (event.on == "load") {
|
161
|
+
if (!elem.event_done) {
|
162
|
+
console.log("load: "+event_s)
|
163
|
+
execute_event(elem, "ezevent")
|
164
|
+
elem.event_done = 1
|
165
|
+
}
|
166
|
+
} else {
|
167
|
+
elem.addEventListener(event.on, function (ev) {
|
168
|
+
execute_event(this, "ezevent", ev)
|
169
|
+
})
|
170
|
+
}
|
171
|
+
}
|
172
|
+
}
|
173
|
+
}
|
174
|
+
// execute extra event functions
|
175
|
+
for(var i=0; i < extra_event_funcs.length; i++) {
|
176
|
+
extra_event_funcs[i](obj)
|
177
|
+
}
|
178
|
+
}
|
179
|
+
|
180
|
+
function exec_ezload(obj) {
|
181
|
+
var elems = obj.querySelectorAll('[ezload]')
|
3
182
|
if (elems) {
|
4
|
-
console.log("events=" + elems.length)
|
183
|
+
console.log("ezload: events=" + elems.length)
|
5
184
|
for (var i = 0; i < elems.length; i++) {
|
6
185
|
var elem = elems[i]
|
7
|
-
|
8
|
-
|
9
|
-
var event = parse_event(event_s)
|
10
|
-
if (event.on == "load" && !elem.event_done) {
|
11
|
-
console.log("load: "+event_s)
|
12
|
-
execute_event(elem)
|
186
|
+
if (!elem.event_done) {
|
187
|
+
execute_event(elem, "ezload")
|
13
188
|
elem.event_done = 1
|
14
|
-
} else {
|
15
|
-
elem.addEventListener(event.on, function () {
|
16
|
-
execute_event(this)
|
17
|
-
})
|
18
189
|
}
|
19
190
|
}
|
20
191
|
}
|
21
|
-
register_switch_event(obj)
|
22
|
-
register_hover_button(obj)
|
23
|
-
initialize_materialize()
|
24
|
-
var elems = document.querySelectorAll('.dropdown-trigger')
|
25
|
-
var instances = M.Dropdown.init(elems, {})
|
26
192
|
}
|
27
193
|
|
194
|
+
// parse attrite named event
|
28
195
|
function parse_event(event) {
|
196
|
+
var event_a;
|
197
|
+
if (!event) { return [] }
|
198
|
+
if (event.indexOf(";;") > -1) {
|
199
|
+
event_a = event.split(";;")
|
200
|
+
} else {
|
201
|
+
event_a = [ event ]
|
202
|
+
}
|
203
|
+
console.log("parse_event:"+event_a.length) // event_a="+JSON.stringify(event_a))
|
204
|
+
// console.dir(event_a)
|
205
|
+
var parsed_event_a = []
|
206
|
+
for(var i = 0; i < event_a.length; i++) {
|
207
|
+
var ev = event_a[i]
|
208
|
+
parsed_event_a.push(parse_one_event(ev))
|
209
|
+
}
|
210
|
+
return parsed_event_a
|
211
|
+
}
|
212
|
+
|
213
|
+
function parse_one_event(event) {
|
29
214
|
var ev = {}
|
30
215
|
var a = event.split(":")
|
31
216
|
for (var i = 0; i < a.length; i++) {
|
@@ -48,86 +233,51 @@ function parse_event(event) {
|
|
48
233
|
}
|
49
234
|
}
|
50
235
|
}
|
236
|
+
// console.log("parse_one_event: ")
|
237
|
+
// console.dir(ev)
|
51
238
|
return ev
|
52
239
|
}
|
53
240
|
|
54
|
-
function execute_event(obj) {
|
55
|
-
|
56
|
-
|
57
|
-
var
|
58
|
-
var
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
for(key in event) {
|
68
|
-
if ([ "command", "on", "url" ].indexOf(key) >= 0) { continue }
|
69
|
-
window.ez_global[key] = event[key]
|
70
|
-
}
|
71
|
-
// console.log("set_global:" + JSON.stringify(window.ezframe))
|
72
|
-
return
|
73
|
-
case "redirect":
|
74
|
-
console.log("redirect:" + event.url)
|
75
|
-
location.href = event.url
|
76
|
-
return
|
77
|
-
case "enable_datatable":
|
78
|
-
enable_datatable(event)
|
79
|
-
return
|
80
|
-
}
|
81
|
-
with_attr(event, obj)
|
82
|
-
post_values(event, obj)
|
83
|
-
}
|
84
|
-
|
85
|
-
function enable_datatable(event) {
|
86
|
-
// $("#enable_datatable").DataTable();
|
87
|
-
console.log("enable_datatable: target="+event.target)
|
88
|
-
// console.log($(tevent.arget))
|
89
|
-
var list_size = event.size || 5
|
90
|
-
$(event.target).DataTable({
|
91
|
-
lengthChange: false,
|
92
|
-
displayLength: parseInt(list_size),
|
93
|
-
columnDefs: [{ targets: '_all', className: 'ellipsis' }],
|
94
|
-
language: {
|
95
|
-
"decimal": ".",
|
96
|
-
"thousands": ",",
|
97
|
-
"sProcessing": "処理中...",
|
98
|
-
"sLengthMenu": "_MENU_ 件表示",
|
99
|
-
"sZeroRecords": "データはありません。",
|
100
|
-
"sInfo": " _TOTAL_ 件中 _START_ から _END_ まで表示",
|
101
|
-
"sInfoEmpty": " 0 件中 0 から 0 まで表示",
|
102
|
-
"sInfoFiltered": "(全 _MAX_ 件より抽出)",
|
103
|
-
"sInfoPostFix": "",
|
104
|
-
"sSearch": "検索:",
|
105
|
-
"sUrl": "",
|
106
|
-
"oPaginate": {
|
107
|
-
"sFirst": "<< 先頭",
|
108
|
-
"sPrevious": "< 前",
|
109
|
-
"sNext": "次 > ",
|
110
|
-
"sLast": "最終 >>"
|
111
|
-
}
|
241
|
+
function execute_event(obj, attr_key = "ezevent", ev = null) {
|
242
|
+
var event_s = obj.getAttribute(attr_key)
|
243
|
+
console.log("execute_event: "+attr_key+", event="+event_s+", ev="+JSON.stringify(ev))
|
244
|
+
var event_a = parse_event(event_s)
|
245
|
+
for(var i = 0; i < event_a.length; i++) {
|
246
|
+
var event = event_a[i]
|
247
|
+
func = event_commands[event.command]
|
248
|
+
if (func) {
|
249
|
+
func(event, obj)
|
250
|
+
}
|
251
|
+
with_attr(event, obj)
|
252
|
+
if (event.url) {
|
253
|
+
post_values(event, obj)
|
112
254
|
}
|
113
|
-
}
|
255
|
+
}
|
114
256
|
}
|
115
257
|
|
116
258
|
function with_attr(event, obj) {
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
259
|
+
switch (event.with) {
|
260
|
+
case "form":
|
261
|
+
var node = obj
|
262
|
+
while (node && node.nodeName != 'FORM') {
|
263
|
+
node = node.parentNode
|
264
|
+
}
|
265
|
+
form = collect_form_values(node)
|
266
|
+
event.form = form
|
267
|
+
break
|
268
|
+
case "input":
|
269
|
+
event.form = {}
|
270
|
+
event.form[obj.name] = obj.value
|
271
|
+
break
|
272
|
+
default:
|
273
|
+
var node = document.querySelector(event.with)
|
274
|
+
form = collect_form_values(node)
|
275
|
+
event.form = form
|
276
|
+
break
|
128
277
|
}
|
129
278
|
}
|
130
279
|
|
280
|
+
// サーバーにJSONをPOST
|
131
281
|
function post_values(event, obj) {
|
132
282
|
var xhr = new XMLHttpRequest()
|
133
283
|
xhr.onreadystatechange = function () {
|
@@ -140,62 +290,55 @@ function post_values(event, obj) {
|
|
140
290
|
xhr.open("POST", event.url, true)
|
141
291
|
xhr.setRequestHeader("Content-Type", "application/json")
|
142
292
|
xhr.responseType = 'json'
|
143
|
-
send_values = {
|
144
|
-
if (window.ezframe) {
|
145
|
-
send_values.global = window.ezframe
|
146
|
-
}
|
293
|
+
send_values = { ezevent: event }
|
147
294
|
xhr.send(JSON.stringify(send_values))
|
148
295
|
}
|
149
296
|
|
297
|
+
// サーバーからの返信を処理
|
150
298
|
function manage_response(res, event, obj) {
|
151
299
|
var elem
|
152
|
-
console.log("manage_response: res="+JSON.stringify(res)+", event=" + JSON.stringify(event) +
|
153
|
-
|
300
|
+
// console.log("manage_response: res="+JSON.stringify(res)+", event=" + JSON.stringify(event) +
|
301
|
+
// ", obj=" + JSON.stringify(obj))
|
154
302
|
if (!res) { return }
|
155
303
|
if (Array.isArray(res)) {
|
156
304
|
for(var i = 0; i < res.length; i++) {
|
157
|
-
|
305
|
+
manage_one_response(res[i], obj)
|
158
306
|
}
|
159
307
|
} else {
|
160
|
-
|
308
|
+
manage_one_response(res, obj)
|
161
309
|
}
|
162
310
|
}
|
163
311
|
|
164
|
-
|
165
|
-
|
166
|
-
console.log("inject: " + res.inject)
|
167
|
-
elem = document.querySelector(res.inject)
|
168
|
-
if (elem) {
|
169
|
-
elem.innerHTML = res.body.replace(/<br>/g, "\n")
|
170
|
-
add_event(elem)
|
171
|
-
} else {
|
172
|
-
console.log("no such element: "+res.inject)
|
173
|
-
}
|
174
|
-
}
|
312
|
+
// サーバーからの返信を1件処理
|
313
|
+
function manage_one_response(res, obj) {
|
175
314
|
if (res.redirect) {
|
176
315
|
console.log("redirect:" + res.redirect)
|
177
316
|
location.href = res.redirect
|
178
|
-
return
|
317
|
+
return
|
179
318
|
}
|
180
|
-
|
181
|
-
|
182
|
-
if (
|
183
|
-
|
184
|
-
node = node.parentNode
|
185
|
-
}
|
186
|
-
node.reset();
|
319
|
+
// サーバーからの戻り値のハッシュのキーにresponse_funcsのキーに一致するものがあったら、実行する。
|
320
|
+
for (var key in response_funcs) {
|
321
|
+
if (res[key]) {
|
322
|
+
response_funcs[key](res, obj)
|
187
323
|
}
|
188
324
|
}
|
189
325
|
}
|
190
326
|
|
191
|
-
|
192
|
-
|
327
|
+
// 全ての入力要素を集める
|
328
|
+
function collect_all_input_elements(obj) {
|
193
329
|
var inputs = Array.from(obj.querySelectorAll("input"));
|
194
330
|
var selects = Array.from(obj.querySelectorAll("select"));
|
195
331
|
var textareas = Array.from(obj.querySelectorAll("textarea"));
|
196
|
-
// console.dir(inputs)
|
197
332
|
inputs = inputs.concat(selects)
|
198
333
|
inputs = inputs.concat(textareas)
|
334
|
+
return inputs
|
335
|
+
}
|
336
|
+
|
337
|
+
// 入力フォームの値を集収
|
338
|
+
function collect_form_values(obj) {
|
339
|
+
if (!obj) {return}
|
340
|
+
var res = {};
|
341
|
+
var inputs = collect_all_input_elements(obj)
|
199
342
|
for (var i = 0; i < inputs.length; i++) {
|
200
343
|
var elem = inputs[i]
|
201
344
|
if (!elem.name) { continue }
|
@@ -205,7 +348,6 @@ function collect_form_values(obj) {
|
|
205
348
|
}
|
206
349
|
var cur_value = res[elem.name]
|
207
350
|
var elem_value = elem.value
|
208
|
-
elem_value = elem_value.replace(/\n/g, '<br>')
|
209
351
|
if (cur_value) {
|
210
352
|
if (Array.isArray(cur_value)) {
|
211
353
|
cur_value.push(elem_value)
|
@@ -239,49 +381,7 @@ function switch_hide(button) {
|
|
239
381
|
}
|
240
382
|
}
|
241
383
|
|
242
|
-
function register_switch_event(elem) {
|
243
|
-
var boxes = elem.querySelectorAll(".switch-box")
|
244
|
-
for(var i = 0; i < boxes.length; i++) {
|
245
|
-
var box = boxes[i]
|
246
|
-
var buttons = box.querySelectorAll(".switch-button")
|
247
|
-
for(var j = 0; j < buttons.length; j++) {
|
248
|
-
var button = buttons[j]
|
249
|
-
button.addEventListener('click', function() { switch_hide(this) })
|
250
|
-
}
|
251
|
-
}
|
252
|
-
}
|
253
|
-
|
254
|
-
function register_hover_button(obj) {
|
255
|
-
var elems = obj.querySelectorAll(".hover-button")
|
256
|
-
for(var i = 0; i < elems.length; i++) {
|
257
|
-
var node = elems[i]
|
258
|
-
while(node && !node.classList.contains("hover-button-box") ) { node = node.parentNode }
|
259
|
-
//var parent = elems[i].parentNode.parentNode
|
260
|
-
node.addEventListener('mouseenter', function() {
|
261
|
-
console.log("show button")
|
262
|
-
var btns = this.querySelectorAll(".hover-button")
|
263
|
-
for (var j = 0; j < btns.length; j++) {
|
264
|
-
btns[j].classList.remove("hide")
|
265
|
-
}
|
266
|
-
})
|
267
|
-
node.addEventListener('mouseleave', function() {
|
268
|
-
console.log("hide button")
|
269
|
-
var btns = this.querySelectorAll(".hover-button")
|
270
|
-
for (var j = 0; j < btns.length; j++) {
|
271
|
-
btns[j].classList.add("hide")
|
272
|
-
}
|
273
|
-
})
|
274
|
-
}
|
275
|
-
}
|
276
|
-
|
277
|
-
|
278
384
|
document.addEventListener('DOMContentLoaded', function () {
|
279
|
-
if (!window.ez_global) { window.ez_global = {} }
|
280
|
-
add_event(document)
|
281
|
-
})
|
282
|
-
|
283
|
-
/*
|
284
|
-
$(document).ready(function () {
|
285
385
|
add_event(document)
|
286
|
-
|
287
|
-
|
386
|
+
exec_ezload(document)
|
387
|
+
})
|