ezframe 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
})
|