ezframe 0.0.4 → 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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -0
  3. data/README.md +1 -1
  4. data/asset/css/materialize.min.css +13 -0
  5. data/asset/css/style.css +3 -0
  6. data/asset/html/index.html +1 -0
  7. data/{app_template/asset/image/favicon.ico → asset/image/c_e.ico} +0 -0
  8. data/asset/js/ezframe.js +387 -0
  9. data/exe/check_column_yml +64 -0
  10. data/exe/console +2 -2
  11. data/exe/{create_table.rb → create_table} +7 -4
  12. data/exe/dbmigrate +174 -0
  13. data/exe/html2ruby +61 -0
  14. data/ezframe.gemspec +10 -8
  15. data/lib/ezframe.rb +9 -3
  16. data/lib/ezframe/auth.rb +50 -31
  17. data/lib/ezframe/column_set.rb +314 -103
  18. data/lib/ezframe/column_type.rb +456 -99
  19. data/lib/ezframe/config.rb +27 -6
  20. data/lib/ezframe/controller.rb +41 -38
  21. data/lib/ezframe/database.rb +171 -52
  22. data/lib/ezframe/editor_common.rb +74 -0
  23. data/lib/ezframe/email.rb +34 -0
  24. data/lib/ezframe/ezlog.rb +40 -0
  25. data/lib/ezframe/ht.rb +42 -17
  26. data/lib/ezframe/html.rb +47 -31
  27. data/lib/ezframe/japanese_utils.rb +15 -0
  28. data/lib/ezframe/jquery-ui.rb +29 -0
  29. data/lib/ezframe/loader.rb +4 -4
  30. data/lib/ezframe/main_editor.rb +19 -0
  31. data/lib/ezframe/main_page_kit.rb +226 -0
  32. data/lib/ezframe/materialize.rb +10 -14
  33. data/lib/ezframe/message.rb +46 -0
  34. data/lib/ezframe/page_base.rb +59 -71
  35. data/lib/ezframe/route.rb +126 -0
  36. data/lib/ezframe/server.rb +16 -5
  37. data/lib/ezframe/single_page_editor.rb +22 -0
  38. data/lib/ezframe/single_page_kit.rb +199 -0
  39. data/lib/ezframe/sub_editor.rb +25 -0
  40. data/lib/ezframe/sub_page_kit.rb +213 -0
  41. data/lib/ezframe/template.rb +5 -4
  42. data/lib/ezframe/util.rb +45 -23
  43. data/lib/ezframe/version.rb +1 -1
  44. metadata +74 -34
  45. data/.rubocop.yml +0 -44
  46. data/app_template/asset/js/ezframe.js +0 -288
  47. data/app_template/config.ru +0 -10
  48. data/app_template/config/generic.yml +0 -3
  49. data/app_template/config/materialize.yml +0 -5
  50. data/app_template/pages/basic.rb +0 -5
  51. data/exe/setup.rb +0 -15
  52. data/lib/ezframe/editor.rb +0 -188
  53. data/lib/ezframe/model.rb +0 -52
  54. data/lib/ezframe/page_kit.rb +0 -63
@@ -1,6 +1,10 @@
1
- class Util
2
- def self.add_comma(value)
3
- value.to_s.reverse.gsub(/(\d{3})/) { "#{$1}," }.reverse
1
+ class Integer
2
+ def to_sym
3
+ return self.to_s.to_sym
4
+ end
5
+
6
+ def add_comma
7
+ return self.to_s.reverse.gsub(/(\d{3})(\d)/) { "#{$1},#{$2}" }.reverse
4
8
  end
5
9
  end
6
10
 
@@ -16,10 +20,14 @@ end
16
20
 
17
21
  # https://github.com/cliftonsluss/recursively_symbolize_keys/blob/master/recursively_symbolize_keys.rb
18
22
  class Hash
19
- def recursively_symbolize_keys
20
- h = Hash.new
23
+ # def [](key)
24
+ # return (fetch key, nil) || (fetch key.to_s, nil) || (fetch key.to_s.to_sym, nil)
25
+ # end.recursively_symbolize_keys
26
+
27
+ def symbolize_keys
28
+ h = {}
21
29
  self.each do |k, v|
22
- if v.class == Hash
30
+ if v.is_a?(Hash)
23
31
  h[k.to_s.to_sym] = v.recursively_symbolize_keys
24
32
  else
25
33
  h[k.to_s.to_sym] = v
@@ -30,6 +38,10 @@ class Hash
30
38
 
