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.
- checksums.yaml +4 -4
- data/app/channels/glib/channel/is_typing_channel.rb +34 -34
- data/app/channels/glib/channel/online_channel.rb +36 -36
- data/app/controllers/concerns/glib/analytics/funnel.rb +61 -61
- data/app/controllers/concerns/glib/auth/policy.rb +149 -149
- data/app/controllers/concerns/glib/json/dynamic_text.rb +126 -126
- data/app/controllers/concerns/glib/json/libs.rb +149 -149
- data/app/controllers/concerns/glib/json/new_dynamic_text.rb +122 -122
- data/app/controllers/concerns/glib/json/transformation.rb +11 -11
- data/app/controllers/concerns/glib/json/traversal.rb +92 -92
- data/app/controllers/concerns/glib/json/ui.rb +88 -88
- data/app/controllers/concerns/glib/json/validation.rb +13 -13
- data/app/controllers/glib/home_controller.rb +54 -54
- data/app/helpers/glib/app_feature_support_helper.rb +16 -16
- data/app/helpers/glib/dynamic_images_helper.rb +55 -55
- data/app/helpers/glib/dynamic_texts_helper.rb +42 -42
- data/app/helpers/glib/enum_helper.rb +18 -18
- data/app/helpers/glib/forms_helper.rb +15 -15
- data/app/helpers/glib/json_ui/abstract_builder.rb +309 -309
- data/app/helpers/glib/json_ui/action_builder/dialogs.rb +58 -58
- data/app/helpers/glib/json_ui/action_builder/http.rb +39 -39
- data/app/helpers/glib/json_ui/action_builder/iap.rb +15 -15
- data/app/helpers/glib/json_ui/action_builder/panels.rb +14 -14
- data/app/helpers/glib/json_ui/action_builder/sheets.rb +15 -15
- data/app/helpers/glib/json_ui/action_builder/snackbars.rb +41 -41
- data/app/helpers/glib/json_ui/action_builder/windows.rb +38 -38
- data/app/helpers/glib/json_ui/action_builder.rb +140 -140
- data/app/helpers/glib/json_ui/analytics_helper.rb +17 -17
- data/app/helpers/glib/json_ui/dynamic_field_builders.rb +25 -25
- data/app/helpers/glib/json_ui/generic_builders.rb +28 -28
- data/app/helpers/glib/json_ui/list_builders.rb +110 -110
- data/app/helpers/glib/json_ui/menu_builder.rb +96 -96
- data/app/helpers/glib/json_ui/page_helper.rb +221 -221
- data/app/helpers/glib/json_ui/response_helper.rb +25 -25
- data/app/helpers/glib/json_ui/styling_helper.rb +55 -55
- data/app/helpers/glib/json_ui/table_builders.rb +74 -74
- data/app/helpers/glib/json_ui/view_builder/banners.rb +26 -26
- data/app/helpers/glib/json_ui/view_builder/charts.rb +49 -49
- data/app/helpers/glib/json_ui/view_builder/fields.rb +296 -296
- data/app/helpers/glib/json_ui/view_builder/iap.rb +11 -11
- data/app/helpers/glib/json_ui/view_builder/panels.rb +262 -262
- data/app/helpers/glib/json_ui/view_builder.rb +256 -253
- data/app/helpers/glib/urls_helper.rb +12 -12
- data/app/models/concerns/glib/soft_deletable.rb +73 -73
- data/app/models/glib/active_storage/attachment.rb +9 -9
- data/app/models/glib/active_storage/blob.rb +9 -9
- data/app/models/glib/application_record.rb +18 -18
- data/app/models/glib/dynamic_text_record.rb +9 -9
- data/app/models/glib/text.rb +95 -95
- data/app/policies/glib/application_policy.rb +191 -191
- data/app/validators/email_typo_validator.rb +38 -38
- data/app/validators/email_validator.rb +7 -7
- data/app/validators/url_validator.rb +20 -20
- data/app/views/json_ui/garage/_nav_menu.json.jbuilder +72 -72
- data/app/views/json_ui/garage/actions/_dialogs.json.jbuilder +104 -104
- data/app/views/json_ui/garage/actions/_http.json.jbuilder +24 -24
- data/app/views/json_ui/garage/actions/_panels.json.jbuilder +18 -18
- data/app/views/json_ui/garage/actions/_reload.json.jbuilder +17 -17
- data/app/views/json_ui/garage/actions/_sheets.json.jbuilder +18 -18
- data/app/views/json_ui/garage/actions/_snackbars.json.jbuilder +33 -33
- data/app/views/json_ui/garage/actions/_timeouts.json.jbuilder +24 -24
- data/app/views/json_ui/garage/actions/_windows.json.jbuilder +24 -24
- data/app/views/json_ui/garage/actions/dialogs_oauth_post.json.jbuilder +6 -6
- data/app/views/json_ui/garage/actions/index.json.jbuilder +24 -24
- data/app/views/json_ui/garage/forms/_alert_post_data.json.jbuilder +10 -10
- data/app/views/json_ui/garage/forms/basic.json.jbuilder +21 -21
- data/app/views/json_ui/garage/forms/basic_post.json.jbuilder +8 -8
- data/app/views/json_ui/garage/forms/checkboxes.json.jbuilder +27 -27
- data/app/views/json_ui/garage/forms/conditional_value.json.jbuilder +38 -38
- data/app/views/json_ui/garage/forms/dynamic_group.json.jbuilder +39 -39
- data/app/views/json_ui/garage/forms/dynamic_select.json.jbuilder +24 -24
- data/app/views/json_ui/garage/forms/dynamic_select_data.json.jbuilder +38 -38
- data/app/views/json_ui/garage/forms/file_upload.json.jbuilder +37 -37
- data/app/views/json_ui/garage/forms/floating_submit.json.jbuilder +19 -19
- data/app/views/json_ui/garage/forms/generic_post.json.jbuilder +3 -3
- data/app/views/json_ui/garage/forms/get_request.json.jbuilder +27 -27
- data/app/views/json_ui/garage/forms/index.json.jbuilder +120 -120
- data/app/views/json_ui/garage/forms/new_rich_text.json.jbuilder +40 -40
- data/app/views/json_ui/garage/forms/online_participant1.json.jbuilder +25 -25
- data/app/views/json_ui/garage/forms/online_participant2.json.jbuilder +25 -25
- data/app/views/json_ui/garage/forms/payments.json.jbuilder +34 -34
- data/app/views/json_ui/garage/forms/pickers.json.jbuilder +89 -89
- data/app/views/json_ui/garage/forms/ratings.json.jbuilder +49 -49
- data/app/views/json_ui/garage/forms/rich_text.json.jbuilder +40 -40
- data/app/views/json_ui/garage/forms/selects.json.jbuilder +91 -91
- data/app/views/json_ui/garage/forms/show_hide.json.jbuilder +150 -150
- data/app/views/json_ui/garage/forms/styled_boxes.json.jbuilder +35 -35
- data/app/views/json_ui/garage/forms/submission_flow.json.jbuilder +17 -17
- data/app/views/json_ui/garage/forms/submission_flow_post.json.jbuilder +26 -26
- data/app/views/json_ui/garage/forms/submission_indicator.json.jbuilder +63 -63
- data/app/views/json_ui/garage/forms/submission_indicator_post.json.jbuilder +25 -25
- data/app/views/json_ui/garage/forms/submit_on_change.json.jbuilder +28 -28
- data/app/views/json_ui/garage/forms/text_validation.json.jbuilder +65 -65
- data/app/views/json_ui/garage/forms/timers.json.jbuilder +120 -120
- data/app/views/json_ui/garage/home/blank.json.jbuilder +10 -10
- data/app/views/json_ui/garage/home/index.json.jbuilder +36 -36
- data/app/views/json_ui/garage/home/slow.json.jbuilder +11 -11
- data/app/views/json_ui/garage/lists/_autoload_section.json.jbuilder +30 -30
- data/app/views/json_ui/garage/lists/autoload_all.json.jbuilder +32 -32
- data/app/views/json_ui/garage/lists/autoload_as_needed.json.jbuilder +35 -35
- data/app/views/json_ui/garage/lists/autoload_as_needed_responsive_columns.json.jbuilder +27 -27
- data/app/views/json_ui/garage/lists/chat_ui.json.jbuilder +94 -94
- data/app/views/json_ui/garage/lists/edit_actions.json.jbuilder +62 -62
- data/app/views/json_ui/garage/lists/fab.json.jbuilder +12 -12
- data/app/views/json_ui/garage/lists/index.json.jbuilder +41 -41
- data/app/views/json_ui/garage/lists/reordering.json.jbuilder +34 -34
- data/app/views/json_ui/garage/lists/templating.json.jbuilder +35 -35
- data/app/views/json_ui/garage/notifications/action_cable.json.jbuilder +114 -114
- data/app/views/json_ui/garage/notifications/android_post.json.jbuilder +48 -48
- data/app/views/json_ui/garage/notifications/index.json.jbuilder +36 -36
- data/app/views/json_ui/garage/notifications/web_socket.json.jbuilder +60 -60
- data/app/views/json_ui/garage/pages/flat_centered.json.jbuilder +29 -29
- data/app/views/json_ui/garage/pages/full_width.json.jbuilder +29 -29
- data/app/views/json_ui/garage/pages/full_width_height.json.jbuilder +16 -16
- data/app/views/json_ui/garage/pages/index.json.jbuilder +62 -62
- data/app/views/json_ui/garage/pages/layout.json.jbuilder +18 -18
- data/app/views/json_ui/garage/pages/lifecycle_hooks.json.jbuilder +13 -13
- data/app/views/json_ui/garage/pages/loading_indicator.json.jbuilder +10 -10
- data/app/views/json_ui/garage/pages/nav_buttons.json.jbuilder +21 -21
- data/app/views/json_ui/garage/pages/nested_scroll.json.jbuilder +40 -40
- data/app/views/json_ui/garage/pages/tab_bar.json.jbuilder +92 -92
- data/app/views/json_ui/garage/panels/_styled.json.jbuilder +78 -78
- data/app/views/json_ui/garage/panels/card.json.jbuilder +4 -4
- data/app/views/json_ui/garage/panels/carousel.json.jbuilder +38 -38
- data/app/views/json_ui/garage/panels/custom.json.jbuilder +17 -17
- data/app/views/json_ui/garage/panels/flow.json.jbuilder +59 -59
- data/app/views/json_ui/garage/panels/horizontal.json.jbuilder +101 -101
- data/app/views/json_ui/garage/panels/index.json.jbuilder +138 -138
- data/app/views/json_ui/garage/panels/outlined.json.jbuilder +4 -4
- data/app/views/json_ui/garage/panels/responsive.json.jbuilder +98 -98
- data/app/views/json_ui/garage/panels/split.json.jbuilder +182 -182
- data/app/views/json_ui/garage/panels/ul.json.jbuilder +33 -33
- data/app/views/json_ui/garage/panels/vertical.json.jbuilder +55 -55
- data/app/views/json_ui/garage/panels/web.json.jbuilder +15 -15
- data/app/views/json_ui/garage/services/dynamic_text.json.jbuilder +13 -13
- data/app/views/json_ui/garage/services/image.json.jbuilder +47 -47
- data/app/views/json_ui/garage/services/index.json.jbuilder +17 -17
- data/app/views/json_ui/garage/tables/_autoload_section.json.jbuilder +16 -16
- data/app/views/json_ui/garage/tables/autoload_all.json.jbuilder +43 -43
- data/app/views/json_ui/garage/tables/autoload_as_needed.json.jbuilder +50 -50
- data/app/views/json_ui/garage/tables/export_import.json.jbuilder +29 -29
- data/app/views/json_ui/garage/tables/horizontal_scroll.json.jbuilder +26 -26
- data/app/views/json_ui/garage/tables/index.json.jbuilder +25 -25
- data/app/views/json_ui/garage/tables/layout.json.jbuilder +40 -40
- data/app/views/json_ui/garage/views/_chart_data.json.jbuilder +17 -17
- data/app/views/json_ui/garage/views/banners.json.jbuilder +67 -67
- data/app/views/json_ui/garage/views/calendar_data.json.jbuilder +30 -30
- data/app/views/json_ui/garage/views/charts.json.jbuilder +125 -125
- data/app/views/json_ui/garage/views/controls.json.jbuilder +60 -60
- data/app/views/json_ui/garage/views/iap.json.jbuilder +21 -21
- data/app/views/json_ui/garage/views/icon_names.json.jbuilder +1450 -1450
- data/app/views/json_ui/garage/views/icons.json.jbuilder +15 -15
- data/app/views/json_ui/garage/views/images.json.jbuilder +89 -89
- data/app/views/json_ui/garage/views/index.json.jbuilder +83 -83
- data/app/views/json_ui/garage/views/links.json.jbuilder +70 -70
- data/app/views/json_ui/garage/views/map_cluster_data.json.jbuilder +41 -41
- data/app/views/json_ui/garage/views/map_data.json.jbuilder +51 -51
- data/app/views/json_ui/garage/views/maps.json.jbuilder +31 -31
- data/app/views/json_ui/garage/views/markdowns.json.jbuilder +41 -41
- data/app/views/json_ui/garage/views/misc.json.jbuilder +34 -34
- data/app/views/json_ui/garage/views/progress.json.jbuilder +31 -31
- data/app/views/json_ui/garage/views/texts.json.jbuilder +35 -35
- data/app/views/layouts/json_ui/renderer.html.erb +35 -35
- data/config/routes.rb +7 -7
- data/lib/generators/glib/install_generator.rb +24 -24
- data/lib/generators/templates/20191017062519_create_texts.rb +12 -12
- data/lib/generators/templates/20191024063257_add_scope_to_texts.rb +7 -7
- data/lib/generators/templates/20191112095018_add_lang_to_texts.rb +7 -7
- data/lib/generators/templates/20191126071051_create_active_storage_tables.active_storage.rb +27 -27
- data/lib/generators/templates/database.yml +107 -107
- data/lib/generators/templates/dynamic_text.rb +2 -2
- data/lib/glib/crypt/utils.rb +26 -26
- data/lib/glib/dynamic_text/config.rb +21 -21
- data/lib/glib/engine.rb +7 -7
- data/lib/glib/json_crawler/action_crawler.rb +23 -23
- data/lib/glib/json_crawler/action_crawlers/action_http.rb +11 -11
- data/lib/glib/json_crawler/action_crawlers/forms_submit.rb +48 -48
- data/lib/glib/json_crawler/action_crawlers/menu.rb +12 -12
- data/lib/glib/json_crawler/action_crawlers/nav_initiate.rb +19 -19
- data/lib/glib/json_crawler/action_crawlers/run_multiple.rb +13 -13
- data/lib/glib/json_crawler/action_crawlers/windows_open.rb +33 -33
- data/lib/glib/json_crawler/coverage.rb +20 -20
- data/lib/glib/json_crawler/http.rb +120 -120
- data/lib/glib/json_crawler/router.rb +90 -90
- data/lib/glib/json_crawler.rb +11 -11
- data/lib/glib/mailer_tester.rb +36 -36
- data/lib/glib/test_helpers.rb +52 -52
- data/lib/glib/value.rb +7 -7
- data/lib/glib/version.rb +5 -5
- data/lib/glib-web.rb +9 -9
- data/lib/tasks/db.rake +95 -95
- metadata +2 -3
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
json.title 'Lists'
|
|
2
|
-
|
|
3
|
-
page_index = params[:page].to_i
|
|
4
|
-
if page_index > 2
|
|
5
|
-
page_index = 2
|
|
6
|
-
end
|
|
7
|
-
page = json_ui_page json
|
|
8
|
-
render "#{@path_prefix}/nav_menu", json: json, page: page
|
|
9
|
-
|
|
10
|
-
page.list firstSection: ->(section) do
|
|
11
|
-
section.rows builder: ->(template) do
|
|
12
|
-
template.thumbnail \
|
|
13
|
-
title: 'Click menu (web) or swipe left (Android/iOS)',
|
|
14
|
-
subtitle: "Page index: #{page_index}",
|
|
15
|
-
leftButtons: ->(menu) do
|
|
16
|
-
menu.button styleClass: 'icon', icon: 'check_box', onClick: ->(subaction) do
|
|
17
|
-
subaction.dialogs_alert message: 'Tick/untick'
|
|
18
|
-
end
|
|
19
|
-
end, rightButtons: ->(menu) do
|
|
20
|
-
menu.button styleClass: 'icon', icon: 'share', onClick: ->(subaction) do
|
|
21
|
-
subaction.dialogs_alert message: 'Share'
|
|
22
|
-
end
|
|
23
|
-
menu.button styleClass: 'icon', icon: 'open_in_new', onClick: ->(subaction) do
|
|
24
|
-
subaction.dialogs_alert message: 'Open'
|
|
25
|
-
end
|
|
26
|
-
end, editButtons: ->(menu) do
|
|
27
|
-
menu.button text: "Edit (ID: #{page_index})", onClick: ->(action) do
|
|
28
|
-
action.dialogs_alert message: 'Perform Edit action'
|
|
29
|
-
end
|
|
30
|
-
menu.button text: 'Delete', onClick: ->(action) do
|
|
31
|
-
action.dialogs_alert message: 'Perform Delete action'
|
|
32
|
-
end
|
|
33
|
-
end, onClick: ->(action) do
|
|
34
|
-
action.windows_open url: json_ui_garage_url(path: 'lists/edit_actions', page: page_index + 1)
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
template.thumbnail title: 'Long press to get an alert', onLongPress: ->(action) do
|
|
38
|
-
action.dialogs_alert message: 'This is an alert'
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
template.thumbnail title: 'Long press to see menu', onLongPress: ->(action) do
|
|
42
|
-
action.sheets_select message: 'Context Menu', buttons: ->(menu) do
|
|
43
|
-
menu.button icon: 'edit', text: 'Edit', onClick: ->(subaction) do
|
|
44
|
-
subaction.dialogs_alert message: 'Perform action'
|
|
45
|
-
end
|
|
46
|
-
menu.button icon: 'delete', text: 'Delete', onClick: ->(subaction) do
|
|
47
|
-
subaction.dialogs_alert message: 'Perform action'
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# template.thumbnail title: 'Long press to see menu', contextButtons: ->(menu) do
|
|
53
|
-
# menu.button text: 'Edit', onClick: ->(action) do
|
|
54
|
-
# action.dialogs_alert message: 'Perform action'
|
|
55
|
-
# end
|
|
56
|
-
# menu.button text: 'Delete', onClick: ->(action) do
|
|
57
|
-
# action.dialogs_alert message: 'Perform action'
|
|
58
|
-
# end
|
|
59
|
-
# end
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
end
|
|
1
|
+
json.title 'Lists'
|
|
2
|
+
|
|
3
|
+
page_index = params[:page].to_i
|
|
4
|
+
if page_index > 2
|
|
5
|
+
page_index = 2
|
|
6
|
+
end
|
|
7
|
+
page = json_ui_page json
|
|
8
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page
|
|
9
|
+
|
|
10
|
+
page.list firstSection: ->(section) do
|
|
11
|
+
section.rows builder: ->(template) do
|
|
12
|
+
template.thumbnail \
|
|
13
|
+
title: 'Click menu (web) or swipe left (Android/iOS)',
|
|
14
|
+
subtitle: "Page index: #{page_index}",
|
|
15
|
+
leftButtons: ->(menu) do
|
|
16
|
+
menu.button styleClass: 'icon', icon: 'check_box', onClick: ->(subaction) do
|
|
17
|
+
subaction.dialogs_alert message: 'Tick/untick'
|
|
18
|
+
end
|
|
19
|
+
end, rightButtons: ->(menu) do
|
|
20
|
+
menu.button styleClass: 'icon', icon: 'share', onClick: ->(subaction) do
|
|
21
|
+
subaction.dialogs_alert message: 'Share'
|
|
22
|
+
end
|
|
23
|
+
menu.button styleClass: 'icon', icon: 'open_in_new', onClick: ->(subaction) do
|
|
24
|
+
subaction.dialogs_alert message: 'Open'
|
|
25
|
+
end
|
|
26
|
+
end, editButtons: ->(menu) do
|
|
27
|
+
menu.button text: "Edit (ID: #{page_index})", onClick: ->(action) do
|
|
28
|
+
action.dialogs_alert message: 'Perform Edit action'
|
|
29
|
+
end
|
|
30
|
+
menu.button text: 'Delete', onClick: ->(action) do
|
|
31
|
+
action.dialogs_alert message: 'Perform Delete action'
|
|
32
|
+
end
|
|
33
|
+
end, onClick: ->(action) do
|
|
34
|
+
action.windows_open url: json_ui_garage_url(path: 'lists/edit_actions', page: page_index + 1)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
template.thumbnail title: 'Long press to get an alert', onLongPress: ->(action) do
|
|
38
|
+
action.dialogs_alert message: 'This is an alert'
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
template.thumbnail title: 'Long press to see menu', onLongPress: ->(action) do
|
|
42
|
+
action.sheets_select message: 'Context Menu', buttons: ->(menu) do
|
|
43
|
+
menu.button icon: 'edit', text: 'Edit', onClick: ->(subaction) do
|
|
44
|
+
subaction.dialogs_alert message: 'Perform action'
|
|
45
|
+
end
|
|
46
|
+
menu.button icon: 'delete', text: 'Delete', onClick: ->(subaction) do
|
|
47
|
+
subaction.dialogs_alert message: 'Perform action'
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# template.thumbnail title: 'Long press to see menu', contextButtons: ->(menu) do
|
|
53
|
+
# menu.button text: 'Edit', onClick: ->(action) do
|
|
54
|
+
# action.dialogs_alert message: 'Perform action'
|
|
55
|
+
# end
|
|
56
|
+
# menu.button text: 'Delete', onClick: ->(action) do
|
|
57
|
+
# action.dialogs_alert message: 'Perform action'
|
|
58
|
+
# end
|
|
59
|
+
# end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
json.title 'Lists'
|
|
2
|
-
|
|
3
|
-
page = json_ui_page json
|
|
4
|
-
render "#{@path_prefix}/nav_menu", json: json, page: page
|
|
5
|
-
|
|
6
|
-
page.body childViews: ->(body) do
|
|
7
|
-
body.fab icon: 'add', onClick: ->(action) { action.dialogs_alert message: 'Perform action' }
|
|
8
|
-
|
|
9
|
-
body.panels_list width: 'matchParent', firstSection: ->(section) do
|
|
10
|
-
render 'json_ui/garage/lists/autoload_section', page: page, page_index: 0
|
|
11
|
-
end
|
|
12
|
-
end
|
|
1
|
+
json.title 'Lists'
|
|
2
|
+
|
|
3
|
+
page = json_ui_page json
|
|
4
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page
|
|
5
|
+
|
|
6
|
+
page.body childViews: ->(body) do
|
|
7
|
+
body.fab icon: 'add', onClick: ->(action) { action.dialogs_alert message: 'Perform action' }
|
|
8
|
+
|
|
9
|
+
body.panels_list width: 'matchParent', firstSection: ->(section) do
|
|
10
|
+
render 'json_ui/garage/lists/autoload_section', page: page, page_index: 0
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
json.title 'Lists'
|
|
2
|
-
|
|
3
|
-
json_ui_page json do |page|
|
|
4
|
-
render "#{@path_prefix}/nav_menu", json: json, page: page, top_nav: true
|
|
5
|
-
|
|
6
|
-
page.list firstSection: ->(section) do
|
|
7
|
-
section.header padding: glib_json_padding_list, childViews: ->(header) do
|
|
8
|
-
header.label text: 'The List panel is useful for displaying a large number of items that are uniform, which is especially important in mobile apps because the rows can be reused for efficiency.'
|
|
9
|
-
header.spacer height: 6
|
|
10
|
-
header.label text: 'So, following the mobile-first paradigm, do not ever display large numbers of items using other components.'
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
section.rows builder: ->(template) do
|
|
14
|
-
template.thumbnail icon: 'list', title: 'Templating', onClick: ->(action) do
|
|
15
|
-
action.windows_open url: json_ui_garage_url(path: 'lists/templating')
|
|
16
|
-
end
|
|
17
|
-
template.thumbnail title: 'Action Buttons', onClick: ->(action) do
|
|
18
|
-
action.windows_open url: json_ui_garage_url(path: 'lists/edit_actions')
|
|
19
|
-
end
|
|
20
|
-
template.thumbnail title: 'FAB (Floating Action Button)', onClick: ->(action) do
|
|
21
|
-
action.windows_open url: json_ui_garage_url(path: 'lists/fab')
|
|
22
|
-
end
|
|
23
|
-
template.thumbnail title: 'Chat UI', onClick: ->(action) do
|
|
24
|
-
action.windows_open url: json_ui_garage_url(path: 'lists/chat_ui')
|
|
25
|
-
end
|
|
26
|
-
template.thumbnail title: 'Autoload as Needed', onClick: ->(action) do
|
|
27
|
-
action.windows_open url: json_ui_garage_url(path: 'lists/autoload_as_needed')
|
|
28
|
-
end
|
|
29
|
-
template.thumbnail title: 'Autoload All', onClick: ->(action) do
|
|
30
|
-
action.windows_open url: json_ui_garage_url(path: 'lists/autoload_all')
|
|
31
|
-
end
|
|
32
|
-
template.thumbnail title: 'Autoload as Needed with Responsive Columns', onClick: ->(action) do
|
|
33
|
-
action.windows_open url: json_ui_garage_url(path: 'lists/autoload_as_needed_responsive_columns')
|
|
34
|
-
end
|
|
35
|
-
template.thumbnail title: 'Reordering', onClick: ->(action) do
|
|
36
|
-
action.windows_open url: json_ui_garage_url(path: 'lists/reordering')
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
end
|
|
41
|
-
end
|
|
1
|
+
json.title 'Lists'
|
|
2
|
+
|
|
3
|
+
json_ui_page json do |page|
|
|
4
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page, top_nav: true
|
|
5
|
+
|
|
6
|
+
page.list firstSection: ->(section) do
|
|
7
|
+
section.header padding: glib_json_padding_list, childViews: ->(header) do
|
|
8
|
+
header.label text: 'The List panel is useful for displaying a large number of items that are uniform, which is especially important in mobile apps because the rows can be reused for efficiency.'
|
|
9
|
+
header.spacer height: 6
|
|
10
|
+
header.label text: 'So, following the mobile-first paradigm, do not ever display large numbers of items using other components.'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
section.rows builder: ->(template) do
|
|
14
|
+
template.thumbnail icon: 'list', title: 'Templating', onClick: ->(action) do
|
|
15
|
+
action.windows_open url: json_ui_garage_url(path: 'lists/templating')
|
|
16
|
+
end
|
|
17
|
+
template.thumbnail title: 'Action Buttons', onClick: ->(action) do
|
|
18
|
+
action.windows_open url: json_ui_garage_url(path: 'lists/edit_actions')
|
|
19
|
+
end
|
|
20
|
+
template.thumbnail title: 'FAB (Floating Action Button)', onClick: ->(action) do
|
|
21
|
+
action.windows_open url: json_ui_garage_url(path: 'lists/fab')
|
|
22
|
+
end
|
|
23
|
+
template.thumbnail title: 'Chat UI', onClick: ->(action) do
|
|
24
|
+
action.windows_open url: json_ui_garage_url(path: 'lists/chat_ui')
|
|
25
|
+
end
|
|
26
|
+
template.thumbnail title: 'Autoload as Needed', onClick: ->(action) do
|
|
27
|
+
action.windows_open url: json_ui_garage_url(path: 'lists/autoload_as_needed')
|
|
28
|
+
end
|
|
29
|
+
template.thumbnail title: 'Autoload All', onClick: ->(action) do
|
|
30
|
+
action.windows_open url: json_ui_garage_url(path: 'lists/autoload_all')
|
|
31
|
+
end
|
|
32
|
+
template.thumbnail title: 'Autoload as Needed with Responsive Columns', onClick: ->(action) do
|
|
33
|
+
action.windows_open url: json_ui_garage_url(path: 'lists/autoload_as_needed_responsive_columns')
|
|
34
|
+
end
|
|
35
|
+
template.thumbnail title: 'Reordering', onClick: ->(action) do
|
|
36
|
+
action.windows_open url: json_ui_garage_url(path: 'lists/reordering')
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -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
|