glib-web 0.5.5 → 0.5.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/concerns/glib/json/ui.rb +7 -0
- data/app/helpers/glib/json_ui/abstract_builder.rb +9 -3
- data/app/helpers/glib/json_ui/action_builder.rb +36 -6
- data/app/helpers/glib/json_ui/action_builder/windows.rb +1 -0
- data/app/helpers/glib/json_ui/page_helper.rb +13 -5
- data/app/helpers/glib/json_ui/response_helper.rb +1 -1
- data/app/helpers/glib/json_ui/styling_helper.rb +22 -0
- data/app/helpers/glib/json_ui/view_builder.rb +16 -16
- data/app/helpers/glib/json_ui/view_builder/fields.rb +7 -2
- data/app/helpers/glib/urls_helper.rb +7 -0
- data/app/policies/glib/application_policy.rb +27 -30
- data/app/views/json_ui/garage/actions/index.json.jbuilder +2 -2
- data/app/views/json_ui/garage/forms/show_hide.json.jbuilder +20 -3
- data/app/views/json_ui/garage/forms/styled_boxes.json.jbuilder +4 -1
- data/app/views/json_ui/garage/forms/text_validation.json.jbuilder +1 -1
- data/app/views/json_ui/garage/pages/index.json.jbuilder +11 -0
- data/app/views/json_ui/garage/pages/layout.json.jbuilder +12 -13
- data/app/views/json_ui/garage/pages/nav_buttons.json.jbuilder +28 -16
- data/app/views/json_ui/garage/pages/nested_scroll.json.jbuilder +40 -0
- data/app/views/json_ui/garage/panels/carousel.json.jbuilder +24 -3
- data/app/views/json_ui/garage/tables/_autoload_section.json.jbuilder +1 -2
- data/app/views/json_ui/garage/tables/autoload_as_needed.json.jbuilder +19 -19
- data/app/views/json_ui/garage/views/icons.json.jbuilder +22 -0
- data/app/views/json_ui/garage/views/images.json.jbuilder +4 -4
- data/app/views/json_ui/garage/views/index.json.jbuilder +3 -3
- data/lib/glib/json_crawler.rb +1 -0
- data/lib/glib/json_crawler/action_crawler.rb +4 -1
- data/lib/glib/json_crawler/action_crawlers/action_http.rb +2 -5
- data/lib/glib/json_crawler/action_crawlers/forms_submit.rb +2 -2
- data/lib/glib/json_crawler/action_crawlers/nav_initiate.rb +2 -0
- data/lib/glib/json_crawler/action_crawlers/run_multiple.rb +13 -0
- data/lib/glib/json_crawler/action_crawlers/windows_open.rb +3 -0
- data/lib/glib/json_crawler/router.rb +35 -29
- data/lib/glib/test_helpers.rb +4 -4
- metadata +5 -2
- data/app/views/json_ui/garage/views/carousels.json.jbuilder +0 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 811686b2291bc31023b9d5980a6cb54cc2a97a26
|
4
|
+
data.tar.gz: 8f6ed8e3d277ca3c29190bcfe07d99c687c9e90c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 79af3fc3c2d8bb48ce3913735bcaac0722a515a588cba5373c80dd41f9cdef0963fcf64f58c28c84ccd81c0fe0e158d83c4476dec7b9b9bc7703952770b8cb26
|
7
|
+
data.tar.gz: 9738ce65f40301d15622da0617cb94795fdf90ceacb1e32066cfaa372ba7f7b1b45eb1e7b1494c6a25d2d68b43637f28cc96e46c2621aab80cbea827930e889e
|
@@ -31,6 +31,13 @@ module Glib::Json::Ui
|
|
31
31
|
@__json_ui_activated
|
32
32
|
end
|
33
33
|
|
34
|
+
def json_ui_page_lifecycle_prop(name)
|
35
|
+
if (hash = json_transformation_start).is_a?(Hash) && hash['body'] # A valid page
|
36
|
+
hash[name] ||= { 'action' => 'runMultiple', 'childActions' => [] }
|
37
|
+
hash[name]['childActions']
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
34
41
|
def __json_ui_start(options)
|
35
42
|
@__json_ui_activated = false
|
36
43
|
@__json_ui_rendering = nil
|
@@ -13,7 +13,7 @@ module Glib
|
|
13
13
|
str.slice(0,1).capitalize + str.slice(1..-1)
|
14
14
|
end
|
15
15
|
|
16
|
-
def add_singleton_element
|
16
|
+
def add_singleton_element(type, name, *args)
|
17
17
|
name_components = name.to_s.split('_')
|
18
18
|
json.set! type, "#{name_components.join('/')}" if type
|
19
19
|
args = [yield] if block_given?
|
@@ -22,7 +22,7 @@ module Glib
|
|
22
22
|
"#{self.class.name}::#{name_components.map{ |str| capitalize_first_letter_and_leave_others_alone(str) }.join('::')}".constantize.new(json, @page).props(*args)
|
23
23
|
end
|
24
24
|
|
25
|
-
def add_element_to_array
|
25
|
+
def add_element_to_array(type, name, *args)
|
26
26
|
json.child! do
|
27
27
|
add_singleton_element type, name, *args
|
28
28
|
end
|
@@ -69,6 +69,12 @@ module Glib
|
|
69
69
|
|
70
70
|
private
|
71
71
|
|
72
|
+
def self.any(propName)
|
73
|
+
define_method(propName) do |value|
|
74
|
+
json.set! propName, value
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
72
78
|
def self.date(propName)
|
73
79
|
define_method(propName) do |value|
|
74
80
|
json.set! propName, value&.to_date
|
@@ -191,7 +197,7 @@ module Glib
|
|
191
197
|
json.set!(propName) do
|
192
198
|
if name
|
193
199
|
data[:material] ||= {}
|
194
|
-
data[:material][:name] = name
|
200
|
+
data[:material][:name] = name
|
195
201
|
end
|
196
202
|
|
197
203
|
if (material = data[:material])
|
@@ -1,8 +1,18 @@
|
|
1
1
|
module Glib
|
2
2
|
module JsonUi
|
3
3
|
class ActionBuilder < AbstractBuilder
|
4
|
-
def
|
5
|
-
|
4
|
+
def initialize(json, page, multiple)
|
5
|
+
super(json, page)
|
6
|
+
|
7
|
+
@multiple = multiple
|
8
|
+
end
|
9
|
+
|
10
|
+
def method_missing(m, *args)
|
11
|
+
if @multiple
|
12
|
+
add_element_to_array_v1 'action', m, *args
|
13
|
+
else
|
14
|
+
add_singleton_element_v1 'action', m, *args
|
15
|
+
end
|
6
16
|
end
|
7
17
|
|
8
18
|
class Action < JsonUiElement
|
@@ -38,19 +48,31 @@ module Glib
|
|
38
48
|
|
39
49
|
### Action definitions
|
40
50
|
|
51
|
+
class RunMultiple < Action
|
52
|
+
def childActions(block)
|
53
|
+
json.childActions do
|
54
|
+
block.call ActionBuilder.new(json, page, true)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
41
59
|
module Forms
|
42
60
|
class Submit < Action
|
43
61
|
end
|
44
|
-
|
45
62
|
end
|
46
63
|
|
47
|
-
# Consider deprecating this. See Data
|
48
64
|
module Auth
|
49
65
|
class SaveCsrfToken < Action
|
50
66
|
string :token
|
51
67
|
action :onSave
|
52
68
|
end
|
69
|
+
end
|
53
70
|
|
71
|
+
module Analytics
|
72
|
+
class LogEvent < Action
|
73
|
+
string :name
|
74
|
+
hash :params
|
75
|
+
end
|
54
76
|
end
|
55
77
|
|
56
78
|
module Timeouts
|
@@ -59,6 +81,10 @@ module Glib
|
|
59
81
|
action :onTimeout
|
60
82
|
end
|
61
83
|
|
84
|
+
# FUTURE
|
85
|
+
class Remove < Action
|
86
|
+
end
|
87
|
+
|
62
88
|
# FUTURE
|
63
89
|
class Clear < Action
|
64
90
|
end
|
@@ -66,11 +92,15 @@ module Glib
|
|
66
92
|
|
67
93
|
# FUTURE
|
68
94
|
module Data
|
69
|
-
class
|
70
|
-
string :
|
95
|
+
class Save < Action
|
96
|
+
string :key
|
97
|
+
string :value
|
71
98
|
action :onSave
|
72
99
|
end
|
73
100
|
|
101
|
+
class Remove < Action
|
102
|
+
end
|
103
|
+
|
74
104
|
class Clear < Action
|
75
105
|
end
|
76
106
|
end
|
@@ -35,11 +35,16 @@ module Glib
|
|
35
35
|
# json.attributes!
|
36
36
|
# end
|
37
37
|
|
38
|
-
def json_ui_section(json
|
38
|
+
def json_ui_section(json)
|
39
39
|
@__json_ui_section ||= Page.new(json, self)
|
40
40
|
@__json_ui_section.list_section_builder
|
41
41
|
end
|
42
42
|
|
43
|
+
def json_ui_action(json)
|
44
|
+
@__json_ui_section ||= Page.new(json, self)
|
45
|
+
@__json_ui_section.action_builder
|
46
|
+
end
|
47
|
+
|
43
48
|
class Page
|
44
49
|
attr_reader :json, :context, :view_builder, :action_builder, :menu_builder
|
45
50
|
attr_reader :list_section_builder, :table_section_builder, :drawer_content_builder, :split_content_builder
|
@@ -52,7 +57,7 @@ module Glib
|
|
52
57
|
@context = context
|
53
58
|
|
54
59
|
@view_builder = ViewBuilder.new(json, self, true)
|
55
|
-
@action_builder = ActionBuilder.new(json, self)
|
60
|
+
@action_builder = ActionBuilder.new(json, self, false)
|
56
61
|
@menu_builder = MenuBuilder.new(json, self)
|
57
62
|
|
58
63
|
@list_section_builder = ListBuilders::Section.new(json, self, ListBuilders::Template.new(json, self))
|
@@ -99,9 +104,12 @@ module Glib
|
|
99
104
|
# options[:leftItems]&.call @menu_builder
|
100
105
|
# end
|
101
106
|
# json.logoUrl "http://localhost:3000/assets/logo_dark-02d9b6a91fdbf22515da7b921d31367b70696214415f6789d2f90232e4a287b7.svg"
|
102
|
-
|
103
|
-
|
104
|
-
|
107
|
+
|
108
|
+
# json.rightItems do
|
109
|
+
# options[:rightItems]&.call @menu_builder
|
110
|
+
# end
|
111
|
+
|
112
|
+
@view_builder.add_singleton_view('appBar', options)
|
105
113
|
end
|
106
114
|
end
|
107
115
|
|
@@ -1,6 +1,9 @@
|
|
1
1
|
module Glib
|
2
2
|
module JsonUi
|
3
3
|
module StylingHelper
|
4
|
+
|
5
|
+
### Padding
|
6
|
+
|
4
7
|
def glib_json_padding_body
|
5
8
|
{ top: 12, left: 20, right: 20, bottom: 12 }
|
6
9
|
end
|
@@ -9,6 +12,12 @@ module Glib
|
|
9
12
|
{ top: 12, bottom: 12, left: 16, right: 16 }
|
10
13
|
end
|
11
14
|
|
15
|
+
###
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
### Image
|
20
|
+
|
12
21
|
def glib_json_image_standard_url
|
13
22
|
'https://cdn-images-1.medium.com/max/1200/1*Qc0XxYm-qAZL-7tjjlNfrg.png'
|
14
23
|
end
|
@@ -20,6 +29,19 @@ module Glib
|
|
20
29
|
def glib_json_image_blob_key
|
21
30
|
'o6CKzNt67PWnkPdUEnWMt7pr'
|
22
31
|
end
|
32
|
+
|
33
|
+
###
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
### Color
|
38
|
+
|
39
|
+
def glib_color_panel_background
|
40
|
+
'#b3bac2'
|
41
|
+
end
|
42
|
+
|
43
|
+
###
|
44
|
+
|
23
45
|
end
|
24
46
|
end
|
25
47
|
end
|
@@ -15,6 +15,10 @@ module Glib
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
+
def add_singleton_view(name, *args)
|
19
|
+
add_singleton_element 'view', name, *args
|
20
|
+
end
|
21
|
+
|
18
22
|
def method_missing(m, *args)
|
19
23
|
add_view m, *args
|
20
24
|
end
|
@@ -152,26 +156,22 @@ module Glib
|
|
152
156
|
block.call page.menu_builder
|
153
157
|
end
|
154
158
|
end
|
159
|
+
end
|
155
160
|
|
156
|
-
|
157
|
-
|
158
|
-
# json.tabButtons do
|
159
|
-
# block.call page.menu_builder
|
160
|
-
# end
|
161
|
-
# end
|
162
|
-
|
163
|
-
# def options(options)
|
164
|
-
# current_url = page.context.request.base_url + page.context.request.fullpath
|
161
|
+
class AppBar < View
|
162
|
+
color :color
|
165
163
|
|
166
|
-
#
|
167
|
-
#
|
168
|
-
#
|
169
|
-
# action.windows_reload url: tab[:url]
|
170
|
-
# end
|
171
|
-
# end
|
164
|
+
# def leftButtons(block)
|
165
|
+
# json.leftButtons do
|
166
|
+
# block.call page.menu_builder
|
172
167
|
# end
|
173
168
|
# end
|
174
169
|
|
170
|
+
def rightButtons(block)
|
171
|
+
json.rightButtons do
|
172
|
+
block.call page.menu_builder
|
173
|
+
end
|
174
|
+
end
|
175
175
|
end
|
176
176
|
|
177
177
|
class Datetime < View
|
@@ -182,4 +182,4 @@ module Glib
|
|
182
182
|
|
183
183
|
end
|
184
184
|
end
|
185
|
-
end
|
185
|
+
end
|
@@ -103,8 +103,13 @@ class Glib::JsonUi::ViewBuilder
|
|
103
103
|
end
|
104
104
|
|
105
105
|
class Check < Text
|
106
|
-
|
107
|
-
|
106
|
+
any :uncheckValue
|
107
|
+
any :checkValue
|
108
|
+
|
109
|
+
|
110
|
+
def value(value)
|
111
|
+
@value = value if value != Glib::Value::DEFAULT
|
112
|
+
end
|
108
113
|
|
109
114
|
# Where possible, use value instead of this
|
110
115
|
bool :checked
|
@@ -113,41 +113,17 @@ module Glib
|
|
113
113
|
controller.policy_scope(record.class, policy_scope_class: policy_scope_class)
|
114
114
|
end
|
115
115
|
|
116
|
-
# TODO: Remove. Deprecated
|
117
|
-
private # Used by child
|
118
|
-
def public?
|
119
|
-
true
|
120
|
-
end
|
121
|
-
|
122
|
-
private # Used by child
|
123
|
-
def everyone
|
124
|
-
true
|
125
|
-
end
|
126
|
-
|
127
|
-
# TODO: Deprecate `user()`
|
128
|
-
private # Used by child
|
129
|
-
def current_user
|
130
|
-
user
|
131
|
-
end
|
132
|
-
|
133
|
-
# # TODO: Revise because it seems there is no justification for allowing owner to see any of the deleted entities, which include User, Guild, and Post
|
134
|
-
# private # Used by child
|
135
|
-
# def not_deleted_unless_owner_or_moderator?(&block)
|
136
|
-
# block ||= lambda { |unused_arg| @user.moderator? }
|
137
|
-
# !@record.deleted? || (@user && (@user.id == @record.user_owner_id || block.call(@record)))
|
138
|
-
# end
|
139
|
-
|
140
|
-
# private # Used by child
|
141
|
-
# def not_deleted_unless_moderator?(&block)
|
142
|
-
# block ||= lambda { |unused_arg| @user.moderator? }
|
143
|
-
# !@record.deleted? || (@user && block.call(@record))
|
144
|
-
# end
|
145
|
-
|
146
116
|
public
|
147
117
|
def self.args_builder
|
148
118
|
Proc.new { |controller| [] }
|
149
119
|
end
|
150
120
|
|
121
|
+
# TODO: Remove. Deprecated
|
122
|
+
# private # Used by child
|
123
|
+
# def public?
|
124
|
+
# true
|
125
|
+
# end
|
126
|
+
|
151
127
|
class Scope
|
152
128
|
attr_reader :user, :scope
|
153
129
|
|
@@ -156,9 +132,30 @@ module Glib
|
|
156
132
|
@scope = scope
|
157
133
|
end
|
158
134
|
|
135
|
+
# def current_user
|
136
|
+
# user
|
137
|
+
# end
|
138
|
+
|
139
|
+
# To be overridden
|
159
140
|
def resolve
|
160
141
|
scope.none
|
161
142
|
end
|
162
143
|
end
|
144
|
+
|
145
|
+
private # Used by child
|
146
|
+
def everyone
|
147
|
+
true
|
148
|
+
end
|
149
|
+
|
150
|
+
# def current_user
|
151
|
+
# user
|
152
|
+
# end
|
153
|
+
|
154
|
+
# TODO: Bad pattern. Implement explicit policy parameter instead.
|
155
|
+
# - E.g. can? :destroy, :service_subscription_auto_renewal, { service_subscription: @service_subscription }
|
156
|
+
# - E.g. super class: :service_subscription_auto_renewal, { service_subscription: @service_subscription }
|
157
|
+
def controller_var(name)
|
158
|
+
controller.instance_variable_get(:"@#{name}")
|
159
|
+
end
|
163
160
|
end
|
164
161
|
end
|
@@ -5,6 +5,8 @@ json_ui_page json do |page|
|
|
5
5
|
|
6
6
|
page.list sections: [
|
7
7
|
->(section) do
|
8
|
+
render "#{@path_prefix}/actions/reload", section: section
|
9
|
+
end, ->(section) do
|
8
10
|
render "#{@path_prefix}/actions/dialogs", section: section
|
9
11
|
end, ->(section) do
|
10
12
|
render "#{@path_prefix}/actions/snackbars", section: section
|
@@ -16,8 +18,6 @@ json_ui_page json do |page|
|
|
16
18
|
render "#{@path_prefix}/actions/timeouts", section: section
|
17
19
|
end, ->(section) do
|
18
20
|
render "#{@path_prefix}/actions/http", section: section
|
19
|
-
end, ->(section) do
|
20
|
-
render "#{@path_prefix}/actions/reload", section: section
|
21
21
|
end
|
22
22
|
]
|
23
23
|
end
|
@@ -3,7 +3,7 @@ json.title 'Forms'
|
|
3
3
|
page = json_ui_page json
|
4
4
|
render "#{@path_prefix}/nav_menu", json: json, page: page
|
5
5
|
|
6
|
-
page.form url: json_ui_garage_url(path: 'forms/
|
6
|
+
page.form url: json_ui_garage_url(path: 'forms/generic_post'), method: 'post', padding: glib_json_padding_body, childViews: ->(form) do
|
7
7
|
form.h1 text: 'Text'
|
8
8
|
form.fields_password name: 'user[text1]', width: 'matchParent', label: 'Type "show"'
|
9
9
|
form.label text: 'Typed', showIf: {
|
@@ -29,7 +29,7 @@ page.form url: json_ui_garage_url(path: 'forms/basic_post'), method: 'post', pad
|
|
29
29
|
|
30
30
|
form.spacer height: 20
|
31
31
|
form.h1 text: 'Check'
|
32
|
-
form.fields_check name: 'user[check1]',
|
32
|
+
form.fields_check name: 'user[check1]', checkValue: 'on', label: 'Show text'
|
33
33
|
form.spacer height: 10
|
34
34
|
form.label text: 'Checked', showIf: {
|
35
35
|
"==": [
|
@@ -70,7 +70,7 @@ page.form url: json_ui_garage_url(path: 'forms/basic_post'), method: 'post', pad
|
|
70
70
|
}
|
71
71
|
|
72
72
|
form.spacer height: 20
|
73
|
-
form.h1 text: '
|
73
|
+
form.h1 text: 'Combined conditions'
|
74
74
|
form.label text: 'Select the same option on both the radio and select fields above'
|
75
75
|
form.spacer height: 10
|
76
76
|
form.h3 text: 'Same!', showIf: {
|
@@ -84,5 +84,22 @@ page.form url: json_ui_garage_url(path: 'forms/basic_post'), method: 'post', pad
|
|
84
84
|
]
|
85
85
|
}
|
86
86
|
|
87
|
+
form.spacer height: 20
|
88
|
+
form.h1 text: 'Show/hide another field'
|
89
|
+
form.label text: ''
|
90
|
+
form.spacer height: 10
|
91
|
+
form.fields_check name: 'user[check2]', checkValue: 'on', label: 'Show field'
|
92
|
+
form.spacer height: 10
|
93
|
+
form.fields_text width: 'matchParent', label: 'Comment (optional)', name: 'user[comment]', value: 'This field can be submitted when it is hidden, but it is not necessary (i.e. up to the app)', showIf: {
|
94
|
+
"==": [
|
95
|
+
{
|
96
|
+
"var": 'user[check2]'
|
97
|
+
},
|
98
|
+
'on'
|
99
|
+
]
|
100
|
+
}
|
101
|
+
|
102
|
+
form.spacer height: 20
|
103
|
+
form.fields_submit text: 'Submit'
|
87
104
|
form.spacer height: 40
|
88
105
|
end
|
@@ -4,11 +4,14 @@ json_ui_page json do |page|
|
|
4
4
|
render "#{@path_prefix}/nav_menu", json: json, page: page
|
5
5
|
|
6
6
|
page.form url: json_ui_garage_url(path: 'forms/basic_post'), method: 'post', padding: glib_json_padding_body, childViews: ->(form) do
|
7
|
-
form.fields_text name: 'user[name]', width: 'matchParent', label: 'Search', styleClasses: ['outlined', 'rounded']
|
7
|
+
form.fields_text name: 'user[name]', width: 'matchParent', label: 'Search', placeholder: 'Enter a keyword', styleClasses: ['outlined', 'rounded']
|
8
8
|
|
9
9
|
form.spacer height: 14
|
10
10
|
form.fields_password name: 'user[password]', width: 'matchParent', label: 'Password', placeholder: 'Type your password', styleClass: 'outlined'
|
11
11
|
|
12
|
+
form.spacer height: 14
|
13
|
+
form.fields_textarea name: 'user[bio]', width: 'matchParent', label: 'Bio', placeholder: 'Enter your bio', styleClasses: ['outlined']
|
14
|
+
|
12
15
|
form.spacer height: 14
|
13
16
|
form.fields_stripeToken name: 'user[stripe_token_outlined]', width: 'matchParent', publicKey: 'pk_test_TYooMQauvdEDq54NiTphI7jx', styleClass: 'outlined'
|
14
17
|
|
@@ -7,7 +7,7 @@ json_ui_page json do |page|
|
|
7
7
|
form.fields_email name: 'user[email]', width: 'matchParent', label: 'Email'
|
8
8
|
form.fields_url name: 'user[url]', width: 'matchParent', label: 'URL'
|
9
9
|
form.fields_number name: 'user[number]', width: 'matchParent', label: 'Number', validation: { required: { message: 'Required' } }
|
10
|
-
form.fields_password name: 'user[password]', width: 'matchParent', label: 'Password'
|
10
|
+
form.fields_password name: 'user[password]', width: 'matchParent', label: 'Password', hint: 'Should contain at least 6 characters'
|
11
11
|
form.fields_textarea name: 'user[textarea]', width: 'matchParent', label: 'Textarea with maxLength', maxLength: 50, validation: { required: { message: 'Required' } }
|
12
12
|
|
13
13
|
options = ['male', 'female'].map { |i| { text: i.humanize, value: i } }
|
@@ -41,6 +41,17 @@ json_ui_page json do |page|
|
|
41
41
|
action.windows_open url: json_ui_garage_url(path: 'pages/full_width')
|
42
42
|
end
|
43
43
|
end
|
44
|
+
end,
|
45
|
+
->(section) do
|
46
|
+
section.header padding: glib_json_padding_list, childViews: ->(header) do
|
47
|
+
header.h2 text: 'Misc (Web Only)'
|
48
|
+
end
|
49
|
+
|
50
|
+
section.rows builder: ->(template) do
|
51
|
+
template.thumbnail title: 'Nested Scroll', onClick: ->(action) do
|
52
|
+
action.windows_open url: json_ui_garage_url(path: 'pages/nested_scroll')
|
53
|
+
end
|
54
|
+
end
|
44
55
|
end
|
45
56
|
]
|
46
57
|
|
@@ -1,19 +1,18 @@
|
|
1
1
|
json.title 'Pages'
|
2
2
|
|
3
|
-
json_ui_page json
|
4
|
-
|
5
|
-
|
6
|
-
page.header padding: glib_json_padding_body, backgroundColor: '#b3bac2', childViews: ->(header) do
|
7
|
-
header.h1 text: 'Header'
|
8
|
-
end
|
3
|
+
page = json_ui_page json
|
4
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page
|
9
5
|
|
10
|
-
|
11
|
-
|
12
|
-
|
6
|
+
page.header padding: glib_json_padding_body, backgroundColor: '#b3bac2', childViews: ->(header) do
|
7
|
+
header.h1 text: 'Header'
|
8
|
+
end
|
9
|
+
|
10
|
+
page.footer padding: glib_json_padding_body, backgroundColor: '#b3bac2', childViews: ->(footer) do
|
11
|
+
footer.h1 text: 'Footer'
|
12
|
+
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
14
|
+
page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
|
15
|
+
(1..100).each do |index|
|
16
|
+
scroll.label text: 'Content'
|
18
17
|
end
|
19
18
|
end
|
@@ -1,21 +1,33 @@
|
|
1
1
|
json.title 'Pages'
|
2
2
|
|
3
|
-
json_ui_page json
|
4
|
-
|
5
|
-
|
6
|
-
page.rightNavButtons do |menu|
|
7
|
-
menu.button icon: 'search', onClick: ->(action) do
|
8
|
-
action.dialogs_alert message: 'Perform some action'
|
9
|
-
end
|
10
|
-
menu.button icon: { name: 'star', badge: { text: '1', backgroundColor: '#ff0000' } }, onClick: ->(action) do
|
11
|
-
action.dialogs_alert message: 'Perform some action'
|
12
|
-
end
|
13
|
-
menu.button icon: { name: 'map', badge: '2' }, onClick: ->(action) do
|
14
|
-
action.dialogs_alert message: 'Perform some action'
|
15
|
-
end
|
16
|
-
end
|
3
|
+
page = json_ui_page json
|
4
|
+
|
5
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page
|
17
6
|
|
18
|
-
|
19
|
-
|
7
|
+
page.navBar backgroundColor: '#a8c4e3', rightButtons: ->(menu) do
|
8
|
+
menu.button icon: 'search', onClick: ->(action) do
|
9
|
+
action.dialogs_alert message: 'Perform some action'
|
10
|
+
end
|
11
|
+
menu.button icon: { name: 'star', badge: { text: '1', backgroundColor: '#ff0000' } }, onClick: ->(action) do
|
12
|
+
action.dialogs_alert message: 'Perform some action'
|
13
|
+
end
|
14
|
+
menu.button icon: { name: 'map', badge: '2' }, onClick: ->(action) do
|
15
|
+
action.dialogs_alert message: 'Perform some action'
|
20
16
|
end
|
21
17
|
end
|
18
|
+
|
19
|
+
# page.rightNavButtons do |menu|
|
20
|
+
# menu.button icon: 'search', onClick: ->(action) do
|
21
|
+
# action.dialogs_alert message: 'Perform some action'
|
22
|
+
# end
|
23
|
+
# menu.button icon: { name: 'star', badge: { text: '1', backgroundColor: '#ff0000' } }, onClick: ->(action) do
|
24
|
+
# action.dialogs_alert message: 'Perform some action'
|
25
|
+
# end
|
26
|
+
# menu.button icon: { name: 'map', badge: '2' }, onClick: ->(action) do
|
27
|
+
# action.dialogs_alert message: 'Perform some action'
|
28
|
+
# end
|
29
|
+
# end
|
30
|
+
|
31
|
+
page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
|
32
|
+
scroll.label text: 'See the right menu buttons on the nav bar'
|
33
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
json.title 'Pages'
|
2
|
+
|
3
|
+
page = json_ui_page json
|
4
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page
|
5
|
+
|
6
|
+
# page.template 'fullWidth'
|
7
|
+
|
8
|
+
page.header childViews: ->(header) do
|
9
|
+
header.panels_vertical width: 'matchParent', styleClass: 'card', padding: glib_json_padding_body, childViews: ->(vertical) do
|
10
|
+
vertical.h1 text: 'Header'
|
11
|
+
end
|
12
|
+
header.spacer height: 10
|
13
|
+
end
|
14
|
+
|
15
|
+
page.footer childViews: ->(footer) do
|
16
|
+
footer.spacer height: 10
|
17
|
+
footer.panels_vertical width: 'matchParent', styleClass: 'card', padding: glib_json_padding_body, childViews: ->(vertical) do
|
18
|
+
vertical.h1 text: 'Footer'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
|
23
|
+
scroll.label text: 'Inner Header'
|
24
|
+
scroll.label text: 'Inner Header'
|
25
|
+
scroll.label text: 'Inner Header'
|
26
|
+
scroll.spacer height: 20
|
27
|
+
|
28
|
+
scroll.panels_vertical width: 'matchParent', styleClass: 'card', backgroundColor: glib_color_panel_background, padding: glib_json_padding_body.merge(right: nil), childViews: ->(padder) do
|
29
|
+
padder.panels_scroll width: 'matchParent', height: 300, childViews: ->(inner_scroll) do
|
30
|
+
(1..100).each do |index|
|
31
|
+
inner_scroll.label text: 'Content'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
scroll.spacer height: 20
|
37
|
+
scroll.label text: 'Inner Footer'
|
38
|
+
scroll.label text: 'Inner Footer'
|
39
|
+
scroll.label text: 'Inner Footer'
|
40
|
+
end
|
@@ -1,16 +1,37 @@
|
|
1
1
|
json.title 'Panels'
|
2
2
|
|
3
|
-
image_url1 = '
|
3
|
+
image_url1 = 'https://ichef.bbci.co.uk/news/976/cpsprodpb/18106/production/_97266589_gettyimages-474547165.jpg'
|
4
4
|
image_url2 = 'https://s.abcnews.com/images/International/Guam03-gty-jrl-170809_16x9_992.jpg'
|
5
5
|
|
6
6
|
json_ui_page json do |page|
|
7
7
|
render "#{@path_prefix}/nav_menu", json: json, page: page
|
8
|
-
|
8
|
+
|
9
9
|
page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
|
10
|
-
scroll.
|
10
|
+
scroll.label text: "\n"
|
11
|
+
scroll.h1 text: 'Carousel with labels'
|
12
|
+
scroll.panels_carousel width: 'matchParent', childViews: ->(carousel) do
|
13
|
+
carousel.label text: 'Item 1'
|
14
|
+
carousel.label text: 'Item 2'
|
15
|
+
end
|
16
|
+
|
17
|
+
scroll.label text: "\n"
|
18
|
+
scroll.h1 text: 'Carousel with images'
|
11
19
|
scroll.panels_carousel width: 'matchParent', childViews: ->(carousel) do
|
12
20
|
carousel.image url: image_url1, width: 'matchParent'
|
13
21
|
carousel.image url: image_url2, width: 'matchParent'
|
14
22
|
end
|
23
|
+
|
24
|
+
scroll.label text: "\n"
|
25
|
+
scroll.h1 text: 'Carousel with complex layout'
|
26
|
+
scroll.panels_carousel width: 'matchParent', childViews: ->(carousel) do
|
27
|
+
carousel.panels_vertical childViews: ->(panel) do
|
28
|
+
panel.h3 text: 'Item 1'
|
29
|
+
panel.image url: image_url1, width: 'matchParent'
|
30
|
+
end
|
31
|
+
carousel.panels_vertical childViews: ->(panel) do
|
32
|
+
panel.h3 text: 'Item 2'
|
33
|
+
panel.image url: image_url2, width: 'matchParent'
|
34
|
+
end
|
35
|
+
end
|
15
36
|
end
|
16
37
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
batch_count = 30
|
3
2
|
items = (1..batch_count)
|
4
3
|
section = page.table_section_builder
|
@@ -10,4 +9,4 @@ section.rows objects: items, builder: ->(row, item, index) do
|
|
10
9
|
end, onClick: ->(action) do
|
11
10
|
action.windows_open url: json_ui_garage_url(path: 'home/blank')
|
12
11
|
end
|
13
|
-
end
|
12
|
+
end
|
@@ -1,39 +1,39 @@
|
|
1
1
|
|
2
2
|
page_index = params[:page].to_i
|
3
3
|
next_page = {
|
4
|
-
url: json_ui_garage_url(path: 'tables/
|
4
|
+
url: json_ui_garage_url(path: 'tables/autoload_as_needed', page: page_index + 1, section_only: 'v1'),
|
5
5
|
autoload: 'asNeeded'
|
6
6
|
}
|
7
7
|
|
8
|
+
page = json_ui_page json
|
8
9
|
column_indexes = (1..3)
|
10
|
+
|
9
11
|
if params[:section_only].present?
|
12
|
+
sleep 1
|
13
|
+
|
10
14
|
json.nextPage next_page if page_index < 3
|
11
|
-
|
12
|
-
json.
|
13
|
-
|
14
|
-
render 'json_ui/garage/tables/autoload_section', page: page, page_index: page_index, column_indexes: column_indexes
|
15
|
-
end
|
15
|
+
json.sections do
|
16
|
+
json.child! do
|
17
|
+
render 'json_ui/garage/tables/autoload_section', page: page, page_index: page_index, column_indexes: column_indexes
|
16
18
|
end
|
17
19
|
end
|
18
20
|
else
|
19
21
|
json.title 'Tables'
|
20
22
|
|
21
|
-
|
22
|
-
render "#{@path_prefix}/nav_menu", json: json, page: page
|
23
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
end
|
25
|
+
page.table nextPage: next_page, firstSection: ->(section) do
|
26
|
+
section.header cellViews: ->(header) do
|
27
|
+
column_indexes.each do |i|
|
28
|
+
header.label text: "Heading#{i}"
|
29
29
|
end
|
30
|
-
|
31
|
-
render "#{@path_prefix}/tables/autoload_section", page: page, page_index: page_index, column_indexes: column_indexes
|
32
|
-
end, onScrollToBottom: ->(action) do
|
33
|
-
action.snackbars_alert message: 'Scrolled to Bottom'
|
34
|
-
end, onScrollToTop: ->(action) do
|
35
|
-
action.snackbars_alert message: 'Scrolled to Top'
|
36
30
|
end
|
31
|
+
|
32
|
+
render "#{@path_prefix}/tables/autoload_section", page: page, page_index: page_index, column_indexes: column_indexes
|
33
|
+
end, onScrollToBottom: ->(action) do
|
34
|
+
action.snackbars_alert message: 'Scrolled to Bottom'
|
35
|
+
end, onScrollToTop: ->(action) do
|
36
|
+
action.snackbars_alert message: 'Scrolled to Top'
|
37
37
|
end
|
38
38
|
|
39
39
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
json.title 'Views'
|
2
|
+
|
3
|
+
page = json_ui_page json
|
4
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page
|
5
|
+
|
6
|
+
page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
|
7
|
+
# TODO: Scrape all names from https://material.io/resources/icons
|
8
|
+
icon_names = [
|
9
|
+
'info', 'info', 'info', 'info', 'info', 'info', 'info', 'info',
|
10
|
+
'info', 'info', 'info', 'info', 'info', 'info', 'info', 'info',
|
11
|
+
'info', 'info', 'info', 'info', 'info', 'info', 'info', 'info',
|
12
|
+
]
|
13
|
+
icon_names.each do |icon_name|
|
14
|
+
scroll.panels_column lg: { cols: 2 }, childViews: ->(column) do
|
15
|
+
column.panels_horizontal align: 'middle', childViews: ->(horizontal) do
|
16
|
+
horizontal.icon spec: icon_name
|
17
|
+
horizontal.spacer width: 6
|
18
|
+
horizontal.label text: icon_name
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -11,10 +11,10 @@ page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
|
|
11
11
|
scroll.spacer height: 6
|
12
12
|
scroll.avatar url: glib_json_image_avatar_url
|
13
13
|
|
14
|
-
scroll.spacer height: 20
|
15
|
-
scroll.h2 text: 'Icon'
|
16
|
-
scroll.spacer height: 6
|
17
|
-
scroll.icon spec: 'info'
|
14
|
+
# scroll.spacer height: 20
|
15
|
+
# scroll.h2 text: 'Icon'
|
16
|
+
# scroll.spacer height: 6
|
17
|
+
# scroll.icon spec: 'info'
|
18
18
|
|
19
19
|
scroll.spacer height: 20
|
20
20
|
scroll.h2 text: 'Image with base64 data'
|
@@ -16,15 +16,15 @@ json_ui_page json do |page|
|
|
16
16
|
template.thumbnail title: 'Images', onClick: ->(action) do
|
17
17
|
action.windows_open url: json_ui_garage_url(path: 'views/images')
|
18
18
|
end
|
19
|
-
template.thumbnail title: 'Carousels', onClick: ->(action) do
|
20
|
-
action.windows_open url: json_ui_garage_url(path: 'views/carousels')
|
21
|
-
end
|
22
19
|
template.thumbnail title: 'Charts', onClick: ->(action) do
|
23
20
|
action.windows_open url: json_ui_garage_url(path: 'views/charts')
|
24
21
|
end
|
25
22
|
template.thumbnail title: 'Banners', onClick: ->(action) do
|
26
23
|
action.windows_open url: json_ui_garage_url(path: 'views/banners')
|
27
24
|
end
|
25
|
+
template.thumbnail title: 'Icons', onClick: ->(action) do
|
26
|
+
action.windows_open url: json_ui_garage_url(path: 'views/icons')
|
27
|
+
end
|
28
28
|
template.thumbnail title: 'Misc', onClick: ->(action) do
|
29
29
|
action.windows_open url: json_ui_garage_url(path: 'views/misc')
|
30
30
|
end
|
data/lib/glib/json_crawler.rb
CHANGED
@@ -8,3 +8,4 @@ require_relative './json_crawler/action_crawlers/windows_open'
|
|
8
8
|
require_relative './json_crawler/action_crawlers/action_http'
|
9
9
|
require_relative './json_crawler/action_crawlers/forms_submit'
|
10
10
|
require_relative './json_crawler/action_crawlers/menu'
|
11
|
+
require_relative './json_crawler/action_crawlers/run_multiple'
|
@@ -4,11 +4,8 @@ module Glib
|
|
4
4
|
def initialize(method, http, args, controller)
|
5
5
|
@http = http
|
6
6
|
json = @http.send(method, args['url'], controller, args.fetch('formData', {}))
|
7
|
-
|
8
|
-
unless json.nil?
|
9
|
-
click(json)
|
10
|
-
end
|
7
|
+
perform(json['onResponse'])
|
11
8
|
end
|
12
9
|
end
|
13
10
|
end
|
14
|
-
end
|
11
|
+
end
|
@@ -31,7 +31,7 @@ module Glib
|
|
31
31
|
|
32
32
|
include_params = case name
|
33
33
|
when 'fields/check', 'fields/check-v1'
|
34
|
-
child['
|
34
|
+
child['checkValue'] == child['value']
|
35
35
|
else
|
36
36
|
true
|
37
37
|
end
|
@@ -41,7 +41,7 @@ module Glib
|
|
41
41
|
end
|
42
42
|
|
43
43
|
json = @http.patch url, action, params
|
44
|
-
|
44
|
+
perform(json['onResponse'])
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
@@ -3,6 +3,7 @@ module Glib
|
|
3
3
|
class WindowsOpen < ActionCrawler
|
4
4
|
def initialize(http, args, action)
|
5
5
|
@http = http
|
6
|
+
|
6
7
|
if (url = args['url'])
|
7
8
|
json = @http.get(url, action, args.except('url'))
|
8
9
|
|
@@ -20,6 +21,8 @@ module Glib
|
|
20
21
|
click button
|
21
22
|
end
|
22
23
|
end
|
24
|
+
|
25
|
+
perform(json['onLoad'])
|
23
26
|
end
|
24
27
|
end
|
25
28
|
end
|
@@ -19,6 +19,7 @@ module Glib
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def step(http, args)
|
22
|
+
# TODO: Refactor
|
22
23
|
case args['view']
|
23
24
|
when 'fields/submit-v1', 'fields/submit'
|
24
25
|
@depth += 1
|
@@ -29,40 +30,45 @@ module Glib
|
|
29
30
|
end
|
30
31
|
|
31
32
|
if args.is_a?(Hash) && args['rel'] != 'nofollow'
|
32
|
-
if (onClick = (args.fetch('onClick', nil)
|
33
|
-
|
34
|
-
params = onClick
|
33
|
+
if (onClick = (args.fetch('onClick', nil)))
|
34
|
+
process_action(http, onClick)
|
35
35
|
end
|
36
|
+
end
|
37
|
+
end
|
36
38
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
39
|
+
def process_action(http, spec)
|
40
|
+
action = spec['action']
|
41
|
+
params = spec
|
42
|
+
|
43
|
+
if action.present?
|
44
|
+
@depth += 1
|
45
|
+
case action
|
46
|
+
when 'initiate_navigation'
|
47
|
+
@read_only_actions.add([action, params['url']])
|
48
|
+
JsonCrawler::NavInitiate.new(http, params, action)
|
49
|
+
when 'runMultiple-v1', 'runMultiple'
|
50
|
+
JsonCrawler::RunMultiple.new(http, params, action)
|
51
|
+
when 'windows/open-v1', 'dialogs/open-v1', 'windows/reload-v1', 'windows/open', 'dialogs/open', 'windows/reload'
|
52
|
+
@read_only_actions.add([action, params['url']])
|
53
|
+
JsonCrawler::WindowsOpen.new(http, params, action)
|
54
|
+
when 'sheets/select-v1', 'sheets/select'
|
55
|
+
JsonCrawler::Menu.new(http, params, action)
|
56
|
+
when 'http/post-v1', 'http/post'
|
57
|
+
JsonCrawler::ActionHttp.new(:post, http, params, action)
|
58
|
+
when 'forms/submit-v1', 'forms/submit'
|
59
|
+
forms = @visitor.forms
|
60
|
+
# raise 'Submit action needs to be inside a form' if forms.size < 1
|
61
|
+
JsonCrawler::FormsSubmit.new(http, forms.last)
|
62
|
+
else
|
63
|
+
unless [
|
64
|
+
'http/delete-v1', 'dialogs/oauth-v1', 'windows/openWeb-v1',
|
65
|
+
'http/delete', 'dialogs/oauth', 'windows/openWeb'
|
66
|
+
].include?(action)
|
44
67
|
@read_only_actions.add([action, params['url']])
|
45
|
-
JsonCrawler::WindowsOpen.new(http, params, action)
|
46
|
-
when 'sheets/select-v1', 'sheets/select'
|
47
|
-
JsonCrawler::Menu.new(http, params, action)
|
48
|
-
when 'http/post-v1', 'http/post'
|
49
|
-
JsonCrawler::ActionHttp.new(:post, http, params, action)
|
50
|
-
when 'forms/submit-v1', 'forms/submit'
|
51
|
-
forms = @visitor.forms
|
52
|
-
# raise 'Submit action needs to be inside a form' if forms.size < 1
|
53
|
-
JsonCrawler::FormsSubmit.new(http, forms.last)
|
54
|
-
else
|
55
|
-
unless [
|
56
|
-
'http/delete-v1', 'dialogs/oauth-v1', 'windows/openWeb-v1',
|
57
|
-
'http/delete', 'dialogs/oauth', 'windows/openWeb'
|
58
|
-
].include?(action)
|
59
|
-
@read_only_actions.add([action, params['url']])
|
60
|
-
end
|
61
|
-
self.log action, params['url']
|
62
68
|
end
|
63
|
-
|
64
|
-
# child
|
69
|
+
self.log action, params['url']
|
65
70
|
end
|
71
|
+
@depth -= 1
|
66
72
|
end
|
67
73
|
end
|
68
74
|
|
data/lib/glib/test_helpers.rb
CHANGED
@@ -20,21 +20,21 @@ module Glib
|
|
20
20
|
end
|
21
21
|
@__log_dir
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
def __log_file
|
25
25
|
@__log_file ||= "#{self.method_name}.json"
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
def __log json
|
29
29
|
File.open("#{File.join(__log_dir, __log_file)}", "w") do |f|
|
30
30
|
f << JSON.pretty_generate( JSON.parse(json) )
|
31
31
|
end
|
32
32
|
json
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
def __get_previous_result_from_git
|
36
36
|
`git checkout -- "#{File.join(__log_dir, __log_file)}" > /dev/null 2>&1` if __git_is_available?
|
37
|
-
File.
|
37
|
+
File.exist?(File.join(__log_dir, __log_file)) ? File.open(File.join(__log_dir, __log_file)).read : "\{\}"
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glib-web
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ''
|
@@ -98,6 +98,7 @@ files:
|
|
98
98
|
- app/helpers/glib/json_ui/view_builder/charts.rb
|
99
99
|
- app/helpers/glib/json_ui/view_builder/fields.rb
|
100
100
|
- app/helpers/glib/json_ui/view_builder/panels.rb
|
101
|
+
- app/helpers/glib/urls_helper.rb
|
101
102
|
- app/models/glib/active_storage/attachment.rb
|
102
103
|
- app/models/glib/active_storage/blob.rb
|
103
104
|
- app/models/glib/dynamic_text_record.rb
|
@@ -157,6 +158,7 @@ files:
|
|
157
158
|
- app/views/json_ui/garage/pages/layout.json.jbuilder
|
158
159
|
- app/views/json_ui/garage/pages/loading_indicator.json.jbuilder
|
159
160
|
- app/views/json_ui/garage/pages/nav_buttons.json.jbuilder
|
161
|
+
- app/views/json_ui/garage/pages/nested_scroll.json.jbuilder
|
160
162
|
- app/views/json_ui/garage/pages/tab_bar.json.jbuilder
|
161
163
|
- app/views/json_ui/garage/panels/_styled.json.jbuilder
|
162
164
|
- app/views/json_ui/garage/panels/card.json.jbuilder
|
@@ -182,8 +184,8 @@ files:
|
|
182
184
|
- app/views/json_ui/garage/views/_chart_data.json.jbuilder
|
183
185
|
- app/views/json_ui/garage/views/banners.json.jbuilder
|
184
186
|
- app/views/json_ui/garage/views/calendar_data.json.jbuilder
|
185
|
-
- app/views/json_ui/garage/views/carousels.json.jbuilder
|
186
187
|
- app/views/json_ui/garage/views/charts.json.jbuilder
|
188
|
+
- app/views/json_ui/garage/views/icons.json.jbuilder
|
187
189
|
- app/views/json_ui/garage/views/images.json.jbuilder
|
188
190
|
- app/views/json_ui/garage/views/index.json.jbuilder
|
189
191
|
- app/views/json_ui/garage/views/links.json.jbuilder
|
@@ -212,6 +214,7 @@ files:
|
|
212
214
|
- lib/glib/json_crawler/action_crawlers/forms_submit.rb
|
213
215
|
- lib/glib/json_crawler/action_crawlers/menu.rb
|
214
216
|
- lib/glib/json_crawler/action_crawlers/nav_initiate.rb
|
217
|
+
- lib/glib/json_crawler/action_crawlers/run_multiple.rb
|
215
218
|
- lib/glib/json_crawler/action_crawlers/windows_open.rb
|
216
219
|
- lib/glib/json_crawler/coverage.rb
|
217
220
|
- lib/glib/json_crawler/http.rb
|
@@ -1,37 +0,0 @@
|
|
1
|
-
json.title 'Views'
|
2
|
-
|
3
|
-
image_url1 = 'http://ichef.bbci.co.uk/news/976/cpsprodpb/18106/production/_97266589_gettyimages-474547165.jpg'
|
4
|
-
image_url2 = 'https://s.abcnews.com/images/International/Guam03-gty-jrl-170809_16x9_992.jpg'
|
5
|
-
|
6
|
-
json_ui_page json do |page|
|
7
|
-
render "#{@path_prefix}/nav_menu", json: json, page: page
|
8
|
-
|
9
|
-
page.scroll childViews: ->(scroll) do
|
10
|
-
scroll.label text: "\n"
|
11
|
-
scroll.h1 text: 'Carousel with labels'
|
12
|
-
scroll.panels_carousel width: 'matchParent', childViews: ->(carousel) do
|
13
|
-
carousel.label text: 'Item 1'
|
14
|
-
carousel.label text: 'Item 2'
|
15
|
-
end
|
16
|
-
|
17
|
-
scroll.label text: "\n"
|
18
|
-
scroll.h1 text: 'Carousel with images'
|
19
|
-
scroll.panels_carousel width: 'matchParent', childViews: ->(carousel) do
|
20
|
-
carousel.image url: image_url1, width: 'matchParent'
|
21
|
-
carousel.image url: image_url2, width: 'matchParent'
|
22
|
-
end
|
23
|
-
|
24
|
-
scroll.label text: "\n"
|
25
|
-
scroll.h1 text: 'Carousel with complex layout'
|
26
|
-
scroll.panels_carousel width: 'matchParent', childViews: ->(carousel) do
|
27
|
-
carousel.panels_vertical childViews: ->(panel) do
|
28
|
-
panel.h3 text: 'Item 1'
|
29
|
-
panel.image url: image_url1, width: 'matchParent'
|
30
|
-
end
|
31
|
-
carousel.panels_vertical childViews: ->(panel) do
|
32
|
-
panel.h3 text: 'Item 2'
|
33
|
-
panel.image url: image_url2, width: 'matchParent'
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|