glib-web 0.5.97 → 0.5.98

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 (192) hide show
  1. checksums.yaml +4 -4
  2. data/app/channels/glib/channel/is_typing_channel.rb +34 -34
  3. data/app/channels/glib/channel/online_channel.rb +36 -36
  4. data/app/controllers/concerns/glib/analytics/funnel.rb +61 -61
  5. data/app/controllers/concerns/glib/auth/policy.rb +149 -149
  6. data/app/controllers/concerns/glib/json/dynamic_text.rb +126 -126
  7. data/app/controllers/concerns/glib/json/libs.rb +149 -149
  8. data/app/controllers/concerns/glib/json/new_dynamic_text.rb +122 -122
  9. data/app/controllers/concerns/glib/json/transformation.rb +11 -11
  10. data/app/controllers/concerns/glib/json/traversal.rb +92 -92
  11. data/app/controllers/concerns/glib/json/ui.rb +88 -88
  12. data/app/controllers/concerns/glib/json/validation.rb +13 -13
  13. data/app/controllers/glib/home_controller.rb +54 -54
  14. data/app/helpers/glib/app_feature_support_helper.rb +16 -16
  15. data/app/helpers/glib/dynamic_images_helper.rb +55 -55
  16. data/app/helpers/glib/dynamic_texts_helper.rb +42 -42
  17. data/app/helpers/glib/enum_helper.rb +18 -18
  18. data/app/helpers/glib/forms_helper.rb +15 -15
  19. data/app/helpers/glib/json_ui/abstract_builder.rb +309 -309
  20. data/app/helpers/glib/json_ui/action_builder/dialogs.rb +58 -58
  21. data/app/helpers/glib/json_ui/action_builder/http.rb +39 -39
  22. data/app/helpers/glib/json_ui/action_builder/iap.rb +15 -15
  23. data/app/helpers/glib/json_ui/action_builder/panels.rb +14 -14
  24. data/app/helpers/glib/json_ui/action_builder/sheets.rb +15 -15
  25. data/app/helpers/glib/json_ui/action_builder/snackbars.rb +41 -41
  26. data/app/helpers/glib/json_ui/action_builder/windows.rb +38 -38
  27. data/app/helpers/glib/json_ui/action_builder.rb +140 -140
  28. data/app/helpers/glib/json_ui/analytics_helper.rb +17 -17
  29. data/app/helpers/glib/json_ui/dynamic_field_builders.rb +25 -25
  30. data/app/helpers/glib/json_ui/generic_builders.rb +28 -28
  31. data/app/helpers/glib/json_ui/list_builders.rb +110 -110
  32. data/app/helpers/glib/json_ui/menu_builder.rb +96 -96
  33. data/app/helpers/glib/json_ui/page_helper.rb +221 -221
  34. data/app/helpers/glib/json_ui/response_helper.rb +25 -25
  35. data/app/helpers/glib/json_ui/styling_helper.rb +55 -55
  36. data/app/helpers/glib/json_ui/table_builders.rb +74 -74
  37. data/app/helpers/glib/json_ui/view_builder/banners.rb +26 -26
  38. data/app/helpers/glib/json_ui/view_builder/charts.rb +49 -49
  39. data/app/helpers/glib/json_ui/view_builder/fields.rb +296 -296
  40. data/app/helpers/glib/json_ui/view_builder/iap.rb +11 -11
  41. data/app/helpers/glib/json_ui/view_builder/panels.rb +262 -262
  42. data/app/helpers/glib/json_ui/view_builder.rb +256 -253
  43. data/app/helpers/glib/urls_helper.rb +12 -12
  44. data/app/models/concerns/glib/soft_deletable.rb +73 -73
  45. data/app/models/glib/active_storage/attachment.rb +9 -9
  46. data/app/models/glib/active_storage/blob.rb +9 -9
  47. data/app/models/glib/application_record.rb +18 -18
  48. data/app/models/glib/dynamic_text_record.rb +9 -9
  49. data/app/models/glib/text.rb +95 -95
  50. data/app/policies/glib/application_policy.rb +191 -191
  51. data/app/validators/email_typo_validator.rb +38 -38
  52. data/app/validators/email_validator.rb +7 -7
  53. data/app/validators/url_validator.rb +20 -20
  54. data/app/views/json_ui/garage/_nav_menu.json.jbuilder +72 -72
  55. data/app/views/json_ui/garage/actions/_dialogs.json.jbuilder +104 -104
  56. data/app/views/json_ui/garage/actions/_http.json.jbuilder +24 -24
  57. data/app/views/json_ui/garage/actions/_panels.json.jbuilder +18 -18
  58. data/app/views/json_ui/garage/actions/_reload.json.jbuilder +17 -17
  59. data/app/views/json_ui/garage/actions/_sheets.json.jbuilder +18 -18
  60. data/app/views/json_ui/garage/actions/_snackbars.json.jbuilder +33 -33
  61. data/app/views/json_ui/garage/actions/_timeouts.json.jbuilder +24 -24
  62. data/app/views/json_ui/garage/actions/_windows.json.jbuilder +24 -24
  63. data/app/views/json_ui/garage/actions/dialogs_oauth_post.json.jbuilder +6 -6
  64. data/app/views/json_ui/garage/actions/index.json.jbuilder +24 -24
  65. data/app/views/json_ui/garage/forms/_alert_post_data.json.jbuilder +10 -10
  66. data/app/views/json_ui/garage/forms/basic.json.jbuilder +21 -21
  67. data/app/views/json_ui/garage/forms/basic_post.json.jbuilder +8 -8
  68. data/app/views/json_ui/garage/forms/checkboxes.json.jbuilder +27 -27
  69. data/app/views/json_ui/garage/forms/conditional_value.json.jbuilder +38 -38
  70. data/app/views/json_ui/garage/forms/dynamic_group.json.jbuilder +39 -39
  71. data/app/views/json_ui/garage/forms/dynamic_select.json.jbuilder +24 -24
  72. data/app/views/json_ui/garage/forms/dynamic_select_data.json.jbuilder +38 -38
  73. data/app/views/json_ui/garage/forms/file_upload.json.jbuilder +37 -37
  74. data/app/views/json_ui/garage/forms/floating_submit.json.jbuilder +19 -19
  75. data/app/views/json_ui/garage/forms/generic_post.json.jbuilder +3 -3
  76. data/app/views/json_ui/garage/forms/get_request.json.jbuilder +27 -27
  77. data/app/views/json_ui/garage/forms/index.json.jbuilder +120 -120
  78. data/app/views/json_ui/garage/forms/new_rich_text.json.jbuilder +40 -40
  79. data/app/views/json_ui/garage/forms/online_participant1.json.jbuilder +25 -25
  80. data/app/views/json_ui/garage/forms/online_participant2.json.jbuilder +25 -25
  81. data/app/views/json_ui/garage/forms/payments.json.jbuilder +34 -34
  82. data/app/views/json_ui/garage/forms/pickers.json.jbuilder +89 -89
  83. data/app/views/json_ui/garage/forms/ratings.json.jbuilder +49 -49
  84. data/app/views/json_ui/garage/forms/rich_text.json.jbuilder +40 -40
  85. data/app/views/json_ui/garage/forms/selects.json.jbuilder +91 -91
  86. data/app/views/json_ui/garage/forms/show_hide.json.jbuilder +150 -150
  87. data/app/views/json_ui/garage/forms/styled_boxes.json.jbuilder +35 -35
  88. data/app/views/json_ui/garage/forms/submission_flow.json.jbuilder +17 -17
  89. data/app/views/json_ui/garage/forms/submission_flow_post.json.jbuilder +26 -26
  90. data/app/views/json_ui/garage/forms/submission_indicator.json.jbuilder +63 -63
  91. data/app/views/json_ui/garage/forms/submission_indicator_post.json.jbuilder +25 -25
  92. data/app/views/json_ui/garage/forms/submit_on_change.json.jbuilder +28 -28
  93. data/app/views/json_ui/garage/forms/text_validation.json.jbuilder +65 -65
  94. data/app/views/json_ui/garage/forms/timers.json.jbuilder +120 -120
  95. data/app/views/json_ui/garage/home/blank.json.jbuilder +10 -10
  96. data/app/views/json_ui/garage/home/index.json.jbuilder +36 -36
  97. data/app/views/json_ui/garage/home/slow.json.jbuilder +11 -11
  98. data/app/views/json_ui/garage/lists/_autoload_section.json.jbuilder +30 -30
  99. data/app/views/json_ui/garage/lists/autoload_all.json.jbuilder +32 -32
  100. data/app/views/json_ui/garage/lists/autoload_as_needed.json.jbuilder +35 -35
  101. data/app/views/json_ui/garage/lists/autoload_as_needed_responsive_columns.json.jbuilder +27 -27
  102. data/app/views/json_ui/garage/lists/chat_ui.json.jbuilder +94 -94
  103. data/app/views/json_ui/garage/lists/edit_actions.json.jbuilder +62 -62
  104. data/app/views/json_ui/garage/lists/fab.json.jbuilder +12 -12
  105. data/app/views/json_ui/garage/lists/index.json.jbuilder +41 -41
  106. data/app/views/json_ui/garage/lists/reordering.json.jbuilder +34 -34
  107. data/app/views/json_ui/garage/lists/templating.json.jbuilder +35 -35
  108. data/app/views/json_ui/garage/notifications/action_cable.json.jbuilder +114 -114
  109. data/app/views/json_ui/garage/notifications/android_post.json.jbuilder +48 -48
  110. data/app/views/json_ui/garage/notifications/index.json.jbuilder +36 -36
  111. data/app/views/json_ui/garage/notifications/web_socket.json.jbuilder +60 -60
  112. data/app/views/json_ui/garage/pages/flat_centered.json.jbuilder +29 -29
  113. data/app/views/json_ui/garage/pages/full_width.json.jbuilder +29 -29
  114. data/app/views/json_ui/garage/pages/full_width_height.json.jbuilder +16 -16
  115. data/app/views/json_ui/garage/pages/index.json.jbuilder +62 -62
  116. data/app/views/json_ui/garage/pages/layout.json.jbuilder +18 -18
  117. data/app/views/json_ui/garage/pages/lifecycle_hooks.json.jbuilder +13 -13
  118. data/app/views/json_ui/garage/pages/loading_indicator.json.jbuilder +10 -10
  119. data/app/views/json_ui/garage/pages/nav_buttons.json.jbuilder +21 -21
  120. data/app/views/json_ui/garage/pages/nested_scroll.json.jbuilder +40 -40
  121. data/app/views/json_ui/garage/pages/tab_bar.json.jbuilder +92 -92
  122. data/app/views/json_ui/garage/panels/_styled.json.jbuilder +78 -78
  123. data/app/views/json_ui/garage/panels/card.json.jbuilder +4 -4
  124. data/app/views/json_ui/garage/panels/carousel.json.jbuilder +38 -38
  125. data/app/views/json_ui/garage/panels/custom.json.jbuilder +17 -17
  126. data/app/views/json_ui/garage/panels/flow.json.jbuilder +59 -59
  127. data/app/views/json_ui/garage/panels/horizontal.json.jbuilder +101 -101
  128. data/app/views/json_ui/garage/panels/index.json.jbuilder +138 -138
  129. data/app/views/json_ui/garage/panels/outlined.json.jbuilder +4 -4
  130. data/app/views/json_ui/garage/panels/responsive.json.jbuilder +98 -98
  131. data/app/views/json_ui/garage/panels/split.json.jbuilder +182 -182
  132. data/app/views/json_ui/garage/panels/ul.json.jbuilder +33 -33
  133. data/app/views/json_ui/garage/panels/vertical.json.jbuilder +55 -55
  134. data/app/views/json_ui/garage/panels/web.json.jbuilder +15 -15
  135. data/app/views/json_ui/garage/services/dynamic_text.json.jbuilder +13 -13
  136. data/app/views/json_ui/garage/services/image.json.jbuilder +47 -47
  137. data/app/views/json_ui/garage/services/index.json.jbuilder +17 -17
  138. data/app/views/json_ui/garage/tables/_autoload_section.json.jbuilder +16 -16
  139. data/app/views/json_ui/garage/tables/autoload_all.json.jbuilder +43 -43
  140. data/app/views/json_ui/garage/tables/autoload_as_needed.json.jbuilder +50 -50
  141. data/app/views/json_ui/garage/tables/export_import.json.jbuilder +29 -29
  142. data/app/views/json_ui/garage/tables/horizontal_scroll.json.jbuilder +26 -26
  143. data/app/views/json_ui/garage/tables/index.json.jbuilder +25 -25
  144. data/app/views/json_ui/garage/tables/layout.json.jbuilder +40 -40
  145. data/app/views/json_ui/garage/views/_chart_data.json.jbuilder +17 -17
  146. data/app/views/json_ui/garage/views/banners.json.jbuilder +67 -67
  147. data/app/views/json_ui/garage/views/calendar_data.json.jbuilder +30 -30
  148. data/app/views/json_ui/garage/views/charts.json.jbuilder +125 -125
  149. data/app/views/json_ui/garage/views/controls.json.jbuilder +60 -60
  150. data/app/views/json_ui/garage/views/iap.json.jbuilder +21 -21
  151. data/app/views/json_ui/garage/views/icon_names.json.jbuilder +1450 -1450
  152. data/app/views/json_ui/garage/views/icons.json.jbuilder +15 -15
  153. data/app/views/json_ui/garage/views/images.json.jbuilder +89 -89
  154. data/app/views/json_ui/garage/views/index.json.jbuilder +83 -83
  155. data/app/views/json_ui/garage/views/links.json.jbuilder +70 -70
  156. data/app/views/json_ui/garage/views/map_cluster_data.json.jbuilder +41 -41
  157. data/app/views/json_ui/garage/views/map_data.json.jbuilder +51 -51
  158. data/app/views/json_ui/garage/views/maps.json.jbuilder +31 -31
  159. data/app/views/json_ui/garage/views/markdowns.json.jbuilder +41 -41
  160. data/app/views/json_ui/garage/views/misc.json.jbuilder +34 -34
  161. data/app/views/json_ui/garage/views/progress.json.jbuilder +31 -31
  162. data/app/views/json_ui/garage/views/texts.json.jbuilder +35 -35
  163. data/app/views/layouts/json_ui/renderer.html.erb +35 -35
  164. data/config/routes.rb +7 -7
  165. data/lib/generators/glib/install_generator.rb +24 -24
  166. data/lib/generators/templates/20191017062519_create_texts.rb +12 -12
  167. data/lib/generators/templates/20191024063257_add_scope_to_texts.rb +7 -7
  168. data/lib/generators/templates/20191112095018_add_lang_to_texts.rb +7 -7
  169. data/lib/generators/templates/20191126071051_create_active_storage_tables.active_storage.rb +27 -27
  170. data/lib/generators/templates/database.yml +107 -107
  171. data/lib/generators/templates/dynamic_text.rb +2 -2
  172. data/lib/glib/crypt/utils.rb +26 -26
  173. data/lib/glib/dynamic_text/config.rb +21 -21
  174. data/lib/glib/engine.rb +7 -7
  175. data/lib/glib/json_crawler/action_crawler.rb +23 -23
  176. data/lib/glib/json_crawler/action_crawlers/action_http.rb +11 -11
  177. data/lib/glib/json_crawler/action_crawlers/forms_submit.rb +48 -48
  178. data/lib/glib/json_crawler/action_crawlers/menu.rb +12 -12
  179. data/lib/glib/json_crawler/action_crawlers/nav_initiate.rb +19 -19
  180. data/lib/glib/json_crawler/action_crawlers/run_multiple.rb +13 -13
  181. data/lib/glib/json_crawler/action_crawlers/windows_open.rb +33 -33
  182. data/lib/glib/json_crawler/coverage.rb +20 -20
  183. data/lib/glib/json_crawler/http.rb +120 -120
  184. data/lib/glib/json_crawler/router.rb +90 -90
  185. data/lib/glib/json_crawler.rb +11 -11
  186. data/lib/glib/mailer_tester.rb +36 -36
  187. data/lib/glib/test_helpers.rb +52 -52
  188. data/lib/glib/value.rb +7 -7
  189. data/lib/glib/version.rb +5 -5
  190. data/lib/glib-web.rb +9 -9
  191. data/lib/tasks/db.rake +95 -95
  192. metadata +2 -3