31
39
  def add_class(klass)
32
40
  return unless klass
41
+ if klass.is_a?(Array)
42
+ klass.each {|k| add_class(k) }
43
+ return
44
+ end
33
45
  c = self[:class]
34
46
  if !c
35
47
  self[:class] = c = []
@@ -37,12 +49,8 @@ class Hash
37
49
  a = [ c ]
38
50
  self[:class] = c = a
39
51
  end
40
- if klass.is_a?(Array)
41
- klass.each {|k| add_class(k) }
42
- else
43
- return if c.include?(klass)
44
- c.push(klass)
45
- end
52
+ return if c.include?(klass)
53
+ c.push(klass)
46
54
  end
47
55
 
48
56
  def remove_class(klass)
@@ -58,10 +66,10 @@ class Hash
58
66
  end
59
67
 
60
68
  class Array
61
- def recursively_symbolize_keys
69
+ def symbolize_keys
62
70
  self.collect do |v|
63
71
  if v.kind_of?(Hash) || v.kind_of?(Array)
64
- v.recursively_symbolize_keys
72
+ v.symbolize_keys
65
73
  else
66
74
  v
67
75
  end
@@ -75,17 +83,31 @@ class Object
75
83
  end
76
84
  end
77
85
 
78
- def multi_div(class_a, child)
79
- class_a.reverse.each do |klass|
80
- child = { tag: "div", class: klass, child: child }
86
+ class Time
87
+ def to_date_key
88
+ return "%d-%02d-%02d"%[ self.year, self.mon, self.mday ]
81
89
  end
82
- return child
83
- end
84
-
85
-
86
90
 
91
+ def wday_jp
92
+ return %w[日 月 火 水 木 金 土 日][self.wday]
93
+ end
94
+ end
87
95
 
96
+ # クラス名をsnake caseにする。
97
+ def class_to_snake(class_name)
98
+ return nil unless class_name
99
+ class_name = class_name.to_s
100
+ if class_name.index("::")
101
+ return class_name.split("::")[-1].to_snake.to_sym
102
+ else
103
+ return class_name.to_snake.to_sym
104
+ end
105
+ end
88
106
 
89
- def mylog(msg)
90
- File.open("log/mylog.log", "a"){|f| f.puts "#{Time.now}:[#{$$}]:#{msg}" }
107
+ # URLのオプションを解析
108
+ def parse_query_string(str)
109
+ query_a = URI::decode_www_form(str)
110
+ res_h = {}
111
+ query_a.map { |a| res_h[a[0].to_sym] = a[1] }
112
+ return res_h
91
113
  end
@@ -1,3 +1,3 @@
1
1
  module Ezframe
2
- VERSION = "0.0.4"
2
+ VERSION = "0.4.0"
3
3
  end
metadata CHANGED
@@ -1,150 +1,181 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ezframe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - KAMACHI Masayuki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-24 00:00:00.000000000 Z
11
+ date: 2020-06-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.16'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.16'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: 5.13.0
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: 5.13.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: nokogiri
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: 1.10.7
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: 1.10.7
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rack-test
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: 1.1.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: 1.1.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 0.12.2
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 0.12.2
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rake
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - "~>"
87
+ - - ">="
74
88
  - !ruby/object:Gem::Version
75
89
  version: '13.0'
76
90
  type: :runtime
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - "~>"
94
+ - - ">="
81
95
  - !ruby/object:Gem::Version
82
96
  version: '13.0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: rack
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - "~>"
101
+ - - ">="
88
102
  - !ruby/object:Gem::Version
89
- version: 2.0.7
103
+ version: 2.0.6
90
104
  type: :runtime
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - "~>"
108
+ - - ">="
95
109
  - !ruby/object:Gem::Version
96
- version: 2.0.7
110
+ version: 2.0.6
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: sequel
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - "~>"
115
+ - - ">="
102
116
  - !ruby/object:Gem::Version
103
117
  version: 5.27.0
104
118
  type: :runtime
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - "~>"
122
+ - - ">="
109
123
  - !ruby/object:Gem::Version
110
124
  version: 5.27.0
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: sqlite3
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
- - - "~>"
129
+ - - ">="
116
130
  - !ruby/object:Gem::Version
117
131
  version: 1.4.0
118
132
  type: :runtime
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
- - - "~>"
136
+ - - ">="
123
137
  - !ruby/object:Gem::Version
124
138
  version: 1.4.0
139
+ - !ruby/object:Gem::Dependency
140
+ name: bcrypt
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 3.1.13
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: 3.1.13
125
153
  description: easy web framework
