glib-web 0.5.4 → 0.5.11
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/app_feature_support_helper.rb +16 -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 +9 -1
- data/app/helpers/glib/json_ui/view_builder/panels.rb +2 -0
- 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/dynamic_group.json.jbuilder +9 -18
- data/app/views/json_ui/garage/forms/pickers.json.jbuilder +6 -3
- 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/notifications/web_socket.json.jbuilder +19 -21
- 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_as_needed.json.jbuilder +37 -0
- data/app/views/json_ui/garage/tables/index.json.jbuilder +3 -0
- 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 +2 -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/menu.rb +12 -0
- data/lib/glib/json_crawler/action_crawlers/nav_initiate.rb +3 -1
- 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/http.rb +3 -2
- data/lib/glib/json_crawler/router.rb +35 -28
- data/lib/glib/test_helpers.rb +4 -4
- metadata +8 -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: 9c409da37352d6e9066f4b7895d76c3cba5e81f2
|
4
|
+
data.tar.gz: 7116d6e9e13cc00d98811010acb550749acdcbba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ce3e630395c565eb252a653db28eb026388100082105109d4f2a380f19bab6d0465bd5d04ff65ff0da4c729c4273a08d800c2e8db614678767349ef279a8422
|
7
|
+
data.tar.gz: cb22a75b02ed382066e4d6060026600093cd543032c0d9c0679f64628750068a8ffa3dca4070995907040db5871b75ae171a4a5172ec445aa4e762357bd73235
|
@@ -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
|
@@ -0,0 +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
|
@@ -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,7 +103,15 @@ class Glib::JsonUi::ViewBuilder
|
|
103
103
|
end
|
104
104
|
|
105
105
|
class Check < Text
|
106
|
-
|
106
|
+
any :uncheckValue
|
107
|
+
any :checkValue
|
108
|
+
|
109
|
+
|
110
|
+
def value(value)
|
111
|
+
@value = value if value != Glib::Value::DEFAULT
|
112
|
+
end
|
113
|
+
|
114
|
+
# Where possible, use value instead of this
|
107
115
|
bool :checked
|
108
116
|
end
|
109
117
|
|
@@ -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
|