@@ -1,122 +1,122 @@
1
- module Glib::Json::NewDynamicText
2
- def __json_traversal_register_dynamic_text
3
- @__specs = {}
4
- @__specs_db = {}
5
-
6
- __json_traversal_on_traverse do |view|
7
- extract_spec(view, 'text')
8
- end
9
-
10
- __json_traversal_on_complete do |view|
11
- if @__specs.keys.size > 0
12
- # translated_texts = retrieve_remote_texts(@__specs.keys)
13
- translated_texts = retrieve_local_texts(@__specs.keys).merge(retrieve_remote_texts(@__specs.keys))
14
- translated_texts.each do |key, value|
15
- @__specs[key].each do |spec|
16
- spec.substitute_with(value)
17
- end
18
-
19
- if @__specs_db[key] && @__specs_db[key].images.attached?
20
- @__specs[key].each do |spec|
21
- spec.substitute_image_with(@__specs_db[key].images)
22
- end
23
- end
24
- end
25
- end
26
- end
27
- end
28
-
29
- def retrieve_example_texts(keys)
30
- examples_translations = {
31
- 'home.json_ui_garage.hello' => 'Hello {{name}}',
32
- 'home.json_ui_garage.greeting' => 'Good day!',
33
- 'home.json_ui_garage.greeting_with_image' => 'Good day! (with image)',
34
- }
35
-
36
- translated_texts = {}
37
- keys.each do |key|
38
- translated_texts[key] = examples_translations[key]
39
- end
40
- translated_texts
41
- end
42
-
43
- def retrieve_remote_texts(keys)
44
- retries = 0
45
-
46
- begin
47
- response = RestClient.get(ENV['DTR_URL'], { params: { keys: keys } })
48
- rescue Errno::ECONNREFUSED, RestClient::InternalServerError, RestClient::Exceptions::OpenTimeout, RestClient::Exceptions::ReadTimeout
49
- if (retries += 1) <= 3
50
- puts "Timeout, retrying..."
51
- retry
52
- else
53
- raise
54
- end
55
- end
56
-
57
- JSON.parse(response)
58
- end
59
-
60
- def retrieve_local_texts(keys)
61
- translated_texts = {}
62
- db_keys = []
63
-
64
- redis = Glib::DynamicText::Config.redis
65
- contents = redis.pipelined do
66
- keys.each do |key|
67
- args = @__specs[key].first.args
68
- options = {
69
- scope: args.fetch(:scope, 'itinerarybuilder'),
70
- lang: args.fetch(:lang, 'en')
71
- }
72
-
73
- scope_key = "#{options[:scope]}.#{options[:lang]}.#{key}"
74
- redis.get(scope_key)
75
- end
76
- end
77
-
78
- keys.each_with_index do |key, index|
79
- if content = contents[index]
80
- translated_texts[key] = content
81
- db_keys << key if content.match(/\{\{image(\d)\}\}/)
82
- else
83
- db_keys << key
84
- end
85
- end
86
-
87
- if db_keys.size > 0
88
- texts = Glib::Text.where(key: db_keys)
89
- texts.each do |text|
90
- translated_texts[text.key] = text.content
91
- @__specs_db[text.key] = text
92
- end
93
- end
94
-
95
- translated_texts
96
- end
97
-
98
- def extract_spec(view, prop)
99
- if (spec = view[prop])
100
- if spec.is_a?(Hash) && (key = spec['dt_key'])
101
- @__specs[key] ||= []
102
- @__specs[key] << TextSpec.new(view, prop, spec)
103
- end
104
- end
105
- end
106
-
107
- TextSpec = Struct.new(:view, :prop, :args) do
108
- def substitute_with(text)
109
- view[prop] = text.gsub(/\{\{(\w+)\}\}/) { args.fetch($1, "{{#{$1}}}") }
110
- end
111
-
112
- def substitute_image_with(images)
113
- view[prop] = view[prop].gsub(/\{\{image(\d)\}\}/) {
114
- if image = images[$1.to_i - 1]
115
- ApplicationController.helpers.glib_dynamic_image_url(image.blob.key)
116
- else
117
- "{{image#{$1}}}"
118
- end
119
- }
120
- end
121
- end
122
- end
1
+ module Glib::Json::NewDynamicText
2
+ def __json_traversal_register_dynamic_text
3
+ @__specs = {}
4
+ @__specs_db = {}
5
+
6
+ __json_traversal_on_traverse do |view|
7
+ extract_spec(view, 'text')
8
+ end
9
+
10
+ __json_traversal_on_complete do |view|
11
+ if @__specs.keys.size > 0
12
+ # translated_texts = retrieve_remote_texts(@__specs.keys)
13
+ translated_texts = retrieve_local_texts(@__specs.keys).merge(retrieve_remote_texts(@__specs.keys))
14
+ translated_texts.each do |key, value|
15
+ @__specs[key].each do |spec|
16
+ spec.substitute_with(value)
17
+ end
18
+
19
+ if @__specs_db[key] && @__specs_db[key].images.attached?
20
+ @__specs[key].each do |spec|
21
+ spec.substitute_image_with(@__specs_db[key].images)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ def retrieve_example_texts(keys)
30
+ examples_translations = {
31
+ 'home.json_ui_garage.hello' => 'Hello {{name}}',
32
+ 'home.json_ui_garage.greeting' => 'Good day!',
33
+ 'home.json_ui_garage.greeting_with_image' => 'Good day! (with image)',
34
+ }
35
+
36
+ translated_texts = {}
37
+ keys.each do |key|
38
+ translated_texts[key] = examples_translations[key]
39
+ end
40
+ translated_texts
41
+ end
42
+
43
+ def retrieve_remote_texts(keys)
44
+ retries = 0
45
+
46
+ begin
47
+ response = RestClient.get(ENV['DTR_URL'], { params: { keys: keys } })
48
+ rescue Errno::ECONNREFUSED, RestClient::InternalServerError, RestClient::Exceptions::OpenTimeout, RestClient::Exceptions::ReadTimeout
49
+ if (retries += 1) <= 3
50
+ puts "Timeout, retrying..."
51
+ retry
52
+ else
53
+ raise
54
+ end
55
+ end
56
+
57
+ JSON.parse(response)
58
+ end
59
+
60
+ def retrieve_local_texts(keys)
61
+ translated_texts = {}
62
+ db_keys = []
63
+
64
+ redis = Glib::DynamicText::Config.redis
65
+ contents = redis.pipelined do
66
+ keys.each do |key|
67
+ args = @__specs[key].first.args
68
+ options = {
69
+ scope: args.fetch(:scope, 'itinerarybuilder'),
70
+ lang: args.fetch(:lang, 'en')
71
+ }
72
+
73
+ scope_key = "#{options[:scope]}.#{options[:lang]}.#{key}"
74
+ redis.get(scope_key)
75
+ end
76
+ end
77
+
78
+ keys.each_with_index do |key, index|
79
+ if content = contents[index]
80
+ translated_texts[key] = content
81
+ db_keys << key if content.match(/\{\{image(\d)\}\}/)
82
+ else
83
+ db_keys << key
84
+ end
85
+ end
86
+
87
+ if db_keys.size > 0
88
+ texts = Glib::Text.where(key: db_keys)
89
+ texts.each do |text|
90
+ translated_texts[text.key] = text.content
91
+ @__specs_db[text.key] = text
92
+ end
93
+ end
94
+
95
+ translated_texts
96
+ end
97
+
98
+ def extract_spec(view, prop)
99
+ if (spec = view[prop])
100
+ if spec.is_a?(Hash) && (key = spec['dt_key'])
101
+ @__specs[key] ||= []
102
+ @__specs[key] << TextSpec.new(view, prop, spec)
103
+ end
104
+ end
105
+ end
106
+
107
+ TextSpec = Struct.new(:view, :prop, :args) do
108
+ def substitute_with(text)
109
+ view[prop] = text.gsub(/\{\{(\w+)\}\}/) { args.fetch($1, "{{#{$1}}}") }
110
+ end
111
+
112
+ def substitute_image_with(images)
113
+ view[prop] = view[prop].gsub(/\{\{image(\d)\}\}/) {
114
+ if image = images[$1.to_i - 1]
115
+ ApplicationController.helpers.glib_dynamic_image_url(image.blob.key)
116
+ else
117
+ "{{image#{$1}}}"
118
+ end
119
+ }
120
+ end
121
+ end
122
+ end
@@ -1,11 +1,11 @@
1
- module Glib::Json::Transformation
2
- def json_transformation_start
3
- if request.format == 'json'
4
- @__transformed_json ||= JSON.parse(response.body) rescue nil
5
- end
6
- end
7
-
8
- def __json_transformation_commit
9
- response.body = @__transformed_json.to_json if @__transformed_json
10
- end
11
- end
1
+ module Glib::Json::Transformation
2
+ def json_transformation_start
3
+ if request.format == 'json'
4
+ @__transformed_json ||= JSON.parse(response.body) rescue nil
5
+ end
6
+ end
7
+
8
+ def __json_transformation_commit
9
+ response.body = @__transformed_json.to_json if @__transformed_json
10
+ end
11
+ end
@@ -1,92 +1,92 @@
1
- module Glib::Json::Traversal
2
- def __json_traversal_on_traverse(&block)
3
- @__json_traversal_on_traverses ||= []
4
- @__json_traversal_on_traverses << block
5
- end
6
-
7
- def __json_traversal_on_complete(&block)
8
- @__json_traversal_on_completes ||= []
9
- @__json_traversal_on_completes << block
10
- end
11
-
12
- def __json_traversal_perform
13
- if (hash = json_transformation_start).is_a?(Hash)
14
- traverse hash['header']&.[]('childViews')
15
- traverse hash['body']&.[]('childViews')
16
- traverse hash['footer']&.[]('childViews')
17
-
18
- @__json_traversal_on_completes.each do |block|
19
- block.call
20
- end
21
- end
22
- end
23
-
24
- def traverse(views)
25
- Visitor.new.traverse_multiple views, ->(view) do
26
- @__json_traversal_on_traverses.each do |block|
27
- block.call(view)
28
- end
29
- end
30
- end
31
-
32
-
33
-
34
- class Visitor
35
- # Used in test crawler
36
- attr_reader :forms
37
-
38
- def initialize
39
- @forms = []
40
- end
41
-
42
- def traverse_multiple(views, block)
43
- if views.is_a? Array
44
- views.each do |view|
45
- case view['view']
46
- when 'panels/form-v1'
47
- @forms << view
48
- traverse_single view, block
49
- @forms.pop
50
- else
51
- traverse_single view, block
52
- end
53
- end
54
- end
55
- end
56
-
57
- def traverse_vertical_content(view, block)
58
- traverse_multiple view['childViews'], block if view
59
- end
60
-
61
- def traverse_single(view, block)
62
- block.call view
63
-
64
- # Generic view children
65
- traverse_multiple view['childViews'], block
66
-
67
- # Generic menu buttons
68
- traverse_multiple view['buttons'], block
69
- traverse_multiple view['childButtons'], block
70
-
71
- # Split panel
72
- traverse_vertical_content view['left'], block
73
- traverse_vertical_content view['center'], block
74
- traverse_vertical_content view['right'], block
75
-
76
- # List template
77
- traverse_multiple view['editButtons'], block
78
- traverse_multiple view['leftButtons'], block
79
- traverse_multiple view['rightButtons'], block
80
-
81
- # TODO: crawl header and footer
82
- # Table/List
83
- if (sections = view['sections']).is_a? Array
84
- sections.each do |section|
85
- traverse_vertical_content section['header'], block
86
- traverse_multiple section['rows'], block
87
- traverse_vertical_content section['footer'], block
88
- end
89
- end
90
- end
91
- end
92
- end
1
+ module Glib::Json::Traversal
2
+ def __json_traversal_on_traverse(&block)
3
+ @__json_traversal_on_traverses ||= []
4
+ @__json_traversal_on_traverses << block
5
+ end
6
+
7
+ def __json_traversal_on_complete(&block)
8
+ @__json_traversal_on_completes ||= []
9
+ @__json_traversal_on_completes << block
10
+ end
11
+
12
+ def __json_traversal_perform
13
+ if (hash = json_transformation_start).is_a?(Hash)
14
+ traverse hash['header']&.[]('childViews')
15
+ traverse hash['body']&.[]('childViews')
16
+ traverse hash['footer']&.[]('childViews')
17
+
18
+ @__json_traversal_on_completes.each do |block|
19
+ block.call
20
+ end
21
+ end
22
+ end
23
+
24
+ def traverse(views)
25
+ Visitor.new.traverse_multiple views, ->(view) do
26
+ @__json_traversal_on_traverses.each do |block|
27
+ block.call(view)
28
+ end
29
+ end
30
+ end
31
+
32
+
33
+
34
+ class Visitor
35
+ # Used in test crawler
36
+ attr_reader :forms
37
+
38
+ def initialize
39
+ @forms = []
40
+ end
41
+
42
+ def traverse_multiple(views, block)
43
+ if views.is_a? Array
44
+ views.each do |view|
45
+ case view['view']
46
+ when 'panels/form-v1'
47
+ @forms << view
48
+ traverse_single view, block
49
+ @forms.pop
50
+ else
51
+ traverse_single view, block
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ def traverse_vertical_content(view, block)
58
+ traverse_multiple view['childViews'], block if view
59
+ end
60
+
61
+ def traverse_single(view, block)
62
+ block.call view
63
+
64
+ # Generic view children
65
+ traverse_multiple view['childViews'], block
66
+
67
+ # Generic menu buttons
68
+ traverse_multiple view['buttons'], block
69
+ traverse_multiple view['childButtons'], block
70
+
71
+ # Split panel
72
+ traverse_vertical_content view['left'], block
73
+ traverse_vertical_content view['center'], block
74
+ traverse_vertical_content view['right'], block
75
+
76
+ # List template
77
+ traverse_multiple view['editButtons'], block
78
+ traverse_multiple view['leftButtons'], block
79
+ traverse_multiple view['rightButtons'], block
80
+
81
+ # TODO: crawl header and footer
82
+ # Table/List
83
+ if (sections = view['sections']).is_a? Array
84
+ sections.each do |section|
85
+ traverse_vertical_content section['header'], block
86
+ traverse_multiple section['rows'], block
87
+ traverse_vertical_content section['footer'], block
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -1,88 +1,88 @@
1
- module Glib::Json::Ui
2
- extend ActiveSupport::Concern
3
-
4
- included do
5
- rescue_from ActionController::UnknownFormat do |exception|
6
- if json_ui_activated?
7
- # Tell `__json_ui_start()` to avoid rendering this page while still retaining the `_render` param
8
- # so that the page remains linking to other json_ui pages.
9
- redirect_to url_for(format: nil, _skip_render: true)
10
- else
11
- raise exception
12
- end
13
- end
14
- end
15
-
16
- # Override
17
- def form_authenticity_token(*args)
18
- Rails.env.test? ? 'test_token' : super
19
- end
20
-
21
- # NOTE: Override default_url_options and call this method
22
- def json_ui_url_options
23
- options = {}
24
- options[:_render] = params[:_render]
25
- options[:_locale] = params[:_locale]
26
- options[:_preview] = params[:_preview]
27
- options[:format] = :json if request.format == :json
28
- options
29
- end
30
-
31
- def json_ui_activated?
32
- @__json_ui_activated
33
- end
34
-
35
- def json_ui_page_lifecycle_prop(name)
36
- if (hash = json_transformation_start).is_a?(Hash) && hash['body'] # A valid page
37
- hash[name] ||= { 'action' => 'runMultiple', 'childActions' => [] }
38
- hash[name]['childActions']
39
- end
40
- end
41
-
42
- def json_ui_response_lifecycle_prop
43
- prop_name = 'onResponse'
44
- if (hash = json_transformation_start).is_a?(Hash) && hash[prop_name] # A valid response
45
- if hash[prop_name]['action'] != 'runMultiple'
46
- childActions = [hash[prop_name]]
47
- hash[prop_name] = { 'action' => 'runMultiple', 'childActions' => childActions }
48
- childActions
49
- end
50
- end
51
- end
52
-
53
- def __json_ui_start(options)
54
- @__json_ui_activated = false
55
- @__json_ui_rendering = nil
56
- if options[:when] == :always || params[:_render] == 'v1'
57
- @__json_ui_activated = true
58
- request.variant = :ui
59
-
60
- # Some bots (e.g. Line and DuckDuckGo) passes `*/*` in the `Accept` header
61
- is_html = request.format.html? || request.format == '*/*'
62
- if is_html && params[:_skip_render] != 'true'
63
- @__json_ui_rendering = :vue
64
- request.format = 'json'
65
- end
66
- end
67
- end
68
-
69
- def __json_ui_commit(options)
70
- return if response.status >= 300
71
-
72
- case @__json_ui_rendering
73
- when :vue
74
- if (hash = json_transformation_start).is_a?(Hash)
75
- __json_ui_vue(hash, options)
76
- else
77
- raise "Invalid JSON UI payload: #{hash}"
78
- end
79
- end
80
- end
81
-
82
- private
83
- def __json_ui_vue(hash, options)
84
- renderer_path = options[:renderer_path]
85
- @__json_ui_orig_page = response.body
86
- response.body = render_to_string(template: renderer_path, layout: 'json_ui/renderer', content_type: 'text/html', locals: { page: hash, options: options })
87
- end
88
- end
1
+ module Glib::Json::Ui
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ rescue_from ActionController::UnknownFormat do |exception|
6
+ if json_ui_activated?
7
+ # Tell `__json_ui_start()` to avoid rendering this page while still retaining the `_render` param
8
+ # so that the page remains linking to other json_ui pages.
9
+ redirect_to url_for(format: nil, _skip_render: true)
10
+ else
11
+ raise exception
12
+ end
13
+ end
14
+ end
15
+
16
+ # Override
17
+ def form_authenticity_token(*args)
18
+ Rails.env.test? ? 'test_token' : super
19
+ end
20
+
21
+ # NOTE: Override default_url_options and call this method
22
+ def json_ui_url_options
23
+ options = {}
24
+ options[:_render] = params[:_render]
25
+ options[:_locale] = params[:_locale]
26
+ options[:_preview] = params[:_preview]
27
+ options[:format] = :json if request.format == :json
28
+ options
29
+ end
30
+
31
+ def json_ui_activated?
32
+ @__json_ui_activated
33
+ end
34
+
35
+ def json_ui_page_lifecycle_prop(name)
36
+ if (hash = json_transformation_start).is_a?(Hash) && hash['body'] # A valid page
37
+ hash[name] ||= { 'action' => 'runMultiple', 'childActions' => [] }
38
+ hash[name]['childActions']
39
+ end
40
+ end
41
+
42
+ def json_ui_response_lifecycle_prop
43
+ prop_name = 'onResponse'
44
+ if (hash = json_transformation_start).is_a?(Hash) && hash[prop_name] # A valid response
45
+ if hash[prop_name]['action'] != 'runMultiple'
46
+ childActions = [hash[prop_name]]
47
+ hash[prop_name] = { 'action' => 'runMultiple', 'childActions' => childActions }
48
+ childActions
49
+ end
50
+ end
51
+ end
52
+
53
+ def __json_ui_start(options)
54
+ @__json_ui_activated = false
55
+ @__json_ui_rendering = nil
56
+ if options[:when] == :always || params[:_render] == 'v1'
57
+ @__json_ui_activated = true
58
+ request.variant = :ui
59
+
60
+ # Some bots (e.g. Line and DuckDuckGo) passes `*/*` in the `Accept` header
61
+ is_html = request.format.html? || request.format == '*/*'
62
+ if is_html && params[:_skip_render] != 'true'
63
+ @__json_ui_rendering = :vue
64
+ request.format = 'json'
65
+ end
66
+ end
67
+ end
68
+
69
+ def __json_ui_commit(options)
70
+ return if response.status >= 300
71
+
72
+ case @__json_ui_rendering
73
+ when :vue
74
+ if (hash = json_transformation_start).is_a?(Hash)
75
+ __json_ui_vue(hash, options)
76
+ else
77
+ raise "Invalid JSON UI payload: #{hash}"
78
+ end
79
+ end
80
+ end
81
+
82
+ private
83
+ def __json_ui_vue(hash, options)
84
+ renderer_path = options[:renderer_path]
85
+ @__json_ui_orig_page = response.body
86
+ response.body = render_to_string(template: renderer_path, layout: 'json_ui/renderer', content_type: 'text/html', locals: { page: hash, options: options })
87
+ end
88
+ end
@@ -1,13 +1,13 @@
1
- module Glib::Json::Validation
2
- def __json_validate_perform
3
- if Rails.env.development? && params[:_validate] == 'true'
4
- if (hash = json_transformation_start).is_a?(Hash)
5
- json_validate = JSONValidate.new(hash)
6
- response_message = json_validate.valid?
7
- hash[:_json] = {
8
- validationErrors: response_message
9
- }
10
- end
11
- end
12
- end
13
- end
1
+ module Glib::Json::Validation
2
+ def __json_validate_perform
3
+ if Rails.env.development? && params[:_validate] == 'true'
4
+ if (hash = json_transformation_start).is_a?(Hash)
5
+ json_validate = JSONValidate.new(hash)
6
+ response_message = json_validate.valid?
7
+ hash[:_json] = {
8
+ validationErrors: response_message
9
+ }
10
+ end
11
+ end
12
+ end
13
+ end