126
154
  email:
127
155
  - kamachi@sakuraforest.co.jp
128
156
  executables:
157
+ - check_column_yml
129
158
  - console
130
- - create_table.rb
131
- - setup.rb
159
+ - create_table
160
+ - dbmigrate
161
+ - html2ruby
132
162
  extensions: []
133
163
  extra_rdoc_files: []
134
164
  files:
135
165
  - ".gitignore"
136
- - ".rubocop.yml"
166
+ - Gemfile
137
167
  - README.md
138
168
  - Rakefile
139
- - app_template/asset/image/favicon.ico
140
- - app_template/asset/js/ezframe.js
141
- - app_template/config.ru
142
- - app_template/config/generic.yml
143
- - app_template/config/materialize.yml
144
- - app_template/pages/basic.rb
169
+ - asset/css/materialize.min.css
170
+ - asset/css/style.css
171
+ - asset/html/index.html
172
+ - asset/image/c_e.ico
173
+ - asset/js/ezframe.js
174
+ - exe/check_column_yml
145
175
  - exe/console
146
- - exe/create_table.rb
147
- - exe/setup.rb
176
+ - exe/create_table
177
+ - exe/dbmigrate
178
+ - exe/html2ruby
148
179
  - ezframe.gemspec
149
180
  - lib/ezframe.rb
150
181
  - lib/ezframe/auth.rb
@@ -153,16 +184,25 @@ files:
153
184
  - lib/ezframe/config.rb
154
185
  - lib/ezframe/controller.rb
155
186
  - lib/ezframe/database.rb
156
- - lib/ezframe/editor.rb
187
+ - lib/ezframe/editor_common.rb
188
+ - lib/ezframe/email.rb
189
+ - lib/ezframe/ezlog.rb
157
190
  - lib/ezframe/ht.rb
158
191
  - lib/ezframe/html.rb
159
192
  - lib/ezframe/japanese_utils.rb
193
+ - lib/ezframe/jquery-ui.rb
160
194
  - lib/ezframe/loader.rb
195
+ - lib/ezframe/main_editor.rb
196
+ - lib/ezframe/main_page_kit.rb
161
197
  - lib/ezframe/materialize.rb
162
- - lib/ezframe/model.rb
198
+ - lib/ezframe/message.rb
163
199
  - lib/ezframe/page_base.rb
164
- - lib/ezframe/page_kit.rb
200
+ - lib/ezframe/route.rb
165
201
  - lib/ezframe/server.rb
202
+ - lib/ezframe/single_page_editor.rb
203
+ - lib/ezframe/single_page_kit.rb
204
+ - lib/ezframe/sub_editor.rb
205
+ - lib/ezframe/sub_page_kit.rb
166
206
  - lib/ezframe/template.rb
167
207
  - lib/ezframe/util.rb
168
208
  - lib/ezframe/version.rb
