glib-web 0.5.60 → 0.5.66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/channels/glib/channel/online_channel.rb +29 -0
- data/app/helpers/glib/json_ui/view_builder.rb +21 -0
- data/app/helpers/glib/json_ui/view_builder/banners.rb +1 -0
- data/app/helpers/glib/json_ui/view_builder/fields.rb +4 -0
- data/app/views/json_ui/garage/actions/_timeouts.json.jbuilder +6 -0
- data/app/views/json_ui/garage/forms/index.json.jbuilder +6 -0
- data/app/views/json_ui/garage/forms/misc.json.jbuilder +29 -0
- data/app/views/json_ui/garage/forms/pickers.json.jbuilder +0 -23
- data/app/views/json_ui/garage/forms/ratings.json.jbuilder +49 -0
- data/app/views/json_ui/garage/forms/show_hide.json.jbuilder +29 -4
- data/app/views/json_ui/garage/lists/edit_actions.json.jbuilder +36 -28
- data/app/views/json_ui/garage/notifications/action_cable.json.jbuilder +31 -15
- data/app/views/json_ui/garage/views/icon_names.json.jbuilder +1450 -0
- data/app/views/json_ui/garage/views/icons.json.jbuilder +6 -1442
- data/app/views/json_ui/garage/views/index.json.jbuilder +15 -5
- metadata +5 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7c51f81f729ea985bfb0b33ab4df25a6f614acf722ff529bcc6405518caa3c38
|
4
|
+
data.tar.gz: f7c3aa756c17b0a4b36d013b2523b3b25194505af2aa4baab0cfac10b1011dd8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a5419f4136f708d8e069884e54e63f6fbf9e73f6d64a22b21548ef06f42a26a327cada5f8731e1616d94f9cb3aee6978d35f4a5c81a8a6d7d6861b58cdfeb4f5
|
7
|
+
data.tar.gz: a77c0ea82bf85bf3f6218448224666b0b569d9cafaa2bd1fa8d9520d34f9caf8421a2b2e9de92f3821761d52ab67ac5101cb13e9401f9a1478d63e4b99a0be2c
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Glib
|
2
|
+
module Channel
|
3
|
+
class OnlineChannel < ApplicationCable::Channel
|
4
|
+
class << self
|
5
|
+
attr_accessor :channel_name
|
6
|
+
end
|
7
|
+
|
8
|
+
def channel_name
|
9
|
+
self.class.channel_name
|
10
|
+
end
|
11
|
+
|
12
|
+
def subscribed
|
13
|
+
stream_from "#{self.class.channel_name}_#{params['conversation_id']}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def online_status(data)
|
17
|
+
ActionCable.server.broadcast \
|
18
|
+
"#{self.class.channel_name}_#{params['conversation_id']}",
|
19
|
+
action: {
|
20
|
+
action: 'component/set',
|
21
|
+
name: User.find(data['user_id']).full_name,
|
22
|
+
status: data['status'],
|
23
|
+
user_id: data['user_id'],
|
24
|
+
event: 'online_status'
|
25
|
+
}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -129,8 +129,29 @@ module Glib
|
|
129
129
|
end
|
130
130
|
|
131
131
|
class Icon < View
|
132
|
+
# TODO: Remove later. Deprecated.
|
132
133
|
icon :spec
|
134
|
+
|
133
135
|
action :onClick
|
136
|
+
color :color
|
137
|
+
|
138
|
+
def name(value)
|
139
|
+
@name = value
|
140
|
+
end
|
141
|
+
|
142
|
+
def size(value)
|
143
|
+
@size = value
|
144
|
+
end
|
145
|
+
|
146
|
+
# Override
|
147
|
+
def created
|
148
|
+
if @name
|
149
|
+
json.material do
|
150
|
+
json.name @name
|
151
|
+
json.size @size if @size
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
134
155
|
end
|
135
156
|
|
136
157
|
# class Banner < View
|
@@ -97,6 +97,10 @@ class Glib::JsonUi::ViewBuilder
|
|
97
97
|
class Hidden < Text
|
98
98
|
end
|
99
99
|
|
100
|
+
class Timer < Text
|
101
|
+
bool :forward
|
102
|
+
end
|
103
|
+
|
100
104
|
# Benefits of using `fields/submit` over `button`
|
101
105
|
# - On the web, it translates to input[type=submit] which provides builtin functionality such as
|
102
106
|
# submitting upon pressing enter on a field and remembering values for autofill.
|
@@ -9,6 +9,12 @@ section.rows builder: ->(template) do
|
|
9
9
|
subaction.snackbars_alert message: 'Timeout elapsed'
|
10
10
|
end
|
11
11
|
end
|
12
|
+
|
13
|
+
template.thumbnail title: 'timeouts/set with repeat', onClick: ->(action) do
|
14
|
+
action.timeouts_set interval: 1000, repeat: true, onTimeout: ->(subaction) do
|
15
|
+
subaction.snackbars_alert message: 'Timeout elapsed every 1 second'
|
16
|
+
end
|
17
|
+
end
|
12
18
|
end
|
13
19
|
|
14
20
|
# section.rows builder: ->(template) do
|
@@ -59,6 +59,12 @@ page.list sections: [
|
|
59
59
|
template.thumbnail title: 'Floating Submit', onClick: ->(action) do
|
60
60
|
action.windows_open url: json_ui_garage_url(path: 'forms/floating_submit')
|
61
61
|
end
|
62
|
+
template.thumbnail title: 'Ratings', onClick: ->(action) do
|
63
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/ratings')
|
64
|
+
end
|
65
|
+
template.thumbnail title: 'Misc', onClick: ->(action) do
|
66
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/misc')
|
67
|
+
end
|
62
68
|
end
|
63
69
|
end, ->(section) do
|
64
70
|
section.header padding: glib_json_padding_list, childViews: ->(header) do
|
@@ -0,0 +1,29 @@
|
|
1
|
+
json.title 'Forms'
|
2
|
+
|
3
|
+
page = json_ui_page json
|
4
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page
|
5
|
+
|
6
|
+
page.form \
|
7
|
+
url: json_ui_garage_url(path: 'forms/generic_post'),
|
8
|
+
method: 'post',
|
9
|
+
padding: glib_json_padding_body,
|
10
|
+
childViews: ->(form) do
|
11
|
+
|
12
|
+
form.spacer height: 20
|
13
|
+
form.h2 text: 'Standard (Backward)'
|
14
|
+
form.spacer height: 6
|
15
|
+
form.fields_timer \
|
16
|
+
name: 'user[timer]',
|
17
|
+
value: 60
|
18
|
+
|
19
|
+
form.spacer height: 20
|
20
|
+
form.h2 text: 'Stop Watch (Forward)'
|
21
|
+
form.spacer height: 6
|
22
|
+
form.fields_timer \
|
23
|
+
name: 'user[stop_watch]',
|
24
|
+
value: 10,
|
25
|
+
forward: true
|
26
|
+
|
27
|
+
form.spacer height: 20
|
28
|
+
form.fields_submit text: 'Submit'
|
29
|
+
end
|
@@ -74,29 +74,6 @@ page.form \
|
|
74
74
|
longitudeField: { view: 'fields/text', name: 'user[longitude]', label: 'Long', value: 151.21078710000006, readOnly: true },
|
75
75
|
zoomField: { view: 'fields/text', name: 'user[zoom]', label: 'Zoom' }
|
76
76
|
|
77
|
-
form.spacer height: 20
|
78
|
-
form.h2 text: 'Rating'
|
79
|
-
form.spacer height: 6
|
80
|
-
form.fields_rating \
|
81
|
-
name: 'user[rating_summary1]',
|
82
|
-
value: 1,
|
83
|
-
color: 'primary'
|
84
|
-
form.fields_rating \
|
85
|
-
name: 'user[rating_summary2]',
|
86
|
-
value: 1.5,
|
87
|
-
halfIncrements: true,
|
88
|
-
color: 'secondary'
|
89
|
-
form.fields_rating \
|
90
|
-
name: 'user[rating_summary3]',
|
91
|
-
value: 2,
|
92
|
-
color: 'ternary',
|
93
|
-
size: 35
|
94
|
-
form.fields_rating \
|
95
|
-
name: 'user[rating_summary4]',
|
96
|
-
value: 3,
|
97
|
-
readOnly: true,
|
98
|
-
size: 40
|
99
|
-
|
100
77
|
form.spacer height: 20
|
101
78
|
form.fields_submit text: 'Submit'
|
102
79
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
json.title 'Forms'
|
2
|
+
|
3
|
+
page = json_ui_page json
|
4
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page
|
5
|
+
|
6
|
+
page.form \
|
7
|
+
url: json_ui_garage_url(path: 'forms/generic_post'),
|
8
|
+
method: 'post',
|
9
|
+
padding: glib_json_padding_body,
|
10
|
+
childViews: ->(form) do
|
11
|
+
|
12
|
+
form.spacer height: 20
|
13
|
+
form.h2 text: 'Full Increments'
|
14
|
+
form.spacer height: 6
|
15
|
+
form.fields_rating \
|
16
|
+
name: 'user[rating_summary1]',
|
17
|
+
value: 1,
|
18
|
+
color: 'primary'
|
19
|
+
|
20
|
+
form.spacer height: 20
|
21
|
+
form.h2 text: 'Half Increments'
|
22
|
+
form.spacer height: 6
|
23
|
+
form.fields_rating \
|
24
|
+
name: 'user[rating_summary2]',
|
25
|
+
value: 1.5,
|
26
|
+
halfIncrements: true,
|
27
|
+
color: 'secondary'
|
28
|
+
|
29
|
+
form.spacer height: 20
|
30
|
+
form.h2 text: 'Custom Size'
|
31
|
+
form.spacer height: 6
|
32
|
+
form.fields_rating \
|
33
|
+
name: 'user[rating_summary3]',
|
34
|
+
value: 2,
|
35
|
+
color: 'ternary',
|
36
|
+
size: 35
|
37
|
+
|
38
|
+
form.spacer height: 20
|
39
|
+
form.h2 text: 'Read Only'
|
40
|
+
form.spacer height: 6
|
41
|
+
form.fields_rating \
|
42
|
+
name: 'user[rating_summary4]',
|
43
|
+
value: 3,
|
44
|
+
readOnly: true,
|
45
|
+
size: 40
|
46
|
+
|
47
|
+
form.spacer height: 20
|
48
|
+
form.fields_submit text: 'Submit'
|
49
|
+
end
|
@@ -5,7 +5,7 @@ render "#{@path_prefix}/nav_menu", json: json, page: page
|
|
5
5
|
|
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.h1 text: 'Text'
|
8
|
-
form.fields_password name: 'user[text1]', width: 'matchParent', label: 'Type "show"'
|
8
|
+
form.fields_password name: 'user[text1]', width: 'matchParent', label: 'Type "show"', value: ''
|
9
9
|
form.label text: 'Typed', showIf: {
|
10
10
|
"==": [
|
11
11
|
{
|
@@ -14,6 +14,14 @@ page.form url: json_ui_garage_url(path: 'forms/generic_post'), method: 'post', p
|
|
14
14
|
'show'
|
15
15
|
]
|
16
16
|
}
|
17
|
+
form.label text: 'Type something', showIf: {
|
18
|
+
"==": [
|
19
|
+
{
|
20
|
+
"var": 'user[text1]'
|
21
|
+
},
|
22
|
+
''
|
23
|
+
]
|
24
|
+
}
|
17
25
|
|
18
26
|
form.spacer height: 20
|
19
27
|
form.h1 text: 'Textarea'
|
@@ -45,6 +53,7 @@ page.form url: json_ui_garage_url(path: 'forms/generic_post'), method: 'post', p
|
|
45
53
|
form.fields_radioGroup name: 'user[radio1]', value: 'F', childViews: ->(group) do
|
46
54
|
group.fields_radio value: 'show', label: 'Show'
|
47
55
|
group.fields_radio value: 'hide', label: 'Hide'
|
56
|
+
group.fields_radio value: '', label: 'Empty'
|
48
57
|
end
|
49
58
|
form.spacer height: 10
|
50
59
|
form.label text: 'Chosen', showIf: {
|
@@ -55,11 +64,19 @@ page.form url: json_ui_garage_url(path: 'forms/generic_post'), method: 'post', p
|
|
55
64
|
'show'
|
56
65
|
]
|
57
66
|
}
|
67
|
+
form.label text: 'Unspecified', showIf: {
|
68
|
+
"==": [
|
69
|
+
{
|
70
|
+
"var": 'user[radio1]'
|
71
|
+
},
|
72
|
+
''
|
73
|
+
]
|
74
|
+
}
|
58
75
|
|
59
76
|
form.spacer height: 20
|
60
77
|
form.h1 text: 'Select'
|
61
|
-
options = ['show', 'hide']
|
62
|
-
form.fields_select name: 'user[select1]', width: 'matchParent', label: 'Select "show"', options: options
|
78
|
+
options = ['', 'show', 'hide']
|
79
|
+
form.fields_select name: 'user[select1]', width: 'matchParent', label: 'Select "show"', options: options, value: ''
|
63
80
|
form.label text: 'Selected', showIf: {
|
64
81
|
"==": [
|
65
82
|
{
|
@@ -68,6 +85,14 @@ page.form url: json_ui_garage_url(path: 'forms/generic_post'), method: 'post', p
|
|
68
85
|
'show'
|
69
86
|
]
|
70
87
|
}
|
88
|
+
form.label text: 'Unspecified', showIf: {
|
89
|
+
"==": [
|
90
|
+
{
|
91
|
+
"var": 'user[select1]'
|
92
|
+
},
|
93
|
+
''
|
94
|
+
]
|
95
|
+
}
|
71
96
|
|
72
97
|
form.spacer height: 20
|
73
98
|
form.h1 text: 'Combined conditions'
|
@@ -90,7 +115,7 @@ page.form url: json_ui_garage_url(path: 'forms/generic_post'), method: 'post', p
|
|
90
115
|
form.spacer height: 10
|
91
116
|
form.fields_check name: 'user[check2]', checkValue: 'on', label: 'Show field'
|
92
117
|
form.spacer height: 10
|
93
|
-
form.fields_text width: 'matchParent', label: 'Comment (optional)', name: 'user[comment]', value: 'This field
|
118
|
+
form.fields_text width: 'matchParent', label: 'Comment (optional)', name: 'user[comment]', value: 'This field should be submitted even when it is hidden', showIf: {
|
94
119
|
"==": [
|
95
120
|
{
|
96
121
|
"var": 'user[check2]'
|
@@ -1,11 +1,18 @@
|
|
1
1
|
json.title 'Lists'
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
page_index = params[:page].to_i
|
4
|
+
if page_index > 2
|
5
|
+
page_index = 2
|
6
|
+
end
|
7
|
+
page = json_ui_page json
|
8
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page
|
5
9
|
|
6
|
-
|
7
|
-
|
8
|
-
|
10
|
+
page.list firstSection: ->(section) do
|
11
|
+
section.rows builder: ->(template) do
|
12
|
+
template.thumbnail \
|
13
|
+
title: 'Click menu (web) or swipe left (Android/iOS)',
|
14
|
+
subtitle: "Page index: #{page_index}",
|
15
|
+
leftButtons: ->(menu) do
|
9
16
|
menu.button styleClass: 'icon', icon: 'check_box', onClick: ->(subaction) do
|
10
17
|
subaction.dialogs_alert message: 'Tick/untick'
|
11
18
|
end
|
@@ -17,38 +24,39 @@ json_ui_page json do |page|
|
|
17
24
|
subaction.dialogs_alert message: 'Open'
|
18
25
|
end
|
19
26
|
end, editButtons: ->(menu) do
|
20
|
-
menu.button text:
|
21
|
-
action.dialogs_alert message: 'Perform action'
|
27
|
+
menu.button text: "Edit (ID: #{page_index})", onClick: ->(action) do
|
28
|
+
action.dialogs_alert message: 'Perform Edit action'
|
22
29
|
end
|
23
30
|
menu.button text: 'Delete', onClick: ->(action) do
|
24
|
-
action.dialogs_alert message: 'Perform action'
|
31
|
+
action.dialogs_alert message: 'Perform Delete action'
|
25
32
|
end
|
33
|
+
end, onClick: ->(action) do
|
34
|
+
action.windows_open url: json_ui_garage_url(path: 'lists/edit_actions', page: page_index + 1)
|
26
35
|
end
|
27
36
|
|
28
|
-
|
29
|
-
|
30
|
-
|
37
|
+
template.thumbnail title: 'Long press to get an alert', onLongPress: ->(action) do
|
38
|
+
action.dialogs_alert message: 'This is an alert'
|
39
|
+
end
|
31
40
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
end
|
41
|
+
template.thumbnail title: 'Long press to see menu', onLongPress: ->(action) do
|
42
|
+
action.sheets_select message: 'Context Menu', buttons: ->(menu) do
|
43
|
+
menu.button icon: 'edit', text: 'Edit', onClick: ->(subaction) do
|
44
|
+
subaction.dialogs_alert message: 'Perform action'
|
45
|
+
end
|
46
|
+
menu.button icon: 'delete', text: 'Delete', onClick: ->(subaction) do
|
47
|
+
subaction.dialogs_alert message: 'Perform action'
|
40
48
|
end
|
41
49
|
end
|
42
|
-
|
43
|
-
# template.thumbnail title: 'Long press to see menu', contextButtons: ->(menu) do
|
44
|
-
# menu.button text: 'Edit', onClick: ->(action) do
|
45
|
-
# action.dialogs_alert message: 'Perform action'
|
46
|
-
# end
|
47
|
-
# menu.button text: 'Delete', onClick: ->(action) do
|
48
|
-
# action.dialogs_alert message: 'Perform action'
|
49
|
-
# end
|
50
|
-
# end
|
51
50
|
end
|
52
51
|
|
52
|
+
# template.thumbnail title: 'Long press to see menu', contextButtons: ->(menu) do
|
53
|
+
# menu.button text: 'Edit', onClick: ->(action) do
|
54
|
+
# action.dialogs_alert message: 'Perform action'
|
55
|
+
# end
|
56
|
+
# menu.button text: 'Delete', onClick: ->(action) do
|
57
|
+
# action.dialogs_alert message: 'Perform action'
|
58
|
+
# end
|
59
|
+
# end
|
53
60
|
end
|
61
|
+
|
54
62
|
end
|
@@ -1,6 +1,10 @@
|
|
1
1
|
json.title 'ActionCable Real-time Update'
|
2
2
|
page = json_ui_page json
|
3
3
|
|
4
|
+
online_channel = 'OnlineChannel'
|
5
|
+
typing_channel = 'IsTypingChannel'
|
6
|
+
first_user = User.first
|
7
|
+
second_user = User.offset(1).first
|
4
8
|
# Implement a page that shows how ActionCable works in json_ui
|
5
9
|
|
6
10
|
# 1. Example for list
|
@@ -21,13 +25,19 @@ page = json_ui_page json
|
|
21
25
|
|
22
26
|
|
23
27
|
# 3. Example for online status
|
24
|
-
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
# end
|
28
|
+
|
29
|
+
# put on app/channels/online_channel.rb
|
30
|
+
# class OnlineChannel < Glib::Channel::OnlineChannel
|
31
|
+
# self.channel_name = 'OnlineChannel'
|
29
32
|
# end
|
30
33
|
|
34
|
+
page.on load: ->(action) do
|
35
|
+
action.timeouts_set interval: 1000, repeat: true, onTimeout: ->(subaction) do
|
36
|
+
subaction.cables_push channel: online_channel, event: 'online_status', payload: { status: true, user_id: first_user.id }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# 4. Example for typing status
|
31
41
|
|
32
42
|
# put on app/channels/is_typing_channel.rb
|
33
43
|
# class IsTypingChannel < Glib::Channel::IsTypingChannel
|
@@ -36,30 +46,35 @@ page = json_ui_page json
|
|
36
46
|
|
37
47
|
page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
|
38
48
|
|
39
|
-
channel = 'IsTypingChannel'
|
40
|
-
first_user = User.first
|
41
|
-
second_user = User.offset(1).first
|
42
|
-
|
43
49
|
scroll.panels_split width: 'matchParent', content: ->(content) do
|
44
50
|
content.left childViews: ->(left) do
|
51
|
+
online_socket_config = {
|
52
|
+
channel: online_channel,
|
53
|
+
filterKey: second_user.id,
|
54
|
+
params: {
|
55
|
+
conversation: 2
|
56
|
+
}
|
57
|
+
}
|
58
|
+
left.label actionCable: online_socket_config, text: ' '
|
59
|
+
|
45
60
|
left.fields_textarea \
|
46
61
|
width: 440,
|
47
62
|
label: "Messages from #{first_user.full_name}",
|
48
63
|
onTypeStart: lambda { |action|
|
49
64
|
action.cables_push \
|
50
|
-
channel:
|
65
|
+
channel: typing_channel, event: 'typing',
|
51
66
|
payload: { status: true, user_id: first_user.id }
|
52
67
|
},
|
53
68
|
onTypeEnd: lambda { |action|
|
54
69
|
action.cables_push \
|
55
|
-
channel:
|
70
|
+
channel: typing_channel,
|
56
71
|
event: 'typing',
|
57
72
|
payload: { status: false, user_id: first_user.id }
|
58
73
|
}
|
59
74
|
left.spacer height: 10
|
60
75
|
|
61
76
|
socket_config = {
|
62
|
-
channel:
|
77
|
+
channel: typing_channel,
|
63
78
|
filterKey: first_user.id,
|
64
79
|
params: {
|
65
80
|
conversation: 2
|
@@ -67,25 +82,26 @@ page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
|
|
67
82
|
}
|
68
83
|
left.label actionCable: socket_config, text: ' '
|
69
84
|
end
|
85
|
+
|
70
86
|
content.right childViews: ->(right) do
|
71
87
|
right.fields_textarea \
|
72
88
|
width: 440,
|
73
89
|
label: "Messages from #{second_user.full_name}",
|
74
90
|
onTypeStart: lambda { |action|
|
75
91
|
action.cables_push \
|
76
|
-
channel:
|
92
|
+
channel: typing_channel, event: 'typing',
|
77
93
|
payload: { status: true, user_id: second_user.id }
|
78
94
|
},
|
79
95
|
onTypeEnd: lambda { |action|
|
80
96
|
action.cables_push \
|
81
|
-
channel:
|
97
|
+
channel: typing_channel,
|
82
98
|
event: 'typing',
|
83
99
|
payload: { status: false, user_id: second_user.id }
|
84
100
|
}
|
85
101
|
right.spacer height: 10
|
86
102
|
|
87
103
|
socket_config = {
|
88
|
-
channel:
|
104
|
+
channel: typing_channel,
|
89
105
|
filterKey: second_user.id,
|
90
106
|
params: {
|
91
107
|
conversation: 2
|