glib-web 0.5.5 → 0.5.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/glib/json/ui.rb +7 -0
  3. data/app/helpers/glib/json_ui/abstract_builder.rb +9 -3
  4. data/app/helpers/glib/json_ui/action_builder.rb +36 -6
  5. data/app/helpers/glib/json_ui/action_builder/windows.rb +1 -0
  6. data/app/helpers/glib/json_ui/page_helper.rb +13 -5
  7. data/app/helpers/glib/json_ui/response_helper.rb +1 -1
  8. data/app/helpers/glib/json_ui/styling_helper.rb +22 -0
  9. data/app/helpers/glib/json_ui/view_builder.rb +16 -16
  10. data/app/helpers/glib/json_ui/view_builder/fields.rb +7 -2
  11. data/app/helpers/glib/urls_helper.rb +7 -0
  12. data/app/policies/glib/application_policy.rb +27 -30
  13. data/app/views/json_ui/garage/actions/index.json.jbuilder +2 -2
  14. data/app/views/json_ui/garage/forms/show_hide.json.jbuilder +20 -3
  15. data/app/views/json_ui/garage/forms/styled_boxes.json.jbuilder +4 -1
  16. data/app/views/json_ui/garage/forms/text_validation.json.jbuilder +1 -1
  17. data/app/views/json_ui/garage/pages/index.json.jbuilder +11 -0
  18. data/app/views/json_ui/garage/pages/layout.json.jbuilder +12 -13
  19. data/app/views/json_ui/garage/pages/nav_buttons.json.jbuilder +28 -16
  20. data/app/views/json_ui/garage/pages/nested_scroll.json.jbuilder +40 -0
  21. data/app/views/json_ui/garage/panels/carousel.json.jbuilder +24 -3
  22. data/app/views/json_ui/garage/tables/_autoload_section.json.jbuilder +1 -2
  23. data/app/views/json_ui/garage/tables/autoload_as_needed.json.jbuilder +19 -19
  24. data/app/views/json_ui/garage/views/icons.json.jbuilder +22 -0
  25. data/app/views/json_ui/garage/views/images.json.jbuilder +4 -4
  26. data/app/views/json_ui/garage/views/index.json.jbuilder +3 -3
  27. data/lib/glib/json_crawler.rb +1 -0
  28. data/lib/glib/json_crawler/action_crawler.rb +4 -1
  29. data/lib/glib/json_crawler/action_crawlers/action_http.rb +2 -5
  30. data/lib/glib/json_crawler/action_crawlers/forms_submit.rb +2 -2
  31. data/lib/glib/json_crawler/action_crawlers/nav_initiate.rb +2 -0
  32. data/lib/glib/json_crawler/action_crawlers/run_multiple.rb +13 -0
  33. data/lib/glib/json_crawler/action_crawlers/windows_open.rb +3 -0
  34. data/lib/glib/json_crawler/router.rb +35 -29
  35. data/lib/glib/test_helpers.rb +4 -4
  36. metadata +5 -2
  37. 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: 3a631905663a326cc5d4da2aa0be179812d12aae
4
- data.tar.gz: a167fd02e4db101e5067832225762ba410bc401b
3
+ metadata.gz: 811686b2291bc31023b9d5980a6cb54cc2a97a26
4
+ data.tar.gz: 8f6ed8e3d277ca3c29190bcfe07d99c687c9e90c
5
5
  SHA512:
6
- metadata.gz: 0a5094637dbe44532c384bd7e30a49bb3dd5377ef87cee6ea13da3528620aae8f2a43eba21f3077df4530a3356087851dcbd8be150d72a3ff1af70b4b3493afb
7
- data.tar.gz: 03b85596d99b043700a6818feef54b6e45017e905800358502052a68bdf0d6cb472c64bc9bb352849a9628b587479bfbab41314da1543cb1f92317371639ac07
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 type, name, *args
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 type, name, *args
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 method_missing m, *args
5
- add_singleton_element_v1 'action', m, *args
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 SaveCsrfToken < Action
70
- string :token
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
@@ -2,6 +2,7 @@ class Glib::JsonUi::ActionBuilder
2
2
  module Windows
3
3
  class Close < Action
4
4
  action :onClose
5
+ # action :onAfterClose
5
6
  end
6
7
 
7
8
  class CloseAll < Action
@@ -35,11 +35,16 @@ module Glib
35
35
  # json.attributes!
