ezframe 0.0.4 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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
- })