@@ -1,44 +0,0 @@
1
- AllCops:
2
- TargetRubyVersion: 2.6
3
- DisabledByDefault: true
4
- Exclude:
5
- - '**/vendor/**/*'
6
-
7
- Style/FrozenStringLiteralComment:
8
- Enabled: true
9
- EnforcedStyle: always
10
-
11
- # Use Ruby >= 1.9 syntax for hashes. Prefer { a: :b } over { :a => :b }.
12
- Style/HashSyntax:
13
- Enabled: true
14
-
15
- Layout/EmptyLineAfterMagicComment:
16
- Enabled: true
17
-
18
- Layout/LeadingCommentSpace:
19
- Enabled: true
20
-
21
- Layout/SpaceAfterColon:
22
- Enabled: true
23
-
24
- Layout/SpaceAfterComma:
25
- Enabled: true
26
-
27
- Layout/SpaceAroundEqualsInParameterDefault:
28
- Enabled: true
29
-
30
- Layout/SpaceAroundKeyword:
31
- Enabled: true
32
-
33
- Layout/SpaceAroundOperators:
34
- Enabled: true
35
-
36
- Layout/SpaceBeforeComma:
37
- Enabled: true
38
-
39
- Layout/SpaceBeforeFirstArg:
40
- Enabled: true
41
-
42
- # Use `{ a: 1 }` not `{a:1}`.
43
- Layout/SpaceInsideHashLiteralBraces:
44
- Enabled: true
@@ -1,288 +0,0 @@
1
- function add_event(obj) {
2
- var elems = obj.querySelectorAll('[event]')
3
- if (elems) {
4
- console.log("events=" + elems.length)
5
- for (var i = 0; i < elems.length; i++) {
6
- var elem = elems[i]
7
- var event_s = elem.getAttribute("event")
8
- // console.log(event_s)
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)
13
- elem.event_done = 1
14
- } else {
15
- elem.addEventListener(event.on, function () {
16
- execute_event(this)
17
- })
18
- }
19
- }
20
- }
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
- }
27
-
28
- function parse_event(event) {
29
- var ev = {}
30
- var a = event.split(":")
31
- for (var i = 0; i < a.length; i++) {
32
- if (a[i].indexOf("=") > 0) {
33
- var b = a[i].split("=")
34
- var key = b[0]
35
- var value = b[1]
36
- if (value.indexOf(",") > 0) {
37
- value = value.split(",")
38
- }
39
- var cur_value = ev[key]
40
- if (cur_value) {
41
- if (Array.isArray(cur_value)) {
42
- cur_value.push(value)
43
- } else {
44
- ev[key] = [ev[key], value]
45
- }
46
- } else {
47
- ev[key] = value
48
- }
49
- }
50
- }
51
- /*if (!ev.url) {
52
- ev.url = location.pathname
53
- }*/
54
- return ev
55
- }
56
-
57
- function execute_event(obj) {
58
- console.log("execute_event")
59
- // console.dir(obj)
60
- var event_s = obj.getAttribute("event")
61
- var event = parse_event(event_s)
62
- switch(event.branch) {
63
- case "switch":
64
- var a = event.between
65
- for(var i = 0; i < a.length; i++) {
66
- switch_hide(a[i])
67
- }
68
- return
69
- case "set_global":
70
- if (!window.ezframe) { window.ezframe = {} }
71
- for(key in event) {
72
- if ([ "branch", "on", "url" ].indexOf(key) >= 0) { continue }
73
- window.ezframe[key] = event[key]
74
- }
75
- // console.log("set_global:" + JSON.stringify(window.ezframe))
76
- return
77
- case "redirect":
78
- console.log("redirect:" + event.url)
79
- location.href = event.url
80
- return
81
- }
82
- with_attr(event, obj)
83
- post_values(event, obj)
84
- }
85
-
86
- function with_attr(event, obj) {
87
- if (!event.with) {
88
- return null
89
- }
90
- var with_s = event.with
91
- switch(event.with) {
92
- case "form":
93
- var node = obj
94
- while (node && node.nodeName != 'FORM') {
95
- node = node.parentNode
96
- }
97
- form = collect_form_values(node)
98
- event.form = form
99
- break;
100
- case "input":
101
- event.form = {}
102
- event.form[obj.name] = obj.value
103
- break;
104
- }
105
- }
106
-
107
- function post_values(event, obj) {
108
- var xhr = new XMLHttpRequest()
109
- xhr.onreadystatechange = function () {
110
- if (this.readyState == 4 && this.status == 200) {
111
- var res = this.response
112
- manage_response(res, event, obj)
113
- }
114
- }
115
- if (!event.url) {
116
- event.url = "/default"
117
- }
118
- console.log("post_values: url="+event.url+",event="+JSON.stringify(event))
119
- xhr.open("POST", event.url, true)
120
- xhr.setRequestHeader("Content-Type", "application/json")
121
- xhr.responseType = 'json'
122
- send_values = { event: event }
123
- if (window.ezframe) {
124
- send_values.global = window.ezframe
125
- }
126
- xhr.send(JSON.stringify(send_values))
127
- }
128
-
129
- function manage_response(res, event, obj) {
130
- var elem
131
- /* console.log("manage_response: res="+JSON.stringify(res)+", event=" + JSON.stringify(event) +
132
- ", obj=" + JSON.stringify(obj))
133
- */
134
- if (!res) { return }
135
- if (Array.isArray(res)) {
136
- for(var i = 0; i < res.length; i++) {
137
- exec_one_response(res[i])
138
- }
139
- } else {
140
- exec_one_response(res)
141
- }
142
- }
143
-
144
- function exec_one_response(res) {
145
- if (res.inject) {
146
- console.log("inject: " + res.inject)
147
- elem = document.querySelector(res.inject)
148
- if (elem) {
149
- if (res.is_html) {
150
- elem.innerHTML = res.body
151
- } else {
152
- elem.innerHTML = htmlgen(res.body)
153
- }
154
- add_event(elem)
155
- } else {
156
- console.log("inject: no such element: "+res.inject)
157
- }
158
- }
159
- if (res.set_value) {
160
- console.log("set_value: "+res.set_value+", value=", res.value)
161
- elem = document.querySelector(res.set_value)
162
- if (elem) {
163
- if (res.set_value.indexOf("select") > 0) {
164
- elem.selectedIndex = res.value
165
- } else {
166
- elem.value = res.value
167
- }
168
- } else {
169
- console.log("set_value: no such element: "+res.set_value)
170
- }
171
- }
172
- if (res.redirect) {
173
- console.log("redirect:" + res.redirect)
174
- location.href = res.redirect
175
- return
176
- }
177
- if (res.scroll) {
178
- scroll_to(res.scroll)
179
- }
180
- if (res.reset) {
181
- elem = document.querySelector(res.reset)
182
- if (event.reset == "form") {
183
- while (node && node.nodeName != 'FORM') {
184
- node = node.parentNode
185
- }
186
- node.reset();
187
- }
188
- }
189
- }
190
-
191
- function collect_form_values(obj) {
192
- var res = {};
193
- var inputs = Array.from(obj.querySelectorAll("input"));
194
- var selects = Array.from(obj.querySelectorAll("select"));
195
- var textareas = Array.from(obj.querySelectorAll("textarea"));
196
- // console.dir(inputs)
197
- inputs = inputs.concat(selects)
198
- inputs = inputs.concat(textareas)
199
- for (var i = 0; i < inputs.length; i++) {
200
- var elem = inputs[i]
201
- if (!elem.name) { continue }
202
- console.log("name,value="+elem.name+","+elem.value)
203
- if ((elem.type == "checkbox" || elem.type == "radio") && !elem.checked) {
204
- continue
205
- }
206
- var cur_value = res[elem.name]
207
- var elem_value = normalize(elem.value)
208
- if (cur_value) {
209
- if (Array.isArray(cur_value)) {
210
- cur_value.push(elem_value)
211
- } else {
212
- res[elem.name] = [ cur_value, elem_value ]
213
- }
214
- } else {
215
- res[elem.name] = elem_value
216
- }
217
- }
218
- return res
219
- }
220
-
221
- function normalize(str) {
222
- return str.replace(/^[\s| ]+|[\s| ]+$/g, '').trim()
223
- }
224
-
225
- function switch_hide(button) {
226
- // console.log("switch_hide")
227
- var node = button
228
- while (node && !node.classList.contains('switch-box')) {
229
- node = node.parentNode
230
- }
231
- var switch_box = node
232
-
233
- var elems = switch_box.querySelectorAll(".switch-element")
234
- for(var i = 0; i < elems.length; i++) {
235
- var elem = elems[i]
236
- var list = elem.classList
237
- if (list.contains("hide")) {
238
- elem.classList.remove("hide")
239
- } else {
240
- elem.classList.add("hide")
241
- }
242
- }
243
- }
244
-
245
- function register_switch_event(elem) {
246
- var boxes = elem.querySelectorAll(".switch-box")
247
- for(var i = 0; i < boxes.length; i++) {
248
- var box = boxes[i]
249
- var buttons = box.querySelectorAll(".switch-button")
250
- for(var j = 0; j < buttons.length; j++) {
251
- var button = buttons[j]
252
- button.addEventListener('click', function() { switch_hide(this) })
253
- }
254
- }
255
- }
256
-
257
- function register_hover_button(obj) {
258
- var elems = obj.querySelectorAll(".hover-button")
259
- for(var i = 0; i < elems.length; i++) {
260
- var node = elems[i]
261
- while(node && node.classList.contains("hover-button-box") ) { node = node.parentNode }
262
- var parent = elems[i].parentNode.parentNode
263
- parent.addEventListener('mouseenter', function() {
264
- var elem = this.querySelector(".hover-button")
265
- elem.classList.remove("hide")
266
- })
267
- parent.addEventListener('mouseleave', function() {
268
- var elem = this.querySelector(".hover-button")
269
- elem.classList.add("hide")
270
- })
271
- }
272
- }
273
-
274
- function scroll_to(query) {
275
- var element = document.querySelector(query)
276
- if (element) {
277
- element.getBoundingClientRect().top
278
- var height = window.screenY - rect.top
279
- console.log("scroll_to_form_top: " + height)
280
- window.scroll({ top: height, behavior: "smooth" })
281
- } else {
282
- console.log("no such element: "+query)
283
- }
284
- }
285
-
286
- document.addEventListener('DOMContentLoaded', function () {
287
- add_event(document)
288
- })