glib-web 0.5.83 → 0.5.84

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 (190) 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 -94
  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 +33 -33
  39. data/app/helpers/glib/json_ui/view_builder/fields.rb +291 -291
  40. data/app/helpers/glib/json_ui/view_builder/iap.rb +11 -11
  41. data/app/helpers/glib/json_ui/view_builder/panels.rb +258 -258
  42. data/app/helpers/glib/json_ui/view_builder.rb +248 -247
  43. data/app/helpers/glib/urls_helper.rb +12 -12
  44. data/app/models/concerns/glib/soft_deletable.rb +68 -68
  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 +70 -70
  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 +43 -43
  69. data/app/views/json_ui/garage/forms/conditional_value.json.jbuilder +36 -36
  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 +116 -116
  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 +81 -81
  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/text_validation.json.jbuilder +65 -65
  93. data/app/views/json_ui/garage/forms/timers.json.jbuilder +120 -120
  94. data/app/views/json_ui/garage/home/blank.json.jbuilder +10 -10
  95. data/app/views/json_ui/garage/home/index.json.jbuilder +36 -36
  96. data/app/views/json_ui/garage/home/slow.json.jbuilder +11 -11
  97. data/app/views/json_ui/garage/lists/_autoload_section.json.jbuilder +30 -30
  98. data/app/views/json_ui/garage/lists/autoload_all.json.jbuilder +32 -32
  99. data/app/views/json_ui/garage/lists/autoload_as_needed.json.jbuilder +35 -35
  100. data/app/views/json_ui/garage/lists/chat_ui.json.jbuilder +94 -94
  101. data/app/views/json_ui/garage/lists/edit_actions.json.jbuilder +62 -62
  102. data/app/views/json_ui/garage/lists/fab.json.jbuilder +12 -12
  103. data/app/views/json_ui/garage/lists/index.json.jbuilder +38 -38
  104. data/app/views/json_ui/garage/lists/reordering.json.jbuilder +34 -34
  105. data/app/views/json_ui/garage/lists/templating.json.jbuilder +35 -35
  106. data/app/views/json_ui/garage/notifications/action_cable.json.jbuilder +114 -114
  107. data/app/views/json_ui/garage/notifications/android_post.json.jbuilder +48 -48
  108. data/app/views/json_ui/garage/notifications/index.json.jbuilder +36 -36
  109. data/app/views/json_ui/garage/notifications/web_socket.json.jbuilder +60 -60
  110. data/app/views/json_ui/garage/pages/flat_centered.json.jbuilder +29 -29
  111. data/app/views/json_ui/garage/pages/full_width.json.jbuilder +29 -29
  112. data/app/views/json_ui/garage/pages/full_width_height.json.jbuilder +16 -16
  113. data/app/views/json_ui/garage/pages/index.json.jbuilder +62 -62
  114. data/app/views/json_ui/garage/pages/layout.json.jbuilder +18 -18
  115. data/app/views/json_ui/garage/pages/lifecycle_hooks.json.jbuilder +13 -13
  116. data/app/views/json_ui/garage/pages/loading_indicator.json.jbuilder +10 -10
  117. data/app/views/json_ui/garage/pages/nav_buttons.json.jbuilder +21 -21
  118. data/app/views/json_ui/garage/pages/nested_scroll.json.jbuilder +40 -40
  119. data/app/views/json_ui/garage/pages/tab_bar.json.jbuilder +66 -31
  120. data/app/views/json_ui/garage/panels/_styled.json.jbuilder +78 -78
  121. data/app/views/json_ui/garage/panels/card.json.jbuilder +4 -4
  122. data/app/views/json_ui/garage/panels/carousel.json.jbuilder +38 -38
  123. data/app/views/json_ui/garage/panels/custom.json.jbuilder +17 -17
  124. data/app/views/json_ui/garage/panels/flow.json.jbuilder +59 -59
  125. data/app/views/json_ui/garage/panels/horizontal.json.jbuilder +91 -91
  126. data/app/views/json_ui/garage/panels/index.json.jbuilder +138 -138
  127. data/app/views/json_ui/garage/panels/outlined.json.jbuilder +4 -4
  128. data/app/views/json_ui/garage/panels/responsive.json.jbuilder +98 -98
  129. data/app/views/json_ui/garage/panels/split.json.jbuilder +182 -182
  130. data/app/views/json_ui/garage/panels/ul.json.jbuilder +33 -33
  131. data/app/views/json_ui/garage/panels/vertical.json.jbuilder +55 -55
  132. data/app/views/json_ui/garage/panels/web.json.jbuilder +15 -15
  133. data/app/views/json_ui/garage/services/dynamic_text.json.jbuilder +13 -13
  134. data/app/views/json_ui/garage/services/image.json.jbuilder +47 -47
  135. data/app/views/json_ui/garage/services/index.json.jbuilder +17 -17
  136. data/app/views/json_ui/garage/tables/_autoload_section.json.jbuilder +16 -16
  137. data/app/views/json_ui/garage/tables/autoload_all.json.jbuilder +43 -43
  138. data/app/views/json_ui/garage/tables/autoload_as_needed.json.jbuilder +50 -50
  139. data/app/views/json_ui/garage/tables/export_import.json.jbuilder +29 -29
  140. data/app/views/json_ui/garage/tables/horizontal_scroll.json.jbuilder +26 -26
  141. data/app/views/json_ui/garage/tables/index.json.jbuilder +25 -25
  142. data/app/views/json_ui/garage/tables/layout.json.jbuilder +40 -40
  143. data/app/views/json_ui/garage/views/_chart_data.json.jbuilder +17 -17
  144. data/app/views/json_ui/garage/views/banners.json.jbuilder +67 -63
  145. data/app/views/json_ui/garage/views/calendar_data.json.jbuilder +30 -30
  146. data/app/views/json_ui/garage/views/charts.json.jbuilder +115 -115
  147. data/app/views/json_ui/garage/views/controls.json.jbuilder +37 -37
  148. data/app/views/json_ui/garage/views/iap.json.jbuilder +21 -21
  149. data/app/views/json_ui/garage/views/icon_names.json.jbuilder +1450 -1450
  150. data/app/views/json_ui/garage/views/icons.json.jbuilder +15 -15
  151. data/app/views/json_ui/garage/views/images.json.jbuilder +89 -89
  152. data/app/views/json_ui/garage/views/index.json.jbuilder +83 -83
  153. data/app/views/json_ui/garage/views/links.json.jbuilder +70 -70
  154. data/app/views/json_ui/garage/views/map_cluster_data.json.jbuilder +41 -41
  155. data/app/views/json_ui/garage/views/map_data.json.jbuilder +51 -51
  156. data/app/views/json_ui/garage/views/maps.json.jbuilder +31 -31
  157. data/app/views/json_ui/garage/views/markdowns.json.jbuilder +41 -41
  158. data/app/views/json_ui/garage/views/misc.json.jbuilder +34 -34
  159. data/app/views/json_ui/garage/views/progress.json.jbuilder +31 -31
  160. data/app/views/json_ui/garage/views/texts.json.jbuilder +35 -35
  161. data/app/views/layouts/json_ui/renderer.html.erb +35 -35
  162. data/config/routes.rb +7 -7
  163. data/lib/generators/glib/install_generator.rb +24 -24
  164. data/lib/generators/templates/20191017062519_create_texts.rb +12 -12
  165. data/lib/generators/templates/20191024063257_add_scope_to_texts.rb +7 -7
  166. data/lib/generators/templates/20191112095018_add_lang_to_texts.rb +7 -7
  167. data/lib/generators/templates/20191126071051_create_active_storage_tables.active_storage.rb +27 -27
  168. data/lib/generators/templates/database.yml +107 -107
  169. data/lib/generators/templates/dynamic_text.rb +2 -2
  170. data/lib/glib/crypt/utils.rb +26 -26
  171. data/lib/glib/dynamic_text/config.rb +21 -21
  172. data/lib/glib/engine.rb +7 -7
  173. data/lib/glib/json_crawler/action_crawler.rb +23 -23
  174. data/lib/glib/json_crawler/action_crawlers/action_http.rb +11 -11
  175. data/lib/glib/json_crawler/action_crawlers/forms_submit.rb +48 -48
  176. data/lib/glib/json_crawler/action_crawlers/menu.rb +12 -12
  177. data/lib/glib/json_crawler/action_crawlers/nav_initiate.rb +19 -19
  178. data/lib/glib/json_crawler/action_crawlers/run_multiple.rb +13 -13
  179. data/lib/glib/json_crawler/action_crawlers/windows_open.rb +33 -33
  180. data/lib/glib/json_crawler/coverage.rb +20 -20
  181. data/lib/glib/json_crawler/http.rb +120 -120
  182. data/lib/glib/json_crawler/router.rb +90 -90
  183. data/lib/glib/json_crawler.rb +11 -11
  184. data/lib/glib/mailer_tester.rb +36 -36
  185. data/lib/glib/test_helpers.rb +52 -52
  186. data/lib/glib/value.rb +7 -7
  187. data/lib/glib/version.rb +5 -5
  188. data/lib/glib-web.rb +9 -9
  189. data/lib/tasks/db.rake +95 -95
  190. metadata +2 -3
