ezframe 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +11 -4
- data/app_template/asset/image/favicon.ico +0 -0
- data/app_template/asset/js/ezframe.js +288 -0
- data/app_template/config/generic.yml +3 -0
- data/app_template/config/materialize.yml +5 -0
- data/{example/chat → app_template}/config.ru +2 -10
- data/app_template/pages/basic.rb +5 -0
- data/exe/create_table.rb +1 -0
- data/exe/setup.rb +15 -0
- data/ezframe.gemspec +3 -4
- data/lib/ezframe/auth.rb +15 -12
- data/lib/ezframe/column_set.rb +68 -28
- data/lib/ezframe/column_type.rb +231 -68
- data/lib/ezframe/config.rb +4 -0
- data/lib/ezframe/controller.rb +20 -10
- data/lib/ezframe/database.rb +10 -3
- data/lib/ezframe/ht.rb +167 -0
- data/lib/ezframe/html.rb +28 -4
- data/lib/ezframe/japanese_utils.rb +40 -0
- data/lib/ezframe/{pages.rb → loader.rb} +3 -0
- data/lib/ezframe/materialize.rb +55 -20
- data/lib/ezframe/model.rb +0 -2
- data/lib/ezframe/page_base.rb +18 -12
- data/lib/ezframe/page_kit.rb +12 -33
- data/lib/ezframe/template.rb +20 -15
- data/lib/ezframe/util.rb +5 -0
- data/lib/ezframe/version.rb +1 -1
- data/lib/ezframe.rb +5 -4
- metadata +27 -70
- data/example/auth/Gemfile +0 -8
- data/example/auth/asset/css/materialize.min.css +0 -13
- data/example/auth/asset/js/common.js +0 -200
- data/example/auth/asset/js/htmlgen.js +0 -79
- data/example/auth/columns/user.yml +0 -12
- data/example/auth/config/view_conf.yml +0 -3
- data/example/auth/config.ru +0 -26
- data/example/auth/pages/app.rb +0 -61
- data/example/auth/template/base.html +0 -12
- data/example/chat/Gemfile +0 -9
- data/example/chat/asset/css/materialize.min.css +0 -13
- data/example/chat/asset/js/common.js +0 -200
- data/example/chat/asset/js/htmlgen.js +0 -79
- data/example/chat/columns/belong.yml +0 -6
- data/example/chat/columns/channel.yml +0 -3
- data/example/chat/columns/talk.yml +0 -6
- data/example/chat/columns/user.yml +0 -12
- data/example/chat/config/view_conf.yml +0 -3
- data/example/chat/pages/app.rb +0 -59
- data/example/chat/template/base.html +0 -12
- data/example/todo/Gemfile +0 -8
- data/example/todo/asset/css/datatable.css +0 -54
- data/example/todo/asset/css/materialize.min.css +0 -13
- data/example/todo/asset/js/common.js +0 -135
- data/example/todo/asset/js/datatable.js +0 -1814
- data/example/todo/asset/js/htmlgen.js +0 -79
- data/example/todo/asset/js/init.js +0 -3
- data/example/todo/asset/js/materialize.min.js +0 -6
- data/example/todo/asset/js/mydatatable.js +0 -9
- data/example/todo/asset/js/mymaterialize.js +0 -22
- data/example/todo/columns/todo.yml +0 -9
- data/example/todo/config/view_conf.yml +0 -3
- data/example/todo/config.ru +0 -15
- data/example/todo/pages/app.rb +0 -93
- data/example/todo/template/base.html +0 -12
- data/exe/myrackup +0 -5
- data/lib/ezframe/hthash.rb +0 -116
@@ -1,200 +0,0 @@
|
|
1
|
-
document.addEventListener('DOMContentLoaded', function () {
|
2
|
-
add_event(document)
|
3
|
-
//initialize_materialize_select()
|
4
|
-
var elems = document.querySelectorAll(".submit-button")
|
5
|
-
if (elems) {
|
6
|
-
for (var i = 0; i < elems.length; i++) {
|
7
|
-
elems[i].addEventListener('click', function () {
|
8
|
-
var node = this;
|
9
|
-
while (node && node.nodeName != "FORM") { node = node.parentNode }
|
10
|
-
node.submit();
|
11
|
-
})
|
12
|
-
}
|
13
|
-
}
|
14
|
-
})
|
15
|
-
|
16
|
-
function add_event(obj) {
|
17
|
-
var elems = obj.querySelectorAll('[event]')
|
18
|
-
if (elems) {
|
19
|
-
console.log("events=" + elems.length)
|
20
|
-
for (var i = 0; i < elems.length; i++) {
|
21
|
-
var elem = elems[i]
|
22
|
-
var event_s = elem.getAttribute("event")
|
23
|
-
var cmd = parse_event(event_s)
|
24
|
-
console.log(JSON.stringify(cmd))
|
25
|
-
elem.addEventListener(cmd.on, function(event) {
|
26
|
-
execute_command(event, this)
|
27
|
-
})
|
28
|
-
}
|
29
|
-
}
|
30
|
-
M.AutoInit();
|
31
|
-
initialize_materialize_tabs()
|
32
|
-
}
|
33
|
-
|
34
|
-
function parse_event(event) {
|
35
|
-
var res = {}
|
36
|
-
var a = event.split(":")
|
37
|
-
for (var i = 0; i < a.length; i++) {
|
38
|
-
if (a[i].indexOf("=") > 0) {
|
39
|
-
var b = a[i].split("=")
|
40
|
-
res[b[0]] = b[1]
|
41
|
-
}
|
42
|
-
}
|
43
|
-
//console.log("current url: " + res.url)
|
44
|
-
if (!res.url) {
|
45
|
-
res.url = location.pathname
|
46
|
-
//console.log("set url: " + res.url)
|
47
|
-
}
|
48
|
-
// console.log("parse_event: "+JSON.stringify(res))
|
49
|
-
return res
|
50
|
-
}
|
51
|
-
|
52
|
-
function access_server(path, send_values, func) {
|
53
|
-
console.log("access_server: " + path)
|
54
|
-
if (!path) {
|
55
|
-
path = location.pathname
|
56
|
-
}
|
57
|
-
var xhr = new XMLHttpRequest();
|
58
|
-
xhr.onreadystatechange = function () {
|
59
|
-
if (this.readyState == 4 && this.status == 200) {
|
60
|
-
var res = this.response;
|
61
|
-
console.log("access_server: res="+JSON.stringify(res))
|
62
|
-
func(res)
|
63
|
-
}
|
64
|
-
}
|
65
|
-
xhr.open("POST", path, true);
|
66
|
-
xhr.setRequestHeader("Content-Type", "application/json");
|
67
|
-
xhr.responseType = 'json';
|
68
|
-
xhr.send(JSON.stringify(send_values));
|
69
|
-
}
|
70
|
-
|
71
|
-
function execute_command(event, obj) {
|
72
|
-
var cmd = parse_event(obj.getAttribute("event"))
|
73
|
-
console.log("execute_command: event=" + JSON.stringify(event) +
|
74
|
-
", cmd=" + JSON.stringify(cmd))
|
75
|
-
//console.dir(obj)
|
76
|
-
switch (cmd.cmd) {
|
77
|
-
case "open":
|
78
|
-
case "inject":
|
79
|
-
inject(cmd, obj)
|
80
|
-
break
|
81
|
-
case "update_value":
|
82
|
-
console.log("update_value")
|
83
|
-
update_value(cmd, obj)
|
84
|
-
break
|
85
|
-
case "reset_value":
|
86
|
-
reset_value(cmd)
|
87
|
-
break
|
88
|
-
default:
|
89
|
-
console.log("unknown command: " + command)
|
90
|
-
}
|
91
|
-
}
|
92
|
-
|
93
|
-
function inject(cmd, obj) {
|
94
|
-
var url = cmd.url // obj.getAttribute("url")
|
95
|
-
console.log("inject: url=" + url)
|
96
|
-
if (cmd.get_form) {
|
97
|
-
var node = obj
|
98
|
-
// console.dir(node)
|
99
|
-
while(node && node.nodeName !='FORM') {
|
100
|
-
node = node.parentNode
|
101
|
-
// console.log(node.nodeName)
|
102
|
-
}
|
103
|
-
form = collect_form_values(node)
|
104
|
-
cmd.form = form
|
105
|
-
}
|
106
|
-
access_server(url, cmd, function (res) {
|
107
|
-
switch(cmd.cmd) {
|
108
|
-
case "inject":
|
109
|
-
var selector = cmd.into
|
110
|
-
console.log("inject: into=" + selector)
|
111
|
-
var elem = document.querySelector(selector)
|
112
|
-
if (elem) {
|
113
|
-
elem.innerHTML = htmlgen(res)
|
114
|
-
add_event(elem)
|
115
|
-
} else {
|
116
|
-
console.log("no such element: " + selector)
|
117
|
-
}
|
118
|
-
break
|
119
|
-
case "open":
|
120
|
-
console.log("open: "+JSON.stringify(cmd))
|
121
|
-
location.href = cmd.goto
|
122
|
-
}
|
123
|
-
})
|
124
|
-
}
|
125
|
-
|
126
|
-
function initialize_materialize_tabs() {
|
127
|
-
elems = document.querySelectorAll('.tabs');
|
128
|
-
if (elems) {
|
129
|
-
for (var i = 0; i < elems.length; i++) {
|
130
|
-
M.Tabs.init(elems[i], { onShow: show_tab_contents })
|
131
|
-
}
|
132
|
-
}
|
133
|
-
}
|
134
|
-
|
135
|
-
function show_tab_contents(obj) {
|
136
|
-
console.log("show_tab_contents: " + JSON.stringify(obj.getAttribute("event")))
|
137
|
-
var event = parse_event(obj.getAttribute("event"))
|
138
|
-
//console.dir(obj)
|
139
|
-
var id = obj.id
|
140
|
-
url ="/admin/"+id
|
141
|
-
access_server(event.url, event, function(res) {
|
142
|
-
var elem = document.querySelector("#"+id);
|
143
|
-
elem.innerHTML = htmlgen(res)
|
144
|
-
add_event(elem)
|
145
|
-
})
|
146
|
-
}
|
147
|
-
|
148
|
-
function update_value(cmd, obj) {
|
149
|
-
var url = cmd.url
|
150
|
-
var input = obj.parentNode.querySelector("select")
|
151
|
-
if (!input) {
|
152
|
-
input = obj.parentNode.querySelector("input")
|
153
|
-
}
|
154
|
-
if (!input) {
|
155
|
-
console.log("no input element")
|
156
|
-
}
|
157
|
-
//console.log("update_value: url="+url+", input.value")
|
158
|
-
//console.dir(input)
|
159
|
-
cmd.update_value = input.value
|
160
|
-
access_server(url, cmd, function(res) {
|
161
|
-
var selector = cmd.into
|
162
|
-
var elem = document.querySelector(selector)
|
163
|
-
if (elem) {
|
164
|
-
elem.innerHTML = htmlgen(res)
|
165
|
-
add_event(elem)
|
166
|
-
} else {
|
167
|
-
console.log("no such element: " + selector)
|
168
|
-
}
|
169
|
-
})
|
170
|
-
}
|
171
|
-
|
172
|
-
function reset_value(cmd, obj) {
|
173
|
-
access_server(cmd.url, cmd, function(res) {
|
174
|
-
var elem = document.querySelector(cmd.into)
|
175
|
-
if (elem) {
|
176
|
-
elem.innerHTML = htmlgen(res)
|
177
|
-
add_event(elem)
|
178
|
-
} else {
|
179
|
-
console.log("no such element: " + selector)
|
180
|
-
}
|
181
|
-
})
|
182
|
-
}
|
183
|
-
|
184
|
-
function collect_form_values(obj) {
|
185
|
-
// console.log("collect_form_values")
|
186
|
-
var res = {};
|
187
|
-
var inputs = obj.querySelectorAll("input");
|
188
|
-
for (var i = 0; i < inputs.length; i++) {
|
189
|
-
var elem = inputs[i]
|
190
|
-
// console.dir(elem)
|
191
|
-
res[elem.name] = elem.value
|
192
|
-
}
|
193
|
-
var selects = obj.querySelectorAll("select");
|
194
|
-
for (var i = 0; i < selects.length; i++) {
|
195
|
-
var elem = selects[i]
|
196
|
-
// console.dir(elem)
|
197
|
-
res[elem.name] = elem.value
|
198
|
-
}
|
199
|
-
return res
|
200
|
-
}
|
@@ -1,79 +0,0 @@
|
|
1
|
-
function join_attr(elem) {
|
2
|
-
var attr_s = ""
|
3
|
-
for (var i = 0; i < Object.keys(elem).length; i++) {
|
4
|
-
var key = Object.keys(elem)[i];
|
5
|
-
switch (key) {
|
6
|
-
case 'child':
|
7
|
-
case 'tag':
|
8
|
-
case 'final':
|
9
|
-
break;
|
10
|
-
default:
|
11
|
-
var value = elem[key];
|
12
|
-
if (Array.isArray(value)) {
|
13
|
-
attr_s += key + "=\"" + value.join(" ") + "\" ";
|
14
|
-
} else {
|
15
|
-
attr_s += key + "=\"" + value + "\" ";
|
16
|
-
}
|
17
|
-
}
|
18
|
-
}
|
19
|
-
var child = elem.child;
|
20
|
-
if (child) {
|
21
|
-
child = _htmlgen(child);
|
22
|
-
return "<" + elem.tag + " " + attr_s + ">" + child + "</" + elem.tag + ">";
|
23
|
-
} else {
|
24
|
-
return "<" + elem.tag + " " + attr_s + "/>";
|
25
|
-
}
|
26
|
-
}
|
27
|
-
|
28
|
-
function select_element(elem) {
|
29
|
-
console.log("select_element")
|
30
|
-
// console.dir(elem.items)
|
31
|
-
outstr = ""
|
32
|
-
var items = elem.items
|
33
|
-
if (Array.isArray(items)) {
|
34
|
-
for (var i = 0; i < items.length; i++) {
|
35
|
-
var a = items[i]
|
36
|
-
outstr += "<option value=\"" + a[0] + "\">" + a[1] + "</option>"
|
37
|
-
}
|
38
|
-
} else {
|
39
|
-
keys = Object.keys(items)
|
40
|
-
for (var i = 0; i < keys.length; i++) {
|
41
|
-
var k = keys[i]
|
42
|
-
var v = items[k]
|
43
|
-
var selected = ""
|
44
|
-
console.log("elem.value="+elem.value)
|
45
|
-
if (elem.value && k == elem.value) {
|
46
|
-
selected=" selected=selected "
|
47
|
-
}
|
48
|
-
outstr += "<option value=\"" + k + "\" "+selected+">" + v + "</option>"
|
49
|
-
}
|
50
|
-
}
|
51
|
-
//console.log(outstr)
|
52
|
-
delete elem.items
|
53
|
-
if (!elem.name) {
|
54
|
-
elem.name = elem.key
|
55
|
-
}
|
56
|
-
elem.child = outstr
|
57
|
-
}
|
58
|
-
|
59
|
-
function _htmlgen(elem) {
|
60
|
-
if (Array.isArray(elem)) {
|
61
|
-
var outstr = "";
|
62
|
-
for (var i = 0; i < elem.length; i++) {
|
63
|
-
outstr += _htmlgen(elem[i]);
|
64
|
-
}
|
65
|
-
return outstr;
|
66
|
-
} else if ((typeof elem === 'string') || (typeof elem === 'integer')) {
|
67
|
-
return elem;
|
68
|
-
} else {
|
69
|
-
if (elem.tag == "select") {
|
70
|
-
select_element(elem)
|
71
|
-
}
|
72
|
-
return join_attr(elem)
|
73
|
-
}
|
74
|
-
}
|
75
|
-
|
76
|
-
function htmlgen(elem) {
|
77
|
-
var res = _htmlgen(elem)
|
78
|
-
return res
|
79
|
-
}
|
data/example/auth/config.ru
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "logger"
|
4
|
-
require "rack"
|
5
|
-
require "warden"
|
6
|
-
require "digest/sha2"
|
7
|
-
|
8
|
-
puts "digest: "+Digest::SHA256.hexdigest("1234")
|
9
|
-
|
10
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "lib"))
|
11
|
-
require "ezframe"
|
12
|
-
|
13
|
-
failure_app = Proc.new do |env|
|
14
|
-
["401", { "Content-Type" => "text/html" }, [ Ezframe::App.new.public_login_page ]]
|
15
|
-
end
|
16
|
-
|
17
|
-
use Warden::Manager do |manager|
|
18
|
-
manager.default_strategies :mystrategy
|
19
|
-
manager.failure_app = failure_app
|
20
|
-
end
|
21
|
-
|
22
|
-
use Rack::Session::Pool, secret: Digest::SHA256.hexdigest(rand.to_s)
|
23
|
-
use Rack::Static, urls: ["/image", "/js", "/css"], root: "asset"
|
24
|
-
use Rack::ShowExceptions
|
25
|
-
|
26
|
-
run Ezframe::Server
|
data/example/auth/pages/app.rb
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Ezframe
|
4
|
-
class App < PageBase
|
5
|
-
def initialize(request=nil, model=nil)
|
6
|
-
super(request, model)
|
7
|
-
if @request
|
8
|
-
mylog "request=#{@request.inspect}"
|
9
|
-
end
|
10
|
-
if @model
|
11
|
-
@column_set = @model.column_sets[:user]
|
12
|
-
@dataset = @column_set.dataset
|
13
|
-
end
|
14
|
-
@auth = true
|
15
|
-
end
|
16
|
-
|
17
|
-
def public_index_page
|
18
|
-
hthash = { tag: "ul", child: [
|
19
|
-
{ tag: "li", child: { tag: "a", href: "/app/test1", child: "app1"}},
|
20
|
-
{ tag: "li", child: { tag: "a", href: "/app/test2", child: "app2"}},
|
21
|
-
] }
|
22
|
-
common_page(title: "App Top", body: Html.convert(Materialize.convert(hthash)))
|
23
|
-
end
|
24
|
-
|
25
|
-
def public_test1_page
|
26
|
-
common_page(title: "Secret Page", body: Html.convert(Materialize.convert({ tag: "h1", child: "test1"})))
|
27
|
-
end
|
28
|
-
|
29
|
-
def public_test2_page
|
30
|
-
common_page(title: "Secret Page", body: Html.convert(Materialize.convert({ tag: "h1", child: "test2"})))
|
31
|
-
end
|
32
|
-
|
33
|
-
def public_default_page
|
34
|
-
mylog "login?: #{login?}"
|
35
|
-
if login?
|
36
|
-
public_index_page
|
37
|
-
else
|
38
|
-
public_login_page
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def public_login_page
|
43
|
-
flash_area=""
|
44
|
-
flash_area={ tag: "div", class: %w[teal], child: flash[:auth_msg]}
|
45
|
-
form = { tag: "div", class: %w[container], child:
|
46
|
-
{ tag: "form", action: "/app/login", method: "post", child: [
|
47
|
-
{ tag: "input", type: "text", name: "account", label: "User ID"},
|
48
|
-
{ tag: "input", type: "password", name: "password", label: "Password"},
|
49
|
-
{ tag: "button", type: "submit", class: %w[btn], child: "login"}
|
50
|
-
]}
|
51
|
-
}
|
52
|
-
common_page(title: "Login", body: Html.convert(Materialize.convert(flash_area+form)))
|
53
|
-
end
|
54
|
-
|
55
|
-
def public_login_post
|
56
|
-
mylog "public_login_post: #{@params.inspect}, #{@json}"
|
57
|
-
warden.authenticate
|
58
|
-
public_index_page
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|