36
36
  # end
37
37
 
38
- def json_ui_section(json, &block)
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
- json.rightItems do
103
- options[:rightItems]&.call @menu_builder
104
- end
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
 
@@ -15,7 +15,7 @@ module Glib
15
15
  @json = json
16
16
  @context = context
17
17
 
18
- @action_builder = ActionBuilder.new(json, self)
18
+ @action_builder = ActionBuilder.new(json, self, false)
19
19
  end
20
20
  end
21
21
  end
@@ -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
- # Should be deprecated
157
- # def tabButtons(block)
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
- # buttons ->(menu) do
167
- # options.each do |tab|
168
- # menu.button text: tab[:text], disabled: tab[:url] == current_url, onClick: ->(action) do
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
- string :uncheckValue
107
- string :checkValue
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
@@ -0,0 +1,7 @@
1
+ module Glib
2
+ module UrlsHelper
3
+ def glib_url_current(new_params)
4
+ url_for(params.to_unsafe_h.merge(new_params.merge(only_path: false)))
5
+ end
6
+ end
7
+ end
@@ -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/basic_post'), method: 'post', padding: glib_json_padding_body, childViews: ->(form) do
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]', value: 'on', label: 'Show text'
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: 'Combo1'
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 do |page|
4
- render "#{@path_prefix}/nav_menu", json: json, page: page
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
- page.footer padding: glib_json_padding_body, backgroundColor: '#b3bac2', childViews: ->(footer) do
11
- footer.h1 text: 'Footer'
12
- end
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
- page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
15
- (1..100).each do |index|
16
- scroll.label text: 'Content'
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 do |page|
4
- render "#{@path_prefix}/nav_menu", json: json, page: page
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
- page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
19
- scroll.label text: 'See the right menu buttons on the nav bar'
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 = 'http://ichef.bbci.co.uk/news/976/cpsprodpb/18106/production/_97266589_gettyimages-474547165.jpg'
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.h1 text: 'Carousel panel'
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/autoload_all', page: page_index + 1, section_only: 'v1'),
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
- json_ui_page json do |page|
12
- json.sections do
13
- json.child! do
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
- json_ui_page json do |page|
22
- render "#{@path_prefix}/nav_menu", json: json, page: page
23
+ render "#{@path_prefix}/nav_menu", json: json, page: page
23
24
 
24
- page.table nextPage: next_page, firstSection: ->(section) do
25
- section.header cellViews: ->(header) do
26
- column_indexes.each do |i|
27
- header.label text: "Heading#{i}"
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
@@ -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'
@@ -14,7 +14,10 @@ module Glib
14
14
  click view
15
15
  end
16
16
  end
17
- end
18
17
 
18
+ def perform(action)
19
+ @http.router.process_action(@http, action)
20
+ end
21
+ end
19
22
  end
20
23
  end
@@ -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['checked']
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
- click(json)
44
+ perform(json['onResponse'])
45
45
  end
46
46
  end
47
47
  end
@@ -9,6 +9,8 @@ module Glib
9
9
  crawl left_drawer['header']&.[]('childViews')
10
10
  crawl left_drawer['rows']
11
11
  end
12
+
13
+ perform(json['onLoad'])
12
14
  end
13
15
  end
14
16
  end
@@ -0,0 +1,13 @@
1
+ module Glib
2
+ module JsonCrawler
3
+ class RunMultiple < ActionCrawler
4
+ def initialize(http, args, action)
5
+ @http = http
6
+
7
+ args['childActions']&.each do |button|
8
+ perform(button)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ 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) || args.fetch('onResponse', nil)))
33
- action = onClick['action']
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
- if action.present?
38
- @depth += 1
39
- case action
40
- when 'initiate_navigation'
41
- @read_only_actions.add([action, params['url']])
42
- JsonCrawler::NavInitiate.new(http, params, action)
43
- when 'windows/open-v1', 'dialogs/open-v1', 'windows/reload-v1', 'windows/open', 'dialogs/open', 'windows/reload'
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
- @depth -= 1
64
- # child
69
+ self.log action, params['url']
65
70
  end
71
+ @depth -= 1
66
72
  end
67
73
  end
68
74
 
@@ -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.exists?(File.join(__log_dir, __log_file)) ? File.open(File.join(__log_dir, __log_file)).read : "\{\}"
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.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