glib-web 0.5.71 → 0.5.72
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 +148 -148
- 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 -8
- 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.rb +140 -140
- 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/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 +33 -33
- 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 +94 -94
- 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/split_builders.rb +32 -32
- 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.rb +240 -240
- data/app/helpers/glib/json_ui/view_builder/banners.rb +26 -26
- data/app/helpers/glib/json_ui/view_builder/charts.rb +33 -33
- data/app/helpers/glib/json_ui/view_builder/fields.rb +278 -279
- data/app/helpers/glib/json_ui/view_builder/panels.rb +256 -256
- data/app/helpers/glib/urls_helper.rb +12 -12
- 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 +161 -161
- 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 +70 -70
- 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 +6 -6
- 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 +43 -43
- data/app/views/json_ui/garage/forms/conditional_value.json.jbuilder +36 -36
- 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 -22
- 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 +32 -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 +113 -113
- data/app/views/json_ui/garage/forms/new_rich_text.json.jbuilder +39 -39
- 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/pickers.json.jbuilder +81 -81
- 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 -84
- data/app/views/json_ui/garage/forms/show_hide.json.jbuilder +130 -130
- 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/text_validation.json.jbuilder +81 -81
- 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 +28 -28
- 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/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 +38 -38
- 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 +31 -31
- 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 +37 -37
- 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 +91 -91
- data/app/views/json_ui/garage/panels/index.json.jbuilder +138 -134
- 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 -0
- 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 +63 -63
- data/app/views/json_ui/garage/views/calendar_data.json.jbuilder +30 -30
- data/app/views/json_ui/garage/views/charts.json.jbuilder +115 -115
- data/app/views/json_ui/garage/views/controls.json.jbuilder +37 -37
- data/app/views/json_ui/garage/views/icon_names.json.jbuilder +1450 -1450
- data/app/views/json_ui/garage/views/icons.json.jbuilder +15 -14
- data/app/views/json_ui/garage/views/images.json.jbuilder +89 -89
- data/app/views/json_ui/garage/views/index.json.jbuilder +67 -67
- 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/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-web.rb +9 -9
- 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.rb +11 -11
- 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 +98 -98
- 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/tasks/db.rake +95 -95
- metadata +3 -3
|
@@ -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
|
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
module Glib
|
|
2
|
-
class HomeController < ApplicationController
|
|
3
|
-
if try(:glib_auth_inited?)
|
|
4
|
-
skip_before_action :glib_load_resource
|
|
5
|
-
skip_before_action :glib_authorize_resource
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
def json_ui_garage
|
|
9
|
-
init_orders
|
|
10
|
-
|
|
11
|
-
@path_prefix = 'json_ui/garage'
|
|
12
|
-
|
|
13
|
-
# We can't use prepend_view_path because it affects the app, not the gem
|
|
14
|
-
path = "#{@path_prefix}/#{params[:path] || 'home/index'}"
|
|
15
|
-
render path
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def init_orders
|
|
19
|
-
@order_headings = {}
|
|
20
|
-
@orders = params[:orders] || []
|
|
21
|
-
@orders.each do |order|
|
|
22
|
-
prop_name, direction = order.split('-')
|
|
23
|
-
index_order(prop_name, direction)
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def index_order(prop_name, direction)
|
|
28
|
-
# In a real app, apply ordering to the model. For example:
|
|
29
|
-
# @users = @users.order(prop_name => direction)
|
|
30
|
-
|
|
31
|
-
# Garage example
|
|
32
|
-
@order_headings[prop_name] = direction
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def reversed_order(order)
|
|
36
|
-
order.to_sym == :asc ? :desc : :asc
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def reversed_order_params(prop_name)
|
|
40
|
-
prop_value = :asc
|
|
41
|
-
remaining = @orders.reject do |o|
|
|
42
|
-
tuple = o.split('-')
|
|
43
|
-
if tuple.first == prop_name.to_s
|
|
44
|
-
prop_value = reversed_order(tuple.second)
|
|
45
|
-
true
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
# Sort the params to produce predictable URLs which are useful for SEO
|
|
49
|
-
(["#{prop_name}-#{prop_value}"] + remaining).sort
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
helper_method :reversed_order_params
|
|
53
|
-
end
|
|
54
|
-
end
|
|
1
|
+
module Glib
|
|
2
|
+
class HomeController < ApplicationController
|
|
3
|
+
if try(:glib_auth_inited?)
|
|
4
|
+
skip_before_action :glib_load_resource
|
|
5
|
+
skip_before_action :glib_authorize_resource
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def json_ui_garage
|
|
9
|
+
init_orders
|
|
10
|
+
|
|
11
|
+
@path_prefix = 'json_ui/garage'
|
|
12
|
+
|
|
13
|
+
# We can't use prepend_view_path because it affects the app, not the gem
|
|
14
|
+
path = "#{@path_prefix}/#{params[:path] || 'home/index'}"
|
|
15
|
+
render path
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def init_orders
|
|
19
|
+
@order_headings = {}
|
|
20
|
+
@orders = params[:orders] || []
|
|
21
|
+
@orders.each do |order|
|
|
22
|
+
prop_name, direction = order.split('-')
|
|
23
|
+
index_order(prop_name, direction)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def index_order(prop_name, direction)
|
|
28
|
+
# In a real app, apply ordering to the model. For example:
|
|
29
|
+
# @users = @users.order(prop_name => direction)
|
|
30
|
+
|
|
31
|
+
# Garage example
|
|
32
|
+
@order_headings[prop_name] = direction
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def reversed_order(order)
|
|
36
|
+
order.to_sym == :asc ? :desc : :asc
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def reversed_order_params(prop_name)
|
|
40
|
+
prop_value = :asc
|
|
41
|
+
remaining = @orders.reject do |o|
|
|
42
|
+
tuple = o.split('-')
|
|
43
|
+
if tuple.first == prop_name.to_s
|
|
44
|
+
prop_value = reversed_order(tuple.second)
|
|
45
|
+
true
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
# Sort the params to produce predictable URLs which are useful for SEO
|
|
49
|
+
(["#{prop_name}-#{prop_value}"] + remaining).sort
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
helper_method :reversed_order_params
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
module Glib
|
|
2
|
-
module AppFeatureSupportHelper
|
|
3
|
-
def glib_app_feature_supported?(name, app_version, dictionary)
|
|
4
|
-
device = (app_device_os || :default).to_sym
|
|
5
|
-
|
|
6
|
-
version = dictionary[name.to_sym].try(:[], device)
|
|
7
|
-
except = dictionary[name.to_sym].try(:[], :except).try(:[], device)
|
|
8
|
-
|
|
9
|
-
!version.nil? && (version == :all || glib_app_version_gte(version, app_version)) && (except.nil? || except.to_s != app_version)
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def glib_app_version_gte(feature_version, app_version)
|
|
13
|
-
app_version.blank? || Gem::Version.new(app_version) >= Gem::Version.new(feature_version)
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
1
|
+
module Glib
|
|
2
|
+
module AppFeatureSupportHelper
|
|
3
|
+
def glib_app_feature_supported?(name, app_version, dictionary)
|
|
4
|
+
device = (app_device_os || :default).to_sym
|
|
5
|
+
|
|
6
|
+
version = dictionary[name.to_sym].try(:[], device)
|
|
7
|
+
except = dictionary[name.to_sym].try(:[], :except).try(:[], device)
|
|
8
|
+
|
|
9
|
+
!version.nil? && (version == :all || glib_app_version_gte(version, app_version)) && (except.nil? || except.to_s != app_version)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def glib_app_version_gte(feature_version, app_version)
|
|
13
|
+
app_version.blank? || Gem::Version.new(app_version) >= Gem::Version.new(feature_version)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
module Glib
|
|
2
|
-
module DynamicImagesHelper
|
|
3
|
-
# NOTE: The bucket should probably be set as a parameter for json_libs
|
|
4
|
-
def glib_dynamic_image_url(blob_key, width: 100, height: 100, fit: 'clip', bucket: Rails.application.config.try(:aws_s3_bucket), signature_key: nil)
|
|
5
|
-
return unless blob_key.present?
|
|
6
|
-
|
|
7
|
-
full_params_hash = {
|
|
8
|
-
bucket_name: bucket,
|
|
9
|
-
blob_key: blob_key,
|
|
10
|
-
w: width,
|
|
11
|
-
h: height,
|
|
12
|
-
fit: fit,
|
|
13
|
-
# expires: 1.hours.from_now.to_i
|
|
14
|
-
expires: 1.month.from_now.end_of_month.to_i
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
request_params_hash = full_params_hash.except(:bucket_name, :blob_key)
|
|
18
|
-
|
|
19
|
-
if (private_key = signature_key)
|
|
20
|
-
encryption_service = EncryptionService.new(bucket, private_key)
|
|
21
|
-
# This produces different signature every time.
|
|
22
|
-
# TODO: Use digest instead, because we really only need to verify. We don't need to be able to decrypt.
|
|
23
|
-
signature = encryption_service.encrypt(full_params_hash)
|
|
24
|
-
request_params_hash = request_params_hash.merge(signature: signature)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
uri = URI::HTTPS.build(
|
|
28
|
-
host: 'imageserver-demo.herokuapp.com',
|
|
29
|
-
path: "/image/#{bucket}/#{blob_key}",
|
|
30
|
-
query: request_params_hash.to_param
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
uri.to_s
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
EncryptionService = Struct.new(:salt, :private_key) do
|
|
37
|
-
def encrypt(value)
|
|
38
|
-
encryptor.encrypt_and_sign(value)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def decrypt(value)
|
|
42
|
-
encryptor.decrypt_and_verify(value)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
private
|
|
46
|
-
def encryptor
|
|
47
|
-
@encryptor ||= begin
|
|
48
|
-
key_len = ActiveSupport::MessageEncryptor.key_len
|
|
49
|
-
key = ActiveSupport::KeyGenerator.new(private_key).generate_key(salt, key_len)
|
|
50
|
-
ActiveSupport::MessageEncryptor.new(key)
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
1
|
+
module Glib
|
|
2
|
+
module DynamicImagesHelper
|
|
3
|
+
# NOTE: The bucket should probably be set as a parameter for json_libs
|
|
4
|
+
def glib_dynamic_image_url(blob_key, width: 100, height: 100, fit: 'clip', bucket: Rails.application.config.try(:aws_s3_bucket), signature_key: nil)
|
|
5
|
+
return unless blob_key.present?
|
|
6
|
+
|
|
7
|
+
full_params_hash = {
|
|
8
|
+
bucket_name: bucket,
|
|
9
|
+
blob_key: blob_key,
|
|
10
|
+
w: width,
|
|
11
|
+
h: height,
|
|
12
|
+
fit: fit,
|
|
13
|
+
# expires: 1.hours.from_now.to_i
|
|
14
|
+
expires: 1.month.from_now.end_of_month.to_i
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
request_params_hash = full_params_hash.except(:bucket_name, :blob_key)
|
|
18
|
+
|
|
19
|
+
if (private_key = signature_key)
|
|
20
|
+
encryption_service = EncryptionService.new(bucket, private_key)
|
|
21
|
+
# This produces different signature every time.
|
|
22
|
+
# TODO: Use digest instead, because we really only need to verify. We don't need to be able to decrypt.
|
|
23
|
+
signature = encryption_service.encrypt(full_params_hash)
|
|
24
|
+
request_params_hash = request_params_hash.merge(signature: signature)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
uri = URI::HTTPS.build(
|
|
28
|
+
host: 'imageserver-demo.herokuapp.com',
|
|
29
|
+
path: "/image/#{bucket}/#{blob_key}",
|
|
30
|
+
query: request_params_hash.to_param
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
uri.to_s
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
EncryptionService = Struct.new(:salt, :private_key) do
|
|
37
|
+
def encrypt(value)
|
|
38
|
+
encryptor.encrypt_and_sign(value)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def decrypt(value)
|
|
42
|
+
encryptor.decrypt_and_verify(value)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
def encryptor
|
|
47
|
+
@encryptor ||= begin
|
|
48
|
+
key_len = ActiveSupport::MessageEncryptor.key_len
|
|
49
|
+
key = ActiveSupport::KeyGenerator.new(private_key).generate_key(salt, key_len)
|
|
50
|
+
ActiveSupport::MessageEncryptor.new(key)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|