@@ -1,34 +1,34 @@
1
- page_index = params[:page].to_i
2
- next_page = {
3
- url: json_ui_garage_url(path: 'lists/reordering', page: page_index + 1, section_only: 'v1'),
4
- autoload: 'asNeeded'
5
- }
6
-
7
- page = json_ui_page json
8
-
9
- if params[:section_only].present?
10
- json.nextPage next_page if page_index < 3
11
- json.sections do
12
- json.child! do
13
- render 'json_ui/garage/lists/autoload_section', page: page, page_index: page_index, reorder: true
14
- end
15
- end
16
- else
17
- json.title 'Lists'
18
-
19
- render "#{@path_prefix}/nav_menu", json: json, page: page
20
-
21
- page.list nextPage: next_page, sections: [
22
- ->(section) do
23
- section.header padding: glib_json_padding_list, childViews: ->(header) do
24
- header.h3 text: 'Section One'
25
- end
26
- end,
27
- ->(section) do
28
- section.header padding: glib_json_padding_list, childViews: ->(header) do
29
- header.h3 text: 'Section Two'
30
- end
31
- render 'json_ui/garage/lists/autoload_section', page: page, page_index: page_index, reorder: true
32
- end
33
- ]
34
- end
1
+ page_index = params[:page].to_i
2
+ next_page = {
3
+ url: json_ui_garage_url(path: 'lists/reordering', page: page_index + 1, section_only: 'v1'),
4
+ autoload: 'asNeeded'
5
+ }
6
+
7
+ page = json_ui_page json
8
+
9
+ if params[:section_only].present?
10
+ json.nextPage next_page if page_index < 3
11
+ json.sections do
12
+ json.child! do
13
+ render 'json_ui/garage/lists/autoload_section', page: page, page_index: page_index, reorder: true
14
+ end
15
+ end
16
+ else
17
+ json.title 'Lists'
18
+
19
+ render "#{@path_prefix}/nav_menu", json: json, page: page
20
+
21
+ page.list nextPage: next_page, sections: [
22
+ ->(section) do
23
+ section.header padding: glib_json_padding_list, childViews: ->(header) do
24
+ header.h3 text: 'Section One'
25
+ end
26
+ end,
27
+ ->(section) do
28
+ section.header padding: glib_json_padding_list, childViews: ->(header) do
29
+ header.h3 text: 'Section Two'
30
+ end
31
+ render 'json_ui/garage/lists/autoload_section', page: page, page_index: page_index, reorder: true
32
+ end
33
+ ]
34
+ end
@@ -1,35 +1,35 @@
1
- json.title 'Lists'
2
-
3
- json_ui_page json do |page|
4
- render "#{@path_prefix}/nav_menu", json: json, page: page
5
-
6
- page.list firstSection: ->(section) do
7
- section.header padding: { top: 12, left: 16, right: 16, bottom: 12 }, childViews: ->(header) do
8
- header.h3 text: 'Section Header'
9
- end
10
-
11
- section.rows builder: ->(template) do
12
- template.thumbnail title: 'Click me', onClick: ->(action) do
13
- action.windows_open url: json_ui_garage_url(path: 'home/blank')
14
- end
15
- template.thumbnail title: 'Item with subtitle', subtitle: 'Item subtitle'
16
- template.thumbnail title: 'Item with chips', chips: ->(menu) do
17
- menu.button text: 'Finished', styleClass: 'info'
18
- menu.button props: { text: 'Succeeded', styleClass: 'success' }
19
- end
20
-
21
- template.thumbnail title: 'Item with thumbnail image', subtitle: 'Item subtitle', imageUrl: glib_json_image_standard_url
22
- template.featured title: 'Featured with featured image', subtitle: 'Item subtitle', imageUrl: glib_json_image_standard_url
23
-
24
- # TODO
25
- # template.thumbnail title: 'Item with accessories (Experimental)', subtitle: 'Item subtitle', accessoryViews: ->(thumbnail) do
26
- # thumbnail.panels_horizontal childViews: ->(horizontal) do
27
- # horizontal.chip text: 'finished'
28
- # horizontal.spacer width: 10
29
- # horizontal.chip text: 'succeeded'
30
- # end
31
- # end
32
-
33
- end
34
- end
35
- end
1
+ json.title 'Lists'
2
+
3
+ json_ui_page json do |page|
4
+ render "#{@path_prefix}/nav_menu", json: json, page: page
5
+
6
+ page.list firstSection: ->(section) do
7
+ section.header padding: { top: 12, left: 16, right: 16, bottom: 12 }, childViews: ->(header) do
8
+ header.h3 text: 'Section Header'
9
+ end
10
+
11
+ section.rows builder: ->(template) do
12
+ template.thumbnail title: 'Click me', onClick: ->(action) do
13
+ action.windows_open url: json_ui_garage_url(path: 'home/blank')
14
+ end
15
+ template.thumbnail title: 'Item with subtitle', subtitle: 'Item subtitle'
16
+ template.thumbnail title: 'Item with chips', chips: ->(menu) do
17
+ menu.button text: 'Finished', styleClass: 'info'
18
+ menu.button props: { text: 'Succeeded', styleClass: 'success' }
19
+ end
20
+
21
+ template.thumbnail title: 'Item with thumbnail image', subtitle: 'Item subtitle', imageUrl: glib_json_image_standard_url
22
+ template.featured title: 'Featured with featured image', subtitle: 'Item subtitle', imageUrl: glib_json_image_standard_url
23
+
24
+ # TODO
25
+ # template.thumbnail title: 'Item with accessories (Experimental)', subtitle: 'Item subtitle', accessoryViews: ->(thumbnail) do
26
+ # thumbnail.panels_horizontal childViews: ->(horizontal) do
27
+ # horizontal.chip text: 'finished'
28
+ # horizontal.spacer width: 10
29
+ # horizontal.chip text: 'succeeded'
30
+ # end
31
+ # end
32
+
33
+ end
34
+ end
35
+ end
@@ -1,114 +1,114 @@
1
- json.title 'ActionCable Real-time Update'
2
- page = json_ui_page json
3
-
4
- online_channel = 'OnlineChannel'
5
- typing_channel = 'IsTypingChannel'
6
- first_user = User.first
7
- second_user = User.offset(1).first
8
- # Implement a page that shows how ActionCable works in json_ui
9
-
10
- # 1. Example for list
11
- # column.panels_list actionCable: socket_config, width: 'matchParent', firstSection: ->(section) do
12
- # section.rows objects: @messages, builder: -> (row, message, index) do
13
- # render 'conversations/message', row: row, message: message, user: current_user
14
- # end
15
- # end
16
-
17
- # page.form url: json_ui_garage_url(path: 'forms/basic_post'), method: 'post', padding: glib_json_padding_body, childViews: ->(form) do
18
- # form.fields_textarea \
19
- # width: 'matchParent',
20
- # label: 'Message',
21
- # onKeyUp: ->(action) do
22
- # action.cables_push channel: 'isTypingChannel', data: { conversationId: 1, userId: 1 }
23
- # end
24
- # end
25
-
26
-
27
- # 3. Example for online status
28
-
29
- # put on app/channels/online_channel.rb
30
- # class OnlineChannel < Glib::Channel::OnlineChannel
31
- # self.channel_name = 'OnlineChannel'
32
- # end
33
-
34
- page.on load: ->(action) do
35
- action.timeouts_set interval: 1000, repeat: true, onTimeout: ->(subaction) do
36
- subaction.cables_push channel: online_channel, event: 'online_status', payload: { status: true, user_id: first_user.id }
37
- end
38
- end
39
-
40
- # 4. Example for typing status
41
-
42
- # put on app/channels/is_typing_channel.rb
43
- # class IsTypingChannel < Glib::Channel::IsTypingChannel
44
- # self.channel_name = 'IsTypingChannel'
45
- # end
46
-
47
- page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
48
-
49
- scroll.panels_split width: 'matchParent', content: ->(content) do
50
- content.left childViews: ->(left) do
51
- online_socket_config = {
52
- channel: online_channel,
53
- filterKey: second_user.id,
54
- params: {
55
- conversation: 2
56
- }
57
- }
58
- left.label actionCable: online_socket_config, text: ' '
59
-
60
- left.fields_textarea \
61
- width: 440,
62
- label: "Messages from #{first_user.full_name}",
63
- onTypeStart: lambda { |action|
64
- action.cables_push \
65
- channel: typing_channel, event: 'typing',
66
- payload: { status: true, user_id: first_user.id }
67
- },
68
- onTypeEnd: lambda { |action|
69
- action.cables_push \
70
- channel: typing_channel,
71
- event: 'typing',
72
- payload: { status: false, user_id: first_user.id }
73
- }
74
- left.spacer height: 10
75
-
76
- socket_config = {
77
- channel: typing_channel,
78
- filterKey: first_user.id,
79
- params: {
80
- conversation: 2
81
- }
82
- }
83
- left.label actionCable: socket_config, text: ' '
84
- end
85
-
86
- content.right childViews: ->(right) do
87
- right.label text: ''
88
- right.fields_textarea \
89
- width: 440,
90
- label: "Messages from #{second_user.full_name}",
91
- onTypeStart: lambda { |action|
92
- action.cables_push \
93
- channel: typing_channel, event: 'typing',
94
- payload: { status: true, user_id: second_user.id }
95
- },
96
- onTypeEnd: lambda { |action|
97
- action.cables_push \
98
- channel: typing_channel,
99
- event: 'typing',
100
- payload: { status: false, user_id: second_user.id }
101
- }
102
- right.spacer height: 10
103
-
104
- socket_config = {
105
- channel: typing_channel,
106
- filterKey: second_user.id,
107
- params: {
108
- conversation: 2
109
- }
110
- }
111
- right.label actionCable: socket_config, text: ' '
112
- end
113
- end
114
- end
1
+ json.title 'ActionCable Real-time Update'
2
+ page = json_ui_page json
3
+
4
+ online_channel = 'OnlineChannel'
5
+ typing_channel = 'IsTypingChannel'
6
+ first_user = User.first
7
+ second_user = User.offset(1).first
8
+ # Implement a page that shows how ActionCable works in json_ui
9
+
10
+ # 1. Example for list
11
+ # column.panels_list actionCable: socket_config, width: 'matchParent', firstSection: ->(section) do
12
+ # section.rows objects: @messages, builder: -> (row, message, index) do
13
+ # render 'conversations/message', row: row, message: message, user: current_user
14
+ # end
15
+ # end
16
+
17
+ # page.form url: json_ui_garage_url(path: 'forms/basic_post'), method: 'post', padding: glib_json_padding_body, childViews: ->(form) do
18
+ # form.fields_textarea \
19
+ # width: 'matchParent',
20
+ # label: 'Message',
21
+ # onKeyUp: ->(action) do
22
+ # action.cables_push channel: 'isTypingChannel', data: { conversationId: 1, userId: 1 }
23
+ # end
24
+ # end
25
+
26
+
27
+ # 3. Example for online status
28
+
29
+ # put on app/channels/online_channel.rb
30
+ # class OnlineChannel < Glib::Channel::OnlineChannel
31
+ # self.channel_name = 'OnlineChannel'
32
+ # end
33
+
34
+ page.on load: ->(action) do
35
+ action.timeouts_set interval: 1000, repeat: true, onTimeout: ->(subaction) do
36
+ subaction.cables_push channel: online_channel, event: 'online_status', payload: { status: true, user_id: first_user.id }
37
+ end
38
+ end
39
+
40
+ # 4. Example for typing status
41
+
42
+ # put on app/channels/is_typing_channel.rb
43
+ # class IsTypingChannel < Glib::Channel::IsTypingChannel
44
+ # self.channel_name = 'IsTypingChannel'
45
+ # end
46
+
47
+ page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
48
+
49
+ scroll.panels_split width: 'matchParent', content: ->(content) do
50
+ content.left childViews: ->(left) do
51
+ online_socket_config = {
52
+ channel: online_channel,
53
+ filterKey: second_user.id,
54
+ params: {
55
+ conversation: 2
56
+ }
57
+ }
58
+ left.label actionCable: online_socket_config, text: ' '
59
+
60
+ left.fields_textarea \
61
+ width: 440,
62
+ label: "Messages from #{first_user.full_name}",
63
+ onTypeStart: lambda { |action|
64
+ action.cables_push \
65
+ channel: typing_channel, event: 'typing',
66
+ payload: { status: true, user_id: first_user.id }
67
+ },
68
+ onTypeEnd: lambda { |action|
69
+ action.cables_push \
70
+ channel: typing_channel,
71
+ event: 'typing',
72
+ payload: { status: false, user_id: first_user.id }
73
+ }
74
+ left.spacer height: 10
75
+
76
+ socket_config = {
77
+ channel: typing_channel,
78
+ filterKey: first_user.id,
79
+ params: {
80
+ conversation: 2
81
+ }
82
+ }
83
+ left.label actionCable: socket_config, text: ' '
84
+ end
85
+
86
+ content.right childViews: ->(right) do
87
+ right.label text: ''
88
+ right.fields_textarea \
89
+ width: 440,
90
+ label: "Messages from #{second_user.full_name}",
91
+ onTypeStart: lambda { |action|
92
+ action.cables_push \
93
+ channel: typing_channel, event: 'typing',
94
+ payload: { status: true, user_id: second_user.id }
95
+ },
96
+ onTypeEnd: lambda { |action|
97
+ action.cables_push \
98
+ channel: typing_channel,
99
+ event: 'typing',
100
+ payload: { status: false, user_id: second_user.id }
101
+ }
102
+ right.spacer height: 10
103
+
104
+ socket_config = {
105
+ channel: typing_channel,
106
+ filterKey: second_user.id,
107
+ params: {
108
+ conversation: 2
109
+ }
110
+ }
111
+ right.label actionCable: socket_config, text: ' '
112
+ end
113
+ end
114
+ end
@@ -1,48 +1,48 @@
1
-
2
- if (server_key = ENV['FCM_SERVER_KEY'])
3
- if defined? FCM
4
- # Introduce delay so that we have time to place the app to background
5
- # before receiving push notification.
6
- sleep 2
7
-
8
- fcm = FCM.new(server_key)
9
- registration_ids = [params[:token]] # An array of one or more client registration tokens
10
-
11
- payload = json_ui_action_payload do |action|
12
- action.dialogs_alert message: 'Opened'
13
- end
14
-
15
- # See https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages for all available options.
16
- options = {
17
- notification: {
18
- title: params[:title],
19
- body: 'Message from server'
20
- # title: 'Offer from Ajisen Ramen',
21
- # body: 'Free side order of Gyoza'
22
- },
23
- data: {
24
- channelId: 'default',
25
- notificationId: 1,
26
- openUrl: json_ui_garage_url(path: 'home/blank'),
27
- onOpen: payload
28
- # openUrl: 'http://10.0.2.2:3000/offers.json?_render=v1',
29
- }
30
- }
31
- response = fcm.send(registration_ids, options)
32
-
33
- body = JSON.parse(response[:body])
34
- if (errors = body['results'].map { |i| i['error'] }.compact).any?
35
- message = errors.join(', ')
36
- else
37
- message = 'Sent'
38
- end
39
- else
40
- message = 'FCM gem needed'
41
- end
42
- else
43
- message = 'Env var needed: GCM_SERVER_KEY'
44
- end
45
-
46
- json_ui_response json do |action|
47
- action.snackbars_alert message: message
48
- end
1
+
2
+ if (server_key = ENV['FCM_SERVER_KEY'])
3
+ if defined? FCM
4
+ # Introduce delay so that we have time to place the app to background
5
+ # before receiving push notification.
6
+ sleep 2
7
+
8
+ fcm = FCM.new(server_key)
9
+ registration_ids = [params[:token]] # An array of one or more client registration tokens
10
+
11
+ payload = json_ui_action_payload do |action|
12
+ action.dialogs_alert message: 'Opened'
13
+ end
14
+
15
+ # See https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages for all available options.
16
+ options = {
17
+ notification: {
18
+ title: params[:title],
19
+ body: 'Message from server'
20
+ # title: 'Offer from Ajisen Ramen',
21
+ # body: 'Free side order of Gyoza'
22
+ },
23
+ data: {
24
+ channelId: 'default',
25
+ notificationId: 1,
26
+ openUrl: json_ui_garage_url(path: 'home/blank'),
27
+ onOpen: payload
28
+ # openUrl: 'http://10.0.2.2:3000/offers.json?_render=v1',
29
+ }
30
+ }
31
+ response = fcm.send(registration_ids, options)
32
+
33
+ body = JSON.parse(response[:body])
34
+ if (errors = body['results'].map { |i| i['error'] }.compact).any?
35
+ message = errors.join(', ')
36
+ else
37
+ message = 'Sent'
38
+ end
39
+ else
40
+ message = 'FCM gem needed'
41
+ end
42
+ else
43
+ message = 'Env var needed: GCM_SERVER_KEY'
44
+ end
45
+
46
+ json_ui_response json do |action|
47
+ action.snackbars_alert message: message
48
+ end
@@ -1,36 +1,36 @@
1
- json.title 'Notifications'
2
-
3
- page = json_ui_page json
4
- render "#{@path_prefix}/nav_menu", json: json, page: page, top_nav: true
5
-
6
- page.list firstSection: ->(section) do
7
- section.rows builder: ->(template) do
8
- template.thumbnail title: 'Send Desktop Notification', onClick: ->(action) do
9
- action.dialogs_notification title: 'Hello World', message: 'This is a notification', onClick: ->(subaction) do
10
- subaction.dialogs_alert message: 'Perform action'
11
- end
12
- end
13
-
14
- template.thumbnail title: 'Send Android Notification', onClick: ->(action) do
15
- action.auth_saveCsrfToken token: form_authenticity_token, onSave: ->(subaction) do
16
- # subaction.devices_getPushToken paramNameForToken: 'formData[token]', onGet: ->(subsubaction) do
17
- # formData = {
18
- # title: 'Title from formData'
19
- # }
20
- # subsubaction.http_post url: json_ui_garage_url(path: 'notifications/android_post'), formData: formData
21
- # end
22
-
23
- post_url = json_ui_garage_url(path: 'notifications/android_post', title: 'Title from formData')
24
- subaction.devices_getPushToken postUrl: post_url, paramNameForToken: 'token'
25
- end
26
- end
27
-
28
- template.thumbnail title: 'Phoenix WebSocket Real-time Update', onClick: ->(action) do
29
- action.windows_open url: json_ui_garage_url(path: 'notifications/web_socket')
30
- end
31
-
32
- template.thumbnail title: 'ActionCable Real-time Update', onClick: ->(action) do
33
- action.windows_open url: json_ui_garage_url(path: 'notifications/action_cable')
34
- end
35
- end
36
- end
1
+ json.title 'Notifications'
2
+
3
+ page = json_ui_page json
4
+ render "#{@path_prefix}/nav_menu", json: json, page: page, top_nav: true
5
+
6
+ page.list firstSection: ->(section) do
7
+ section.rows builder: ->(template) do
8
+ template.thumbnail title: 'Send Desktop Notification', onClick: ->(action) do
9
+ action.dialogs_notification title: 'Hello World', message: 'This is a notification', onClick: ->(subaction) do
10
+ subaction.dialogs_alert message: 'Perform action'
11
+ end
12
+ end
13
+
14
+ template.thumbnail title: 'Send Android Notification', onClick: ->(action) do
15
+ action.auth_saveCsrfToken token: form_authenticity_token, onSave: ->(subaction) do
16
+ # subaction.devices_getPushToken paramNameForToken: 'formData[token]', onGet: ->(subsubaction) do
17
+ # formData = {
18
+ # title: 'Title from formData'
19
+ # }
20
+ # subsubaction.http_post url: json_ui_garage_url(path: 'notifications/android_post'), formData: formData
21
+ # end
22
+
23
+ post_url = json_ui_garage_url(path: 'notifications/android_post', title: 'Title from formData')
24
+ subaction.devices_getPushToken postUrl: post_url, paramNameForToken: 'token'
25
+ end
26
+ end
27
+
28
+ template.thumbnail title: 'Phoenix WebSocket Real-time Update', onClick: ->(action) do
29
+ action.windows_open url: json_ui_garage_url(path: 'notifications/web_socket')
30
+ end
31
+
32
+ template.thumbnail title: 'ActionCable Real-time Update', onClick: ->(action) do
33
+ action.windows_open url: json_ui_garage_url(path: 'notifications/action_cable')
34
+ end
35
+ end
36
+ end
@@ -1,60 +1,60 @@
1
- json.title 'Forms'
2
-
3
- page = json_ui_page json
4
- render "#{@path_prefix}/nav_menu", json: json, page: page
5
-
6
- json.phoenixSocket({
7
- "socket" => {
8
- "endpoint" => "/socket/websocket",
9
- "params" => {
10
- vsn: '2.0.0',
11
- token: 'TOKEN'
12
- }
13
- },
14
- # "topic" => "room:30",
15
- # "event" => "comments_updated",
16
- "topic" => "links",
17
- "events" => ["new_link_added"],
18
- "header" => {
19
- "user_id" => 2,
20
- "prev_item_id" => nil,
21
- "last_item_id" => nil
22
- }
23
- })
24
-
25
- page.form url: json_ui_garage_url(path: 'forms/basic_post'), method: 'post', padding: glib_json_padding_body, paramNameForFormData: 'formData', onSubmit: ->(action) do
26
- json.action "ws/push"
27
- json.topic "links"
28
- json.event "new_link"
29
- json.payload({
30
- "club_id": "2",
31
- "room_id": "30",
32
- "user_id": "2"
33
- # title: "TITLE",
34
- # url: "URL"
35
- })
36
-
37
- end, childViews: ->(form) do
38
- form.spacer height: 14
39
- form.label text: "Message: #{params[:message]}"
40
- form.spacer height: 14
41
-
42
- form.fields_text name: 'user[name]', width: 'matchParent', label: 'Name'
43
-
44
- # TODO: Change this to radio for selecting alert vs reload response
45
- form.fields_password name: 'user[password]', width: 'matchParent', label: 'Password'
46
-
47
- form.fields_hidden name: 'baseUrl', width: 'matchParent', value: json_ui_garage_url(path: 'notifications/web_socket')
48
-
49
- form.panels_split width: 'matchParent', content: ->(split) do
50
- # split.left childViews: ->(left) do
51
- # if params[:mode] == 'dialog'
52
- # left.button styleClass: 'link', text: 'cancel', onClick: ->(action) { action.dialogs_close }
53
- # end
54
- # end
55
- split.right childViews: ->(right) do
56
- right.button text: 'Submit', onClick: ->(action) { action.forms_submit }
57
- end
58
- end
59
-
60
- end
1
+ json.title 'Forms'
2
+
3
+ page = json_ui_page json
4
+ render "#{@path_prefix}/nav_menu", json: json, page: page
5
+
6
+ json.phoenixSocket({
7
+ "socket" => {
8
+ "endpoint" => "/socket/websocket",
9
+ "params" => {
10
+ vsn: '2.0.0',
11
+ token: 'TOKEN'
12
+ }
13
+ },
14
+ # "topic" => "room:30",
15
+ # "event" => "comments_updated",
16
+ "topic" => "links",
17
+ "events" => ["new_link_added"],
18
+ "header" => {
19
+ "user_id" => 2,
20
+ "prev_item_id" => nil,
21
+ "last_item_id" => nil
22
+ }
23
+ })
24
+
25
+ page.form url: json_ui_garage_url(path: 'forms/basic_post'), method: 'post', padding: glib_json_padding_body, paramNameForFormData: 'formData', onSubmit: ->(action) do
26
+ json.action "ws/push"
27
+ json.topic "links"
28
+ json.event "new_link"
29
+ json.payload({
30
+ "club_id": "2",
31
+ "room_id": "30",
32
+ "user_id": "2"
33
+ # title: "TITLE",
34
+ # url: "URL"
35
+ })
36
+
37
+ end, childViews: ->(form) do
38
+ form.spacer height: 14
39
+ form.label text: "Message: #{params[:message]}"
40
+ form.spacer height: 14
41
+
42
+ form.fields_text name: 'user[name]', width: 'matchParent', label: 'Name'
43
+
44
+ # TODO: Change this to radio for selecting alert vs reload response
45
+ form.fields_password name: 'user[password]', width: 'matchParent', label: 'Password'
46
+
47
+ form.fields_hidden name: 'baseUrl', width: 'matchParent', value: json_ui_garage_url(path: 'notifications/web_socket')
48
+
49
+ form.panels_split width: 'matchParent', content: ->(split) do
50
+ # split.left childViews: ->(left) do
51
+ # if params[:mode] == 'dialog'
52
+ # left.button styleClass: 'link', text: 'cancel', onClick: ->(action) { action.dialogs_close }
53
+ # end
54
+ # end
55
+ split.right childViews: ->(right) do
56
+ right.button text: 'Submit', onClick: ->(action) { action.forms_submit }
57
+ end
58
+ end
59
+
60
+ end