ezframe 0.0.1 → 0.0.3

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.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/README.md +11 -4
  4. data/app_template/asset/image/favicon.ico +0 -0
  5. data/app_template/asset/js/ezframe.js +288 -0
  6. data/app_template/config/generic.yml +3 -0
  7. data/app_template/config/materialize.yml +5 -0
  8. data/{example/chat → app_template}/config.ru +2 -10
  9. data/app_template/pages/basic.rb +5 -0
  10. data/exe/create_table.rb +1 -0
  11. data/exe/setup.rb +15 -0
  12. data/ezframe.gemspec +3 -4
  13. data/lib/ezframe/auth.rb +15 -12
  14. data/lib/ezframe/column_set.rb +68 -28
  15. data/lib/ezframe/column_type.rb +231 -68
  16. data/lib/ezframe/config.rb +4 -0
  17. data/lib/ezframe/controller.rb +20 -10
  18. data/lib/ezframe/database.rb +10 -3
  19. data/lib/ezframe/ht.rb +167 -0
  20. data/lib/ezframe/html.rb +28 -4
  21. data/lib/ezframe/japanese_utils.rb +40 -0
  22. data/lib/ezframe/{pages.rb → loader.rb} +3 -0
  23. data/lib/ezframe/materialize.rb +55 -20
  24. data/lib/ezframe/model.rb +0 -2
  25. data/lib/ezframe/page_base.rb +18 -12
  26. data/lib/ezframe/page_kit.rb +12 -33
  27. data/lib/ezframe/template.rb +20 -15
  28. data/lib/ezframe/util.rb +5 -0
  29. data/lib/ezframe/version.rb +1 -1
  30. data/lib/ezframe.rb +5 -4
  31. metadata +27 -70
  32. data/example/auth/Gemfile +0 -8
  33. data/example/auth/asset/css/materialize.min.css +0 -13
  34. data/example/auth/asset/js/common.js +0 -200
  35. data/example/auth/asset/js/htmlgen.js +0 -79
  36. data/example/auth/columns/user.yml +0 -12
  37. data/example/auth/config/view_conf.yml +0 -3
  38. data/example/auth/config.ru +0 -26
  39. data/example/auth/pages/app.rb +0 -61
  40. data/example/auth/template/base.html +0 -12
  41. data/example/chat/Gemfile +0 -9
  42. data/example/chat/asset/css/materialize.min.css +0 -13
  43. data/example/chat/asset/js/common.js +0 -200
  44. data/example/chat/asset/js/htmlgen.js +0 -79
  45. data/example/chat/columns/belong.yml +0 -6
  46. data/example/chat/columns/channel.yml +0 -3
  47. data/example/chat/columns/talk.yml +0 -6
  48. data/example/chat/columns/user.yml +0 -12
  49. data/example/chat/config/view_conf.yml +0 -3
  50. data/example/chat/pages/app.rb +0 -59
  51. data/example/chat/template/base.html +0 -12
  52. data/example/todo/Gemfile +0 -8
  53. data/example/todo/asset/css/datatable.css +0 -54
  54. data/example/todo/asset/css/materialize.min.css +0 -13
  55. data/example/todo/asset/js/common.js +0 -135
  56. data/example/todo/asset/js/datatable.js +0 -1814
  57. data/example/todo/asset/js/htmlgen.js +0 -79
  58. data/example/todo/asset/js/init.js +0 -3
  59. data/example/todo/asset/js/materialize.min.js +0 -6
  60. data/example/todo/asset/js/mydatatable.js +0 -9
  61. data/example/todo/asset/js/mymaterialize.js +0 -22
  62. data/example/todo/columns/todo.yml +0 -9
  63. data/example/todo/config/view_conf.yml +0 -3
  64. data/example/todo/config.ru +0 -15
  65. data/example/todo/pages/app.rb +0 -93
  66. data/example/todo/template/base.html +0 -12
  67. data/exe/myrackup +0 -5
  68. 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
- }
@@ -1,12 +0,0 @@
1
- - key: account
2
- type: string
3
- label: ユーザーID
4
- - key: name
5
- type: jpname
6
- label: 氏名
7
- - key: email
8
- type: email
9
- label: Eメール
10
- - key: password
11
- type: password
12
- label: パスワード
@@ -1,3 +0,0 @@
1
- default_page_class: App
2
- default_page_method: index
3
- template_file: base.html
@@ -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
@@ -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
@@ -1,12 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang=ja>
3
- <head>
4
- <meta charset="utf8" />
5
- <title>#{title}</title>
6
- #{into_html_header}
7
- </head>
8
- <body>
9
- #{body}
10
- #{into_bottom_of_body}
11
- </body>
12
- </html>
data/example/chat/Gemfile DELETED
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source "https://rubygems.org"
4
-
5
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
6
-
7
- gem 'ezframe', path: "../.."
8
- gem 'warden'
9
- gem 'rack-flash3'