glib-web 0.5.69 → 0.5.73
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/helpers/glib/enum_helper.rb +10 -0
- data/app/helpers/glib/json_ui/abstract_builder.rb +16 -1
- data/app/helpers/glib/json_ui/action_builder/windows.rb +2 -0
- data/app/helpers/glib/json_ui/styling_helper.rb +8 -0
- data/app/helpers/glib/json_ui/view_builder.rb +8 -0
- data/app/helpers/glib/json_ui/view_builder/fields.rb +14 -3
- data/app/helpers/glib/json_ui/view_builder/panels.rb +5 -0
- data/app/models/glib/application_record.rb +4 -4
- data/app/views/json_ui/garage/forms/dynamic_select.json.jbuilder +2 -0
- data/app/views/json_ui/garage/forms/index.json.jbuilder +2 -5
- data/app/views/json_ui/garage/forms/{misc_two.json.jbuilder → online_participant1.json.jbuilder} +5 -1
- data/app/views/json_ui/garage/forms/online_participant2.json.jbuilder +25 -0
- data/app/views/json_ui/garage/forms/pickers.json.jbuilder +8 -6
- data/app/views/json_ui/garage/forms/selects.json.jbuilder +9 -1
- data/app/views/json_ui/garage/forms/timers.json.jbuilder +120 -0
- data/app/views/json_ui/garage/lists/index.json.jbuilder +6 -0
- data/app/views/json_ui/garage/panels/flow.json.jbuilder +10 -0
- data/app/views/json_ui/garage/panels/index.json.jbuilder +7 -1
- data/app/views/json_ui/garage/panels/ul.json.jbuilder +33 -0
- data/app/views/json_ui/garage/panels/web.json.jbuilder +15 -0
- data/app/views/json_ui/garage/views/controls.json.jbuilder +37 -0
- data/app/views/json_ui/garage/views/icons.json.jbuilder +1 -0
- data/app/views/json_ui/garage/views/index.json.jbuilder +3 -0
- data/app/views/json_ui/garage/views/misc.json.jbuilder +8 -8
- data/app/views/json_ui/garage/views/texts.json.jbuilder +0 -9
- metadata +7 -3
- data/app/views/json_ui/garage/forms/misc.json.jbuilder +0 -71
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2f4ae4213c1c8cd32dd3f1726335e8ad63f878ae480bc83792636f217b88cd5e
|
|
4
|
+
data.tar.gz: 8b395ee2a1f16ae8c9c9b0af8ecaf9aca9e03b2c0cb819d8217281229b2cbc56
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8c61abfa42bba5bcbd11d70ac9840b0e6aed1a1dae7b01e480615ff650161e330a4fae35937d7a2f1e9e513126b5f016a5828dfb85e91e362b80b4d7782a78dc
|
|
7
|
+
data.tar.gz: 6432a393428e3568832d9c8e7e07ba851ac0326479277bdce8e80c7969f22752e5f7634953349f707dec71b5801cebdc9aa2bb117e9b4eabbccf42b6ba881cbd
|
|
@@ -4,5 +4,15 @@ module Glib
|
|
|
4
4
|
keys ||= clazz.send("#{enum_field}s").keys
|
|
5
5
|
keys.map { |i| { text: clazz.glib_enum_humanize(enum_field, i), value: i } }
|
|
6
6
|
end
|
|
7
|
+
|
|
8
|
+
# See https://en.wikipedia.org/wiki/List_of_tz_database_time_zones and description
|
|
9
|
+
def glib_time_zone_options
|
|
10
|
+
ActiveSupport::TimeZone.all.sort { |a, b|
|
|
11
|
+
a.utc_offset <=> b.utc_offset
|
|
12
|
+
}.collect { |tz|
|
|
13
|
+
utc_offset = "#{tz.utc_offset >= 0 ? '+' : ''}#{tz.utc_offset / 60 / 60}h"
|
|
14
|
+
{ value: tz.tzinfo.identifier, text: "#{utc_offset} #{tz.name}" }
|
|
15
|
+
}
|
|
16
|
+
end
|
|
7
17
|
end
|
|
8
18
|
end
|
|
@@ -48,6 +48,8 @@ module Glib
|
|
|
48
48
|
class JsonUiElement
|
|
49
49
|
attr_reader :json, :page
|
|
50
50
|
|
|
51
|
+
@@_required_properties = {}
|
|
52
|
+
|
|
51
53
|
def initialize(json, page)
|
|
52
54
|
@json = json
|
|
53
55
|
@page = page
|
|
@@ -60,6 +62,11 @@ module Glib
|
|
|
60
62
|
args.each do |k, v|
|
|
61
63
|
send(k, v)
|
|
62
64
|
end
|
|
65
|
+
|
|
66
|
+
required_properties = @@_required_properties[self.class.component_name] || []
|
|
67
|
+
required_properties.each do |prop|
|
|
68
|
+
raise "Property required: #{prop}. Properties provided: #{args}. Component: #{self.class.component_name}" unless args[prop].present?
|
|
69
|
+
end
|
|
63
70
|
else
|
|
64
71
|
raise "Invalid properties: #{args}"
|
|
65
72
|
end
|
|
@@ -68,6 +75,10 @@ module Glib
|
|
|
68
75
|
end
|
|
69
76
|
|
|
70
77
|
private
|
|
78
|
+
def self.component_name
|
|
79
|
+
@component_name ||= self.name.sub('Glib::JsonUi::ActionBuilder::', '')
|
|
80
|
+
end
|
|
81
|
+
|
|
71
82
|
def self.any(propName)
|
|
72
83
|
define_method(propName) do |value|
|
|
73
84
|
json.set! propName, value
|
|
@@ -106,7 +117,7 @@ module Glib
|
|
|
106
117
|
define_method(propName) do |value|
|
|
107
118
|
if (value = value&.to_s)
|
|
108
119
|
if !Rails.env.production?
|
|
109
|
-
if !value.match /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/i
|
|
120
|
+
if !value.match /^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/i
|
|
110
121
|
raise "Invalid color: #{value}"
|
|
111
122
|
end
|
|
112
123
|
end
|
|
@@ -285,6 +296,10 @@ module Glib
|
|
|
285
296
|
end
|
|
286
297
|
end
|
|
287
298
|
|
|
299
|
+
def self.required(*prop_names)
|
|
300
|
+
@@_required_properties[self.component_name] = prop_names
|
|
301
|
+
end
|
|
302
|
+
|
|
288
303
|
def created
|
|
289
304
|
# To be overridden
|
|
290
305
|
end
|
|
@@ -98,11 +98,10 @@ class Glib::JsonUi::ViewBuilder
|
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
class Timer < Text
|
|
101
|
-
bool :forward
|
|
102
101
|
hash :actionCable
|
|
103
|
-
action :onZero
|
|
104
102
|
int :min
|
|
105
103
|
int :max
|
|
104
|
+
bool :forward
|
|
106
105
|
end
|
|
107
106
|
|
|
108
107
|
# Benefits of using `fields/submit` over `button`
|
|
@@ -129,7 +128,7 @@ class Glib::JsonUi::ViewBuilder
|
|
|
129
128
|
@value = value if value != Glib::Value::DEFAULT
|
|
130
129
|
end
|
|
131
130
|
|
|
132
|
-
# Where possible, use value instead of this
|
|
131
|
+
# TODO: Remove (deprecated). Where possible, use value instead of this
|
|
133
132
|
bool :checked
|
|
134
133
|
end
|
|
135
134
|
|
|
@@ -153,6 +152,18 @@ class Glib::JsonUi::ViewBuilder
|
|
|
153
152
|
hash :append
|
|
154
153
|
end
|
|
155
154
|
|
|
155
|
+
class TimeZone < AbstractField
|
|
156
|
+
include Glib::EnumHelper
|
|
157
|
+
|
|
158
|
+
# Override
|
|
159
|
+
def created
|
|
160
|
+
super
|
|
161
|
+
|
|
162
|
+
json.options glib_time_zone_options
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# TODO: Remove (deprecated)
|
|
156
167
|
class Autocomplete < AbstractField
|
|
157
168
|
array :options
|
|
158
169
|
# bool :readOnly
|
|
@@ -212,6 +212,7 @@ class Glib::JsonUi::ViewBuilder
|
|
|
212
212
|
end
|
|
213
213
|
|
|
214
214
|
class Flow < View
|
|
215
|
+
hash :innerPadding
|
|
215
216
|
views :childViews
|
|
216
217
|
end
|
|
217
218
|
|
|
@@ -237,6 +238,10 @@ class Glib::JsonUi::ViewBuilder
|
|
|
237
238
|
end
|
|
238
239
|
end
|
|
239
240
|
|
|
241
|
+
class Web < View
|
|
242
|
+
string :url
|
|
243
|
+
end
|
|
244
|
+
|
|
240
245
|
class Ul < View
|
|
241
246
|
views :childViews
|
|
242
247
|
|
|
@@ -5,13 +5,13 @@ module Glib
|
|
|
5
5
|
scope :created_asc, -> { order(created_at: :asc) }
|
|
6
6
|
scope :created_desc, -> { order(created_at: :desc) }
|
|
7
7
|
|
|
8
|
-
def glib_enum_humanize(enum_name)
|
|
9
|
-
self.class.glib_enum_humanize(enum_name, send(enum_name))
|
|
8
|
+
def glib_enum_humanize(enum_name, default_value = nil)
|
|
9
|
+
self.class.glib_enum_humanize(enum_name, send(enum_name), default_value)
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
def self.glib_enum_humanize(enum_name, enum_value)
|
|
12
|
+
def self.glib_enum_humanize(enum_name, enum_value, default_value = nil)
|
|
13
13
|
if enum_value
|
|
14
|
-
I18n.t("activerecord.attributes.#{model_name.i18n_key}.#{enum_name.to_s.pluralize}.#{enum_value}")
|
|
14
|
+
I18n.t("activerecord.attributes.#{model_name.i18n_key}.#{enum_name.to_s.pluralize}.#{enum_value}", default: default_value)
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
end
|
|
@@ -6,6 +6,8 @@ render "#{@path_prefix}/nav_menu", json: json, page: page
|
|
|
6
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.h2 text: 'Dynamic Select'
|
|
8
8
|
form.spacer height: 6
|
|
9
|
+
form.label text: 'Dynamically loads options from the server. Useful for a huge list (e.g. 1000+ items)'
|
|
10
|
+
form.spacer height: 14
|
|
9
11
|
|
|
10
12
|
form.fields_dynamicSelect name: 'user[primary_language]', width: 'matchParent', label: 'Primary Language',
|
|
11
13
|
selectedOptions: [ { value: 'id3', text: 'Item 3' } ],
|
|
@@ -62,11 +62,8 @@ page.list sections: [
|
|
|
62
62
|
template.thumbnail title: 'Ratings', onClick: ->(action) do
|
|
63
63
|
action.windows_open url: json_ui_garage_url(path: 'forms/ratings')
|
|
64
64
|
end
|
|
65
|
-
template.thumbnail title: '
|
|
66
|
-
action.windows_open url: json_ui_garage_url(path: 'forms/
|
|
67
|
-
end
|
|
68
|
-
template.thumbnail title: 'Misc 2', onClick: ->(action) do
|
|
69
|
-
action.windows_open url: json_ui_garage_url(path: 'forms/misc_two')
|
|
65
|
+
template.thumbnail title: 'Timers', onClick: ->(action) do
|
|
66
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/timers')
|
|
70
67
|
end
|
|
71
68
|
end
|
|
72
69
|
end, ->(section) do
|
data/app/views/json_ui/garage/forms/{misc_two.json.jbuilder → online_participant1.json.jbuilder}
RENAMED
|
@@ -16,6 +16,10 @@ json.actionCable online_socket_config
|
|
|
16
16
|
|
|
17
17
|
page.on load: ->(action) do
|
|
18
18
|
action.timeouts_set interval: 1000, repeat: true, onTimeout: ->(subaction) do
|
|
19
|
-
subaction.cables_push channel: online_channel, event: event, payload: { status: true, user_id: first_user.id, reset_value:
|
|
19
|
+
subaction.cables_push channel: online_channel, event: event, payload: { status: true, user_id: first_user.id, reset_value: 3 }
|
|
20
20
|
end
|
|
21
21
|
end
|
|
22
|
+
|
|
23
|
+
page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
|
|
24
|
+
scroll.label text: 'Participant One is now online'
|
|
25
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
json.title 'Forms'
|
|
2
|
+
|
|
3
|
+
page = json_ui_page json
|
|
4
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page
|
|
5
|
+
|
|
6
|
+
online_channel = 'OnlineChannel'
|
|
7
|
+
event = 'online_status'
|
|
8
|
+
second_user = User.second
|
|
9
|
+
|
|
10
|
+
online_socket_config = {
|
|
11
|
+
channel: online_channel,
|
|
12
|
+
filterKey: nil,
|
|
13
|
+
params: {}
|
|
14
|
+
}
|
|
15
|
+
json.actionCable online_socket_config
|
|
16
|
+
|
|
17
|
+
page.on load: ->(action) do
|
|
18
|
+
action.timeouts_set interval: 1000, repeat: true, onTimeout: ->(subaction) do
|
|
19
|
+
subaction.cables_push channel: online_channel, event: event, payload: { status: true, user_id: second_user.id, reset_value: 3 }
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
|
|
24
|
+
scroll.label text: 'Participant Two is now online'
|
|
25
|
+
end
|
|
@@ -30,12 +30,14 @@ page.form \
|
|
|
30
30
|
name: 'user[employer]',
|
|
31
31
|
checkValue: 1,
|
|
32
32
|
label: 'I am an employer (no default value)'
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
33
|
+
|
|
34
|
+
# Use `switch` component instead.
|
|
35
|
+
# form.fields_check \
|
|
36
|
+
# name: 'user[enabled]',
|
|
37
|
+
# styleClass: 'switch',
|
|
38
|
+
# checkValue: true,
|
|
39
|
+
# label: 'Enable',
|
|
40
|
+
# value: 'true'
|
|
39
41
|
|
|
40
42
|
form.spacer height: 20
|
|
41
43
|
form.h2 text: 'Date/Time'
|
|
@@ -72,7 +72,15 @@ page.form url: json_ui_garage_url(path: 'forms/generic_post'), method: 'post', p
|
|
|
72
72
|
form.fields_select name: 'user[mixed_default][]', width: 'matchParent', label: 'Mixed Default', options: languages.map { |k, v| { value: k, text: v } }, value: ['', 'specified', nil], multiple: true
|
|
73
73
|
|
|
74
74
|
form.spacer height: 20
|
|
75
|
-
form.h2 text: '
|
|
75
|
+
form.h2 text: 'Timezone selection'
|
|
76
|
+
form.spacer height: 6
|
|
77
|
+
form.label text: 'The select field defaults to the device\'s time zone.'
|
|
78
|
+
form.spacer height: 6
|
|
79
|
+
form.fields_timeZone name: 'user[time_zone]', width: 'matchParent', label: 'Time Zone'
|
|
80
|
+
|
|
81
|
+
# TODO: Remove
|
|
82
|
+
form.spacer height: 20
|
|
83
|
+
form.h2 text: 'Autocomplete (select with manual entry) -- DEPRECATED: Confusing UX, promote bad backend design'
|
|
76
84
|
form.spacer height: 6
|
|
77
85
|
skills = ['Singing', 'Dancing', 'Fighting']
|
|
78
86
|
form.fields_autocomplete name: 'user[skill]', width: 'matchParent', label: 'Skill', options: skills, value: 'Singing'
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
json.title 'Forms'
|
|
2
|
+
|
|
3
|
+
page = json_ui_page json
|
|
4
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page
|
|
5
|
+
|
|
6
|
+
online_channel = 'OnlineChannel'
|
|
7
|
+
first_user = User.first
|
|
8
|
+
second_user = User.second
|
|
9
|
+
|
|
10
|
+
page.form url: json_ui_garage_url(path: 'forms/generic_post'), method: 'post', padding: glib_json_padding_body, childViews: ->(form) do
|
|
11
|
+
form.spacer height: 20
|
|
12
|
+
form.h2 text: 'Standard (Backward)'
|
|
13
|
+
form.spacer height: 6
|
|
14
|
+
form.fields_timer \
|
|
15
|
+
width: 160,
|
|
16
|
+
styleClasses: ['outlined'],
|
|
17
|
+
label: 'Timer',
|
|
18
|
+
name: 'user[timer]',
|
|
19
|
+
value: 60,
|
|
20
|
+
min: 30
|
|
21
|
+
|
|
22
|
+
form.spacer height: 20
|
|
23
|
+
form.h2 text: 'Stop Watch (Forward)'
|
|
24
|
+
form.spacer height: 6
|
|
25
|
+
form.fields_timer \
|
|
26
|
+
width: 160,
|
|
27
|
+
styleClasses: ['outlined'],
|
|
28
|
+
label: 'Stop Watch',
|
|
29
|
+
name: 'user[stop_watch]',
|
|
30
|
+
value: 10,
|
|
31
|
+
max: 20,
|
|
32
|
+
forward: true
|
|
33
|
+
|
|
34
|
+
form.spacer height: 20
|
|
35
|
+
form.h2 text: 'Reset timer by ActionCable'
|
|
36
|
+
online_participant1_config = {
|
|
37
|
+
channel: online_channel,
|
|
38
|
+
filterKey: first_user.id
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
form.fields_timer \
|
|
42
|
+
width: 120,
|
|
43
|
+
actionCable: online_participant1_config,
|
|
44
|
+
name: 'user[online_timer1]',
|
|
45
|
+
value: 3,
|
|
46
|
+
min: 0
|
|
47
|
+
|
|
48
|
+
form.label \
|
|
49
|
+
text: 'Participant One is online',
|
|
50
|
+
color: glib_color_success,
|
|
51
|
+
showIf: {
|
|
52
|
+
">": [
|
|
53
|
+
{
|
|
54
|
+
"var": 'user[online_timer1]'
|
|
55
|
+
},
|
|
56
|
+
0
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
form.label \
|
|
61
|
+
text: 'Participant One is offline',
|
|
62
|
+
color: glib_color_error,
|
|
63
|
+
showIf: {
|
|
64
|
+
"<=": [
|
|
65
|
+
{
|
|
66
|
+
"var": 'user[online_timer1]'
|
|
67
|
+
},
|
|
68
|
+
0
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
form.spacer height: 10
|
|
73
|
+
form.label text: 'Open Participant One', onClick: ->(action) do
|
|
74
|
+
action.windows_openWeb url: json_ui_garage_url(path: 'forms/online_participant1')
|
|
75
|
+
end
|
|
76
|
+
form.spacer height: 20
|
|
77
|
+
|
|
78
|
+
online_participant2_config = {
|
|
79
|
+
channel: online_channel,
|
|
80
|
+
filterKey: second_user.id
|
|
81
|
+
}
|
|
82
|
+
form.fields_timer \
|
|
83
|
+
width: 120,
|
|
84
|
+
actionCable: online_participant2_config,
|
|
85
|
+
name: 'user[online_timer2]',
|
|
86
|
+
value: 3,
|
|
87
|
+
min: 0
|
|
88
|
+
|
|
89
|
+
form.label \
|
|
90
|
+
text: 'Participant Two is online',
|
|
91
|
+
color: glib_color_success,
|
|
92
|
+
showIf: {
|
|
93
|
+
">": [
|
|
94
|
+
{
|
|
95
|
+
"var": 'user[online_timer2]'
|
|
96
|
+
},
|
|
97
|
+
0
|
|
98
|
+
]
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
form.label \
|
|
102
|
+
text: 'Participant Two is offline',
|
|
103
|
+
color: glib_color_error,
|
|
104
|
+
showIf: {
|
|
105
|
+
"<=": [
|
|
106
|
+
{
|
|
107
|
+
"var": 'user[online_timer2]'
|
|
108
|
+
},
|
|
109
|
+
0
|
|
110
|
+
]
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
form.spacer height: 10
|
|
114
|
+
form.label text: 'Open Participant Two', onClick: ->(action) do
|
|
115
|
+
action.windows_openWeb url: json_ui_garage_url(path: 'forms/online_participant2')
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
form.spacer height: 40
|
|
119
|
+
form.fields_submit text: 'Submit'
|
|
120
|
+
end
|
|
@@ -4,6 +4,12 @@ json_ui_page json do |page|
|
|
|
4
4
|
render "#{@path_prefix}/nav_menu", json: json, page: page, top_nav: true
|
|
5
5
|
|
|
6
6
|
page.list firstSection: ->(section) do
|
|
7
|
+
section.header padding: glib_json_padding_list, childViews: ->(header) do
|
|
8
|
+
header.label text: 'The List panel is useful for displaying a large number of items that are uniform, which is especially important in mobile apps because the rows can be reused for efficiency.'
|
|
9
|
+
header.spacer height: 6
|
|
10
|
+
header.label text: 'So, following the mobile-first paradigm, do not ever display large numbers of items using other components.'
|
|
11
|
+
end
|
|
12
|
+
|
|
7
13
|
section.rows builder: ->(template) do
|
|
8
14
|
template.thumbnail icon: 'list', title: 'Templating', onClick: ->(action) do
|
|
9
15
|
action.windows_open url: json_ui_garage_url(path: 'lists/templating')
|
|
@@ -29,6 +29,16 @@ page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
|
|
|
29
29
|
panel.button text: '5'
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
+
scroll.label text: "\n"
|
|
33
|
+
scroll.h1 text: 'Inner Paddings'
|
|
34
|
+
scroll.panels_flow innerPadding: { top: 10, bottom: 10, left: 10, right: 10 }, width: 300, backgroundColor: '#b3bac2', childViews: ->(panel) do
|
|
35
|
+
panel.button text: '1'
|
|
36
|
+
panel.button text: '2'
|
|
37
|
+
panel.button text: '3'
|
|
38
|
+
panel.button text: '4'
|
|
39
|
+
panel.button text: '5'
|
|
40
|
+
end
|
|
41
|
+
|
|
32
42
|
# scroll.label text: "\n"
|
|
33
43
|
# scroll.h1 text: 'Alignments'
|
|
34
44
|
# scroll.panels_horizontal align: 'top', childViews: ->(panel) do
|
|
@@ -27,6 +27,10 @@ json_ui_page json do |page|
|
|
|
27
27
|
template.thumbnail title: 'Responsive', subtitle: 'Arrange *column panels* horizontally using flex', onClick: ->(action) do
|
|
28
28
|
action.windows_open url: json_ui_garage_url(path: 'panels/responsive')
|
|
29
29
|
end
|
|
30
|
+
template.thumbnail title: 'Unordered List', subtitle: 'Bullet points similar to HTML\'s <ul> tag', onClick: ->(action) do
|
|
31
|
+
action.windows_open url: json_ui_garage_url(path: 'panels/ul')
|
|
32
|
+
end
|
|
33
|
+
|
|
30
34
|
|
|
31
35
|
end
|
|
32
36
|
end, ->(section) do
|
|
@@ -82,7 +86,6 @@ json_ui_page json do |page|
|
|
|
82
86
|
template.thumbnail title: 'Column', subtitle: 'Adds control over layout inside a responsive panel', onClick: ->(action) do
|
|
83
87
|
action.windows_open url: json_ui_garage_url(path: 'panels/responsive')
|
|
84
88
|
end
|
|
85
|
-
|
|
86
89
|
end
|
|
87
90
|
end, ->(section) do
|
|
88
91
|
section.header padding: glib_json_padding_list, childViews: ->(header) do
|
|
@@ -93,6 +96,9 @@ json_ui_page json do |page|
|
|
|
93
96
|
template.thumbnail title: 'Custom', onClick: ->(action) do
|
|
94
97
|
action.windows_open url: json_ui_garage_url(path: 'panels/custom')
|
|
95
98
|
end
|
|
99
|
+
template.thumbnail title: 'Web', onClick: ->(action) do
|
|
100
|
+
action.windows_open url: json_ui_garage_url(path: 'panels/web')
|
|
101
|
+
end
|
|
96
102
|
|
|
97
103
|
end
|
|
98
104
|
end, ->(section) do
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
json.title 'Unordered List'
|
|
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
|
+
scroll.h2 text: 'Standard Usage'
|
|
8
|
+
scroll.spacer height: 6
|
|
9
|
+
scroll.panels_ul childViews: ->(ul) do
|
|
10
|
+
ul.button text: 'Button', styleClass: 'link', onClick: ->(action) do
|
|
11
|
+
action.windows_open url: json_ui_garage_url(path: 'home/blank')
|
|
12
|
+
end
|
|
13
|
+
ul.label text: 'Label'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
scroll.spacer height: 14
|
|
17
|
+
scroll.h2 text: 'Breadcrumbs'
|
|
18
|
+
scroll.spacer height: 6
|
|
19
|
+
scroll.panels_ul \
|
|
20
|
+
width: 'matchParent',
|
|
21
|
+
backgroundColor: '#eeeeee',
|
|
22
|
+
padding: { top: 10, right: 20, bottom: 10, left: 20 },
|
|
23
|
+
styleClass: 'breadcrumbs',
|
|
24
|
+
childViews: ->(ul) do
|
|
25
|
+
ul.button text: 'Level 1', styleClass: 'link', onClick: ->(action) do
|
|
26
|
+
action.windows_open url: json_ui_garage_url(path: 'home/blank')
|
|
27
|
+
end
|
|
28
|
+
ul.button text: 'Level 2', styleClass: 'link', onClick: ->(action) do
|
|
29
|
+
action.windows_open url: json_ui_garage_url(path: 'home/blank')
|
|
30
|
+
end
|
|
31
|
+
ul.label text: 'Level 3'
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
json.title 'Panels'
|
|
2
|
+
|
|
3
|
+
page = json_ui_page json
|
|
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: 'Web View'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
page.body height: 'matchParent', padding: glib_json_padding_body, childViews: ->(body) do
|
|
11
|
+
body.panels_web \
|
|
12
|
+
width: 'matchParent',
|
|
13
|
+
height: 'matchParent',
|
|
14
|
+
url: 'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf'
|
|
15
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
scroll.h2 text: 'Button'
|
|
8
|
+
scroll.spacer height: 6
|
|
9
|
+
scroll.button text: 'Click me', onClick: ->(action) do
|
|
10
|
+
action.dialogs_alert message: 'Perform action'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
scroll.spacer height: 20
|
|
14
|
+
scroll.h2 text: 'Chip'
|
|
15
|
+
scroll.spacer height: 6
|
|
16
|
+
scroll.chip styleClass: 'success', text: 'pending'
|
|
17
|
+
scroll.spacer height: 6
|
|
18
|
+
scroll.chip text: 'Skills', onClick: ->(action) do
|
|
19
|
+
action.dialogs_alert message: 'Perform action'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
scroll.spacer height: 20
|
|
23
|
+
scroll.h2 text: 'Switch'
|
|
24
|
+
scroll.spacer height: 6
|
|
25
|
+
scroll.switch \
|
|
26
|
+
text: 'Email notification',
|
|
27
|
+
onEnabled: ->(action) do
|
|
28
|
+
action.dialogs_alert message: 'Enabled'
|
|
29
|
+
end
|
|
30
|
+
scroll.switch \
|
|
31
|
+
enabled: true,
|
|
32
|
+
text: 'Push notification',
|
|
33
|
+
onDisabled: ->(action) do
|
|
34
|
+
action.dialogs_alert message: 'Disabled'
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
end
|
|
@@ -13,6 +13,9 @@ json_ui_page json do |page|
|
|
|
13
13
|
template.thumbnail title: 'Texts', onClick: ->(action) do
|
|
14
14
|
action.windows_open url: json_ui_garage_url(path: 'views/texts')
|
|
15
15
|
end
|
|
16
|
+
template.thumbnail title: 'Controls', onClick: ->(action) do
|
|
17
|
+
action.windows_open url: json_ui_garage_url(path: 'views/controls')
|
|
18
|
+
end
|
|
16
19
|
template.thumbnail title: 'Images', onClick: ->(action) do
|
|
17
20
|
action.windows_open url: json_ui_garage_url(path: 'views/images')
|
|
18
21
|
end
|
|
@@ -5,14 +5,14 @@ json_ui_page json do |page|
|
|
|
5
5
|
|
|
6
6
|
page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
|
|
7
7
|
|
|
8
|
-
scroll.h2 text: 'Unordered List'
|
|
9
|
-
scroll.spacer height: 6
|
|
10
|
-
scroll.panels_ul childViews: ->(ul) do
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
end
|
|
8
|
+
# scroll.h2 text: 'Unordered List'
|
|
9
|
+
# scroll.spacer height: 6
|
|
10
|
+
# scroll.panels_ul childViews: ->(ul) do
|
|
11
|
+
# ul.button text: 'Button', styleClass: 'link', onClick: ->(action) do
|
|
12
|
+
# action.windows_open url: json_ui_garage_url(path: 'home/blank')
|
|
13
|
+
# end
|
|
14
|
+
# ul.label text: 'Label'
|
|
15
|
+
# end
|
|
16
16
|
|
|
17
17
|
scroll.spacer height: 20
|
|
18
18
|
scroll.h2 text: 'Time'
|
|
@@ -32,13 +32,4 @@ page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
|
|
|
32
32
|
' comes from a line in section 1.10.32.' + "\n\n" +
|
|
33
33
|
'The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from "de Finibus Bonorum et Malorum"'\
|
|
34
34
|
' by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.'
|
|
35
|
-
|
|
36
|
-
scroll.spacer height: 20
|
|
37
|
-
scroll.h2 text: 'Chip'
|
|
38
|
-
scroll.spacer height: 6
|
|
39
|
-
scroll.chip styleClass: 'success', text: 'pending'
|
|
40
|
-
scroll.spacer height: 6
|
|
41
|
-
scroll.chip text: 'Skills', onClick: ->(action) do
|
|
42
|
-
action.dialogs_alert message: 'Perform action'
|
|
43
|
-
end
|
|
44
35
|
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.73
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- ''
|
|
@@ -146,9 +146,9 @@ files:
|
|
|
146
146
|
- app/views/json_ui/garage/forms/generic_post.json.jbuilder
|
|
147
147
|
- app/views/json_ui/garage/forms/get_request.json.jbuilder
|
|
148
148
|
- app/views/json_ui/garage/forms/index.json.jbuilder
|
|
149
|
-
- app/views/json_ui/garage/forms/misc.json.jbuilder
|
|
150
|
-
- app/views/json_ui/garage/forms/misc_two.json.jbuilder
|
|
151
149
|
- app/views/json_ui/garage/forms/new_rich_text.json.jbuilder
|
|
150
|
+
- app/views/json_ui/garage/forms/online_participant1.json.jbuilder
|
|
151
|
+
- app/views/json_ui/garage/forms/online_participant2.json.jbuilder
|
|
152
152
|
- app/views/json_ui/garage/forms/pickers.json.jbuilder
|
|
153
153
|
- app/views/json_ui/garage/forms/ratings.json.jbuilder
|
|
154
154
|
- app/views/json_ui/garage/forms/rich_text.json.jbuilder
|
|
@@ -160,6 +160,7 @@ files:
|
|
|
160
160
|
- app/views/json_ui/garage/forms/submission_indicator.json.jbuilder
|
|
161
161
|
- app/views/json_ui/garage/forms/submission_indicator_post.json.jbuilder
|
|
162
162
|
- app/views/json_ui/garage/forms/text_validation.json.jbuilder
|
|
163
|
+
- app/views/json_ui/garage/forms/timers.json.jbuilder
|
|
163
164
|
- app/views/json_ui/garage/home/blank.json.jbuilder
|
|
164
165
|
- app/views/json_ui/garage/home/index.json.jbuilder
|
|
165
166
|
- app/views/json_ui/garage/home/slow.json.jbuilder
|
|
@@ -196,7 +197,9 @@ files:
|
|
|
196
197
|
- app/views/json_ui/garage/panels/outlined.json.jbuilder
|
|
197
198
|
- app/views/json_ui/garage/panels/responsive.json.jbuilder
|
|
198
199
|
- app/views/json_ui/garage/panels/split.json.jbuilder
|
|
200
|
+
- app/views/json_ui/garage/panels/ul.json.jbuilder
|
|
199
201
|
- app/views/json_ui/garage/panels/vertical.json.jbuilder
|
|
202
|
+
- app/views/json_ui/garage/panels/web.json.jbuilder
|
|
200
203
|
- app/views/json_ui/garage/services/dynamic_text.json.jbuilder
|
|
201
204
|
- app/views/json_ui/garage/services/image.json.jbuilder
|
|
202
205
|
- app/views/json_ui/garage/services/index.json.jbuilder
|
|
@@ -211,6 +214,7 @@ files:
|
|
|
211
214
|
- app/views/json_ui/garage/views/banners.json.jbuilder
|
|
212
215
|
- app/views/json_ui/garage/views/calendar_data.json.jbuilder
|
|
213
216
|
- app/views/json_ui/garage/views/charts.json.jbuilder
|
|
217
|
+
- app/views/json_ui/garage/views/controls.json.jbuilder
|
|
214
218
|
- app/views/json_ui/garage/views/icon_names.json.jbuilder
|
|
215
219
|
- app/views/json_ui/garage/views/icons.json.jbuilder
|
|
216
220
|
- app/views/json_ui/garage/views/images.json.jbuilder
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
json.title 'Forms'
|
|
2
|
-
|
|
3
|
-
page = json_ui_page json
|
|
4
|
-
render "#{@path_prefix}/nav_menu", json: json, page: page
|
|
5
|
-
|
|
6
|
-
online_channel = 'OnlineChannel'
|
|
7
|
-
first_user = User.first
|
|
8
|
-
|
|
9
|
-
page.form \
|
|
10
|
-
url: json_ui_garage_url(path: 'forms/generic_post'),
|
|
11
|
-
method: 'post',
|
|
12
|
-
padding: glib_json_padding_body,
|
|
13
|
-
childViews: ->(form) do
|
|
14
|
-
|
|
15
|
-
form.spacer height: 20
|
|
16
|
-
form.h2 text: 'Standard (Backward)'
|
|
17
|
-
form.spacer height: 6
|
|
18
|
-
form.fields_timer \
|
|
19
|
-
name: 'user[timer]',
|
|
20
|
-
value: 60,
|
|
21
|
-
min: 30
|
|
22
|
-
|
|
23
|
-
form.spacer height: 20
|
|
24
|
-
form.h2 text: 'Stop Watch (Forward)'
|
|
25
|
-
form.spacer height: 6
|
|
26
|
-
form.fields_timer \
|
|
27
|
-
name: 'user[stop_watch]',
|
|
28
|
-
value: 10,
|
|
29
|
-
max: 20,
|
|
30
|
-
forward: true
|
|
31
|
-
|
|
32
|
-
form.spacer height: 20
|
|
33
|
-
form.h2 text: 'Reset timer by ActionCable'
|
|
34
|
-
online_socket_config = {
|
|
35
|
-
channel: online_channel,
|
|
36
|
-
filterKey: first_user.id,
|
|
37
|
-
params: {
|
|
38
|
-
conversation: 2
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
form.fields_timer \
|
|
43
|
-
actionCable: online_socket_config,
|
|
44
|
-
name: 'user[online_timer]',
|
|
45
|
-
value: 10
|
|
46
|
-
|
|
47
|
-
form.label \
|
|
48
|
-
text: 'Participant is online',
|
|
49
|
-
showIf: {
|
|
50
|
-
">": [
|
|
51
|
-
{
|
|
52
|
-
"var": 'user[online_timer]'
|
|
53
|
-
},
|
|
54
|
-
0
|
|
55
|
-
]
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
form.label \
|
|
59
|
-
text: 'Participant is offline',
|
|
60
|
-
showIf: {
|
|
61
|
-
"<=": [
|
|
62
|
-
{
|
|
63
|
-
"var": 'user[online_timer]'
|
|
64
|
-
},
|
|
65
|
-
0
|
|
66
|
-
]
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
form.spacer height: 20
|
|
70
|
-
form.fields_submit text: 'Submit'
|
|
71
|
-
end
|