glib-web 3.0.0.pre.beta1 → 3.0.1
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/libs.rb +18 -0
- data/app/controllers/glib/home_controller.rb +1 -1
- data/app/helpers/glib/json_ui/action_builder/dialogs.rb +3 -0
- data/app/helpers/glib/json_ui/action_builder/http.rb +1 -0
- data/app/helpers/glib/json_ui/action_builder/popovers.rb +14 -0
- data/app/helpers/glib/json_ui/action_builder/snackbars.rb +1 -0
- data/app/helpers/glib/json_ui/action_builder/tours.rb +3 -0
- data/app/helpers/glib/json_ui/list_builders.rb +2 -4
- data/app/helpers/glib/json_ui/view_builder/fields.rb +5 -1
- data/app/helpers/glib/json_ui/view_builder/panels.rb +2 -0
- data/app/helpers/glib/json_ui/view_builder.rb +3 -0
- data/app/views/json_ui/garage/actions/_snackbars.json.jbuilder +1 -1
- data/app/views/json_ui/garage/forms/_partial_update_execute.json.jbuilder +23 -0
- data/app/views/json_ui/garage/forms/otp_field.json.jbuilder +7 -4
- data/app/views/json_ui/garage/forms/selects.json.jbuilder +7 -1
- data/app/views/json_ui/garage/forms/submit_on_change.json.jbuilder +37 -2
- data/app/views/json_ui/garage/lists/_autoload_section.json.jbuilder +1 -3
- data/app/views/json_ui/garage/lists/reordering.json.jbuilder +7 -1
- data/app/views/json_ui/garage/lists/templating.json.jbuilder +16 -0
- data/app/views/json_ui/garage/panels/_hover_views_content.json.jbuilder +4 -4
- data/app/views/json_ui/garage/panels/_timeline_content.json.jbuilder +0 -1
- data/app/views/json_ui/garage/panels/horizontal.json.jbuilder +24 -7
- data/app/views/json_ui/garage/panels/index.json.jbuilder +6 -6
- data/app/views/json_ui/garage/panels/split.json.jbuilder +1 -1
- data/app/views/json_ui/garage/panels/ul.json.jbuilder +6 -3
- data/app/views/json_ui/garage/views/controls.json.jbuilder +45 -10
- data/app/views/layouts/json_ui/renderer.html.erb +3 -2
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72eecba2c1fe97bbb3ef6f0be03e4d0f79a23a4dcca8c7f16bf3d1be9083a5b7
|
4
|
+
data.tar.gz: 526316d03db695e57c5a2a7e81110cb52f14d73ab5524ca7866c73a6e9230ffc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fc68d49b58d90e62fa5c4f2cd82bbf2bde03123a63ecc3f3fe09875d8a886db320f0151c53c31cfc417d2cc88993f66b10350f2d9f00f8c70dda54bdccef1075
|
7
|
+
data.tar.gz: e4faf34c6746d568277406474f5c75ce05f52c0ce262102879adf13ac595e8f03102a169047d9a9993f952d6d3978de6f22677b9068796d14cb1b3fba3b6d878
|
@@ -36,6 +36,24 @@ module Glib::Json::Libs
|
|
36
36
|
json_ui_app_device_os == 'web'
|
37
37
|
end
|
38
38
|
|
39
|
+
def json_ui_etag
|
40
|
+
template = "#{controller_name}/#{action_name}"
|
41
|
+
|
42
|
+
# 1) It's necessary to pass in the template explicitly because of the switching between JSON
|
43
|
+
# and HTML rendering.
|
44
|
+
#
|
45
|
+
# 2) When a model is not provided, two pages the use the same template (e.g. `projects#show`)
|
46
|
+
# will produce the exact same ETAG, even though their content might be different. Presumably
|
47
|
+
# this is because the ETAG is calculated based on the static template as opposed to the
|
48
|
+
# generated output.
|
49
|
+
#
|
50
|
+
# However, this is not a problem because the browser will still treat these pages as
|
51
|
+
# separate because they have different URLs (e.g. `projects/1` vs `projects/2`), meaning
|
52
|
+
# that it will not accidentally use the cache from a different URL even though the ETAG
|
53
|
+
# is exactly the same.
|
54
|
+
fresh_when nil, template: template
|
55
|
+
end
|
56
|
+
|
39
57
|
def json_ui_render(template, args = {})
|
40
58
|
JSON.parse(render_to_string(template, locals: args))
|
41
59
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
class Glib::JsonUi::ActionBuilder
|
2
2
|
module Dialogs
|
3
3
|
class Alert < Action
|
4
|
+
string :title
|
4
5
|
string :message
|
5
6
|
action :onLoad
|
6
7
|
action :onClose
|
@@ -28,6 +29,7 @@ class Glib::JsonUi::ActionBuilder
|
|
28
29
|
bool :showClose
|
29
30
|
string :fullscreen # mobile, always
|
30
31
|
length :width
|
32
|
+
bool :closeOnBlur
|
31
33
|
|
32
34
|
# def initialize(json, page)
|
33
35
|
# @json = json
|
@@ -44,6 +46,7 @@ class Glib::JsonUi::ActionBuilder
|
|
44
46
|
bool :showClose
|
45
47
|
string :fullscreen
|
46
48
|
length :width
|
49
|
+
length :height
|
47
50
|
end
|
48
51
|
|
49
52
|
class Reload < Action
|
@@ -37,7 +37,7 @@ module Glib
|
|
37
37
|
action :onLongPress
|
38
38
|
icon :icon
|
39
39
|
bool :avatar
|
40
|
-
action :onReorder
|
40
|
+
# action :onReorder
|
41
41
|
string :paramNameForFormData
|
42
42
|
string :paramNameForNewAbsoluteIndex
|
43
43
|
string :paramNameForNewSectionIndex
|
@@ -46,9 +46,7 @@ module Glib
|
|
46
46
|
string :id # Deprecated
|
47
47
|
string :paramNameForNewIndex # Deprecated
|
48
48
|
|
49
|
-
|
50
|
-
# # an array of badges (with relevant properties, e.g. text, color, etc)
|
51
|
-
# views :accessoryViews
|
49
|
+
panels_builder :accessory, :header, :body, :footer
|
52
50
|
end
|
53
51
|
|
54
52
|
class Featured < Standard
|
@@ -3,6 +3,7 @@ class Glib::JsonUi::ViewBuilder
|
|
3
3
|
|
4
4
|
class AbstractField < View
|
5
5
|
bool :readOnly
|
6
|
+
bool :disabled
|
6
7
|
hash :validation
|
7
8
|
bool :disableDirtyCheck
|
8
9
|
action :onChange
|
@@ -76,6 +77,7 @@ class Glib::JsonUi::ViewBuilder
|
|
76
77
|
class Text < AbstractField
|
77
78
|
int :maxLength
|
78
79
|
icon :leftIcon
|
80
|
+
icon :rightIcon
|
79
81
|
string :leftText
|
80
82
|
string :rightText
|
81
83
|
action :onTypeStart
|
@@ -114,6 +116,7 @@ class Glib::JsonUi::ViewBuilder
|
|
114
116
|
class Submit < AbstractField
|
115
117
|
string :text
|
116
118
|
color :color
|
119
|
+
icon :icon
|
117
120
|
end
|
118
121
|
|
119
122
|
class CheckGroup < AbstractField
|
@@ -301,7 +304,8 @@ class Glib::JsonUi::ViewBuilder
|
|
301
304
|
end
|
302
305
|
|
303
306
|
class Otp < AbstractField
|
304
|
-
int :
|
307
|
+
int :length
|
308
|
+
string :type
|
305
309
|
end
|
306
310
|
|
307
311
|
class Rating < AbstractField
|
@@ -140,6 +140,7 @@ class Glib::JsonUi::ViewBuilder
|
|
140
140
|
action :onScrollToBottom
|
141
141
|
|
142
142
|
int :responsiveCols
|
143
|
+
hash :dragSupport
|
143
144
|
|
144
145
|
def firstSection(block)
|
145
146
|
json.sections [1] do
|
@@ -242,6 +243,7 @@ class Glib::JsonUi::ViewBuilder
|
|
242
243
|
string :distribution
|
243
244
|
string :align
|
244
245
|
action :onClick
|
246
|
+
hash :dragSupport
|
245
247
|
end
|
246
248
|
|
247
249
|
class Flow < View
|
@@ -27,7 +27,7 @@ section.rows builder: ->(template) do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
template.thumbnail title: 'snackbars with styling', onClick: ->(action) do
|
30
|
-
action.snackbars_alert message: 'This is a styled snackbar',
|
30
|
+
action.snackbars_alert message: 'This is a styled snackbar', location: 'top', styleClass: 'success'
|
31
31
|
end
|
32
32
|
|
33
33
|
end
|
@@ -4,5 +4,28 @@ action.components_update targetId: 'greeting', views: ->(update) do
|
|
4
4
|
vertical.label text: "Hello #{name},"
|
5
5
|
vertical.spacer height: 8
|
6
6
|
vertical.label text: 'Nice to meet you'
|
7
|
+
|
8
|
+
vertical.spacer height: 8
|
9
|
+
vertical.panels_horizontal childViews: ->(horizontal) do
|
10
|
+
horizontal.label text: "Column1 #{DateTime.current.to_i}"
|
11
|
+
horizontal.spacer width: 8
|
12
|
+
|
13
|
+
horizontal.panels_vertical childViews: ->(inner_vertical) do
|
14
|
+
inner_vertical.label text: "Row1 #{DateTime.current.to_i}"
|
15
|
+
inner_vertical.label text: "Row2 #{DateTime.current.to_i}"
|
16
|
+
|
17
|
+
inner_vertical.panels_split content: ->(split) do
|
18
|
+
split.left childViews: ->(left) do
|
19
|
+
left.label text: "Left1 #{DateTime.current.to_i}"
|
20
|
+
left.label text: "Left2 #{DateTime.current.to_i}"
|
21
|
+
end
|
22
|
+
|
23
|
+
split.right childViews: ->(right) do
|
24
|
+
right.label text: "Right1 #{DateTime.current.to_i}"
|
25
|
+
right.label text: "Right2 #{DateTime.current.to_i}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
7
30
|
end
|
8
31
|
end
|
@@ -14,21 +14,24 @@ page.form \
|
|
14
14
|
form.spacer height: 6
|
15
15
|
form.fields_otp \
|
16
16
|
name: 'user[otp_summary1]',
|
17
|
-
|
17
|
+
length: 7,
|
18
|
+
type: 'text'
|
18
19
|
|
19
20
|
form.spacer height: 20
|
20
|
-
form.h2 text: 'OTP Custom Length'
|
21
|
+
form.h2 text: 'OTP Custom Length and input type number'
|
21
22
|
form.spacer height: 6
|
22
23
|
form.fields_otp \
|
23
24
|
name: 'user[otp_summary2]',
|
24
|
-
|
25
|
+
length: 3,
|
26
|
+
type: 'number'
|
25
27
|
|
26
28
|
form.spacer height: 20
|
27
29
|
form.h2 text: 'OTP with Long Field'
|
28
30
|
form.spacer height: 6
|
29
31
|
form.fields_otp \
|
30
32
|
name: 'user[otp_summary3]',
|
31
|
-
|
33
|
+
length: 20,
|
34
|
+
type: 'text'
|
32
35
|
|
33
36
|
form.spacer height: 20
|
34
37
|
form.fields_submit text: 'Submit'
|
@@ -15,7 +15,13 @@ page.form url: json_ui_garage_url(path: 'forms/generic_post'), method: 'post', p
|
|
15
15
|
'melbourne' => 'Melbourne',
|
16
16
|
'sydney' => 'Sydney',
|
17
17
|
}
|
18
|
-
form.fields_select
|
18
|
+
form.fields_select \
|
19
|
+
name: 'user[city]',
|
20
|
+
width: 'matchParent',
|
21
|
+
label: 'City1',
|
22
|
+
placeholder: 'This is a placeholder',
|
23
|
+
options: languages.map { |k, v| { value: k, text: v } },
|
24
|
+
value: 'canberra'
|
19
25
|
form.fields_select name: 'user[cities][]', width: 'matchParent', label: 'Cities', options: languages.map { |k, v| { value: k, text: v } }, value: ['melbourne', 'sydney'], multiple: true
|
20
26
|
|
21
27
|
form.spacer height: 20
|
@@ -17,8 +17,11 @@ page.scroll childViews: ->(scroll) do
|
|
17
17
|
checkValue: '16+',
|
18
18
|
uncheckValue: '0-16',
|
19
19
|
label: 'I am over 16 (has default value)',
|
20
|
+
paramNameForFormData: 'message',
|
20
21
|
onChange: ->(action) do
|
21
|
-
action.
|
22
|
+
action.dialogs_alert title: 'Submit data?', onClose: ->(subaction) do
|
23
|
+
action.forms_submit
|
24
|
+
end
|
22
25
|
end
|
23
26
|
|
24
27
|
form.fields_check \
|
@@ -43,7 +46,7 @@ page.scroll childViews: ->(scroll) do
|
|
43
46
|
onChange: ->(action) do
|
44
47
|
action.snackbars_select message: 'Submit data?', buttons: ->(menu) do
|
45
48
|
menu.button text: 'Yes, submit', onClick: ->(subaction) do
|
46
|
-
|
49
|
+
subaction.forms_submit
|
47
50
|
end
|
48
51
|
end
|
49
52
|
end
|
@@ -57,6 +60,7 @@ page.scroll childViews: ->(scroll) do
|
|
57
60
|
group.fields_radio value: 'senior', label: 'Senior'
|
58
61
|
group.fields_radio value: 'junior', label: 'Junior'
|
59
62
|
end,
|
63
|
+
paramNameForFormData: 'message',
|
60
64
|
onChange: ->(action) do
|
61
65
|
action.sheets_select message: 'Submit data?', buttons: ->(menu) do
|
62
66
|
menu.button text: 'Yes, submit', onClick: ->(subaction) do
|
@@ -78,6 +82,20 @@ page.scroll childViews: ->(scroll) do
|
|
78
82
|
end
|
79
83
|
end
|
80
84
|
|
85
|
+
|
86
|
+
form.spacer height: 20
|
87
|
+
form.h2 text: 'Textarea'
|
88
|
+
form.fields_textarea \
|
89
|
+
name: 'user[bio]',
|
90
|
+
width: 'matchParent',
|
91
|
+
onChange: ->(action) do
|
92
|
+
action.sheets_select message: 'Submit data?', buttons: ->(menu) do
|
93
|
+
menu.button text: 'Yes, submit', onClick: ->(subaction) do
|
94
|
+
action.forms_submit
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
81
99
|
form.spacer height: 20
|
82
100
|
form.h2 text: 'Text (Asynchronous)'
|
83
101
|
form.fields_text \
|
@@ -86,6 +104,23 @@ page.scroll childViews: ->(scroll) do
|
|
86
104
|
onChange: ->(action) do
|
87
105
|
action.http_post url: json_ui_garage_url(path: 'forms/generic_post')
|
88
106
|
end
|
107
|
+
|
108
|
+
form.spacer height: 20
|
109
|
+
rules = { fileType: 'image', maxFileSize: 5000, fileTypeErrorText: 'Invalid!', maxFileSizeErrorText: 'Too big!' }
|
110
|
+
form.fields_file \
|
111
|
+
name: 'user[photo][]',
|
112
|
+
width: 'matchParent',
|
113
|
+
label: 'Avatar',
|
114
|
+
accepts: rules,
|
115
|
+
directUploadUrl: rails_direct_uploads_url,
|
116
|
+
placeholderView: { type: 'avatar', width: 100, height: 100, url: 'data:image/jpeg;base64,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' },
|
117
|
+
onChange: ->(action) do
|
118
|
+
action.sheets_select message: 'Submit data?', buttons: ->(menu) do
|
119
|
+
menu.button text: 'Yes, submit', onClick: ->(subaction) do
|
120
|
+
action.forms_submit
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
89
124
|
end
|
90
125
|
|
91
126
|
end
|
@@ -11,9 +11,7 @@ section.rows builder: ->(row) do
|
|
11
11
|
array.each do |i|
|
12
12
|
index = page_index * batch_count + i
|
13
13
|
if local_assigns[:reorder]
|
14
|
-
row.thumbnail title: "Item #{index}"
|
15
|
-
action.dialogs_notification title: "Item #{index}"
|
16
|
-
end, paramNameForFormData: 'message', paramNameForNewIndex: 'new_index'
|
14
|
+
row.thumbnail title: "Item #{index}"
|
17
15
|
else
|
18
16
|
row.thumbnail title: "Item #{index}", subtitle: "Sub Item #{index}", subsubtitle: "Sub Sub Item #{index}"
|
19
17
|
end
|
@@ -30,5 +30,11 @@ else
|
|
30
30
|
end
|
31
31
|
render 'json_ui/garage/lists/autoload_section', page: page, page_index: page_index, reorder: true
|
32
32
|
end
|
33
|
-
]
|
33
|
+
], dragSupport: {
|
34
|
+
onDrop: {
|
35
|
+
action: 'dialogs/alert'
|
36
|
+
},
|
37
|
+
paramNameForFormData: 'message',
|
38
|
+
paramNameForNewIndex: 'new_index'
|
39
|
+
}
|
34
40
|
end
|
@@ -11,6 +11,22 @@ json_ui_page json do |page|
|
|
11
11
|
section.rows builder: ->(template) do
|
12
12
|
template.thumbnail title: 'Click me', onClick: ->(action) do
|
13
13
|
action.windows_open url: json_ui_garage_url(path: 'home/blank')
|
14
|
+
end,
|
15
|
+
accessory: ->(accessory) do
|
16
|
+
accessory.header \
|
17
|
+
width: 'matchParent',
|
18
|
+
backgroundColor: '#b3bac2',
|
19
|
+
padding: { top: 10, bottom: 10, left: 10, right: 10 },
|
20
|
+
childViews: ->(bottom) do
|
21
|
+
bottom.label text: 'Custom row header'
|
22
|
+
end
|
23
|
+
accessory.footer \
|
24
|
+
width: 'matchParent',
|
25
|
+
backgroundColor: '#b3bac2',
|
26
|
+
padding: { top: 10, bottom: 10, left: 10, right: 10 },
|
27
|
+
childViews: ->(bottom) do
|
28
|
+
bottom.label text: 'Custom row footer'
|
29
|
+
end
|
14
30
|
end
|
15
31
|
template.thumbnail title: 'Item with icon and subtitle', subtitle: 'Item subtitle', icon: 'facebook'
|
16
32
|
template.thumbnail title: 'Item with chips', chips: ->(menu) do
|
@@ -2,7 +2,7 @@ text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
|
2
2
|
value = ''
|
3
3
|
i.times { value += text }
|
4
4
|
|
5
|
-
hover.panels_responsive padding: {top: 24, right: 24, bottom: 24, left: 24 }, childViews: ->(responsive) do
|
5
|
+
hover.panels_responsive padding: { top: 24, right: 24, bottom: 24, left: 24 }, childViews: ->(responsive) do
|
6
6
|
responsive.avatar url: glib_json_image_avatar_url
|
7
7
|
|
8
8
|
responsive.spacer height: 8
|
@@ -10,9 +10,9 @@ hover.panels_responsive padding: {top: 24, right: 24, bottom: 24, left: 24 }, ch
|
|
10
10
|
responsive.spacer height: 8
|
11
11
|
|
12
12
|
responsive.h2 text: 'Hover View'
|
13
|
-
responsive.p text:value
|
13
|
+
responsive.p text: value
|
14
14
|
responsive.spacer height: 24
|
15
|
-
responsive.button text: 'Button', onClick
|
15
|
+
responsive.button text: 'Button', onClick: ->(action) do
|
16
16
|
action.dialogs_alert message: 'Clicked'
|
17
17
|
end
|
18
|
-
end
|
18
|
+
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
progress = params[:progress]&.to_i&.between?(0, 5) ? params[:progress].to_i : 0
|
2
2
|
|
3
3
|
tview.panels_responsive \
|
4
|
-
width: 400,
|
5
4
|
childViews: ->(res) do
|
6
5
|
res.panels_column sm: { cols: 11 }, childViews: ->(subcolumn) do
|
7
6
|
subcolumn.panels_column sm: { cols: 2, padding: { right: 10 } }, childViews: ->(inner_column) do
|
@@ -119,13 +119,30 @@ json_ui_page json do |page|
|
|
119
119
|
|
120
120
|
scroll.spacer height: 20
|
121
121
|
scroll.h1 text: 'Label combo (with onClick)'
|
122
|
-
scroll.panels_horizontal
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
122
|
+
scroll.panels_horizontal \
|
123
|
+
padding: { left: 20, right: 20, top: 10, bottom: 10 },
|
124
|
+
styleClasses: ['rounded-corner'],
|
125
|
+
backgroundColor: '#b3bac2',
|
126
|
+
childViews: ->(panel) do
|
127
|
+
panel.label text: 'Label 1'
|
128
|
+
panel.label backgroundColor: '#ffffff', text: 'Label 2'
|
129
|
+
panel.label text: 'Label 3'
|
130
|
+
end, onClick: ->(action) do
|
131
|
+
action.windows_open url: json_ui_garage_url(path: 'home/blank')
|
132
|
+
end
|
133
|
+
|
134
|
+
scroll.spacer height: 20
|
135
|
+
scroll.h1 text: 'Drag-and-drop support'
|
136
|
+
scroll.panels_horizontal backgroundColor: '#b3bac2', width: 300, distribution: 'spaceEqually', childViews: ->(panel) do
|
137
|
+
panel.button id: 'button1', text: '1'
|
138
|
+
panel.button id: 'button2', text: '2'
|
139
|
+
panel.button id: 'button3', text: '3'
|
140
|
+
end, dragSupport: {
|
141
|
+
onDrop: {
|
142
|
+
action: 'dialogs/alert',
|
143
|
+
},
|
144
|
+
paramNameForFormData: 'message'
|
145
|
+
}
|
129
146
|
|
130
147
|
scroll.label text: "\n"
|
131
148
|
end
|
@@ -30,9 +30,9 @@ json_ui_page json do |page|
|
|
30
30
|
template.thumbnail title: 'Unordered List', subtitle: 'Bullet points similar to HTML\'s <ul> tag', onClick: ->(action) do
|
31
31
|
action.windows_open url: json_ui_garage_url(path: 'panels/ul')
|
32
32
|
end
|
33
|
-
template.thumbnail title: 'Timeline', subtitle: 'Timeline component with responsive panel as the childviews', onClick: ->(action) do
|
34
|
-
|
35
|
-
end
|
33
|
+
# template.thumbnail title: 'Timeline', subtitle: 'Timeline component with responsive panel as the childviews', onClick: ->(action) do
|
34
|
+
# action.windows_open url: json_ui_garage_url(path: 'panels/timeline')
|
35
|
+
# end
|
36
36
|
end
|
37
37
|
end, ->(section) do
|
38
38
|
section.header padding: glib_json_padding_list, childViews: ->(header) do
|
@@ -87,9 +87,9 @@ json_ui_page json do |page|
|
|
87
87
|
template.thumbnail title: 'Column', subtitle: 'Adds control over layout inside a responsive panel', onClick: ->(action) do
|
88
88
|
action.windows_open url: json_ui_garage_url(path: 'panels/responsive')
|
89
89
|
end
|
90
|
-
template.thumbnail title: 'Hover', subtitle: 'Popover triggered by hover', onClick: ->(action) do
|
91
|
-
|
92
|
-
end
|
90
|
+
# template.thumbnail title: 'Hover', subtitle: 'Popover triggered by hover', onClick: ->(action) do
|
91
|
+
# action.windows_open url: json_ui_garage_url(path: 'panels/hover')
|
92
|
+
# end
|
93
93
|
end
|
94
94
|
end, ->(section) do
|
95
95
|
section.header padding: glib_json_padding_list, childViews: ->(header) do
|
@@ -72,7 +72,7 @@ json_ui_page json do |page|
|
|
72
72
|
left.button text: '1'
|
73
73
|
end
|
74
74
|
content.center childViews: ->(center) do
|
75
|
-
center.label text: 'a very very very very very very very very very very very very very very very very very very very very very very very very very very very very long text'
|
75
|
+
center.label text: 'a very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very long text'
|
76
76
|
end
|
77
77
|
content.right childViews: ->(right) do
|
78
78
|
right.button text: '2'
|
@@ -26,7 +26,7 @@ page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
|
|
26
26
|
end
|
27
27
|
|
28
28
|
scroll.spacer height: 14
|
29
|
-
scroll.h2 text: 'Breadcrumbs'
|
29
|
+
scroll.h2 text: 'Breadcrumbs (experimental)'
|
30
30
|
scroll.spacer height: 6
|
31
31
|
scroll.panels_ul \
|
32
32
|
width: 'matchParent',
|
@@ -37,8 +37,11 @@ page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
|
|
37
37
|
ul.button text: 'Level 1', styleClass: 'link', onClick: ->(action) do
|
38
38
|
action.windows_open url: json_ui_garage_url(path: 'home/blank')
|
39
39
|
end
|
40
|
-
|
41
|
-
|
40
|
+
|
41
|
+
ul.button icon: 'keyboard_arrow_down', text: 'Level 2', styleClass: 'link', childButtons: ->(menu) do
|
42
|
+
menu.button text: 'Dropdown item 1'
|
43
|
+
menu.button text: 'Dropdown item 2'
|
44
|
+
menu.button text: 'Dropdown item 3'
|
42
45
|
end
|
43
46
|
ul.label text: 'Level 3'
|
44
47
|
end
|
@@ -27,23 +27,58 @@ page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
scroll.spacer height: 10
|
30
|
-
scroll.button text: 'Button with dropdown',
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
scroll.button text: 'Button with dropdown', onClick: ->(action) do
|
31
|
+
action.popovers_open \
|
32
|
+
key: 'menu',
|
33
|
+
location: 'bottom',
|
34
|
+
childViews: ->(view) do
|
35
|
+
view.panels_responsive styleClass: 'popover-menu', width: 200, childViews: ->(res) do
|
36
|
+
res.label text: 'Item 1', styleClass: 'popover-menu-item', onClick: ->(saction) do
|
37
|
+
saction.popovers_close key: 'menu'
|
38
|
+
end
|
39
|
+
res.label text: 'Item 2', styleClass: 'popover-menu-item', onClick: ->(saction) do
|
40
|
+
saction.popovers_close key: 'menu'
|
41
|
+
end
|
42
|
+
res.label text: 'Item 3', styleClass: 'popover-menu-item', onClick: ->(saction) do
|
43
|
+
saction.popovers_close key: 'menu'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
34
47
|
end
|
35
48
|
|
36
49
|
scroll.spacer height: 10
|
37
|
-
scroll.button
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
50
|
+
scroll.button \
|
51
|
+
text: 'Button with tooltip and dropdown',
|
52
|
+
onMouseEnter: ->(action) {
|
53
|
+
action.popovers_open \
|
54
|
+
key: 'tooltip',
|
55
|
+
location: 'top',
|
56
|
+
childViews: ->(view) { view.p styleClass: 'tooltip', text: 'Tooltip 1' }
|
57
|
+
},
|
58
|
+
onMouseLeave: ->(action) { action.popovers_close key: 'tooltip' },
|
59
|
+
onClick: ->(action) do
|
60
|
+
action.popovers_open \
|
61
|
+
key: 'menu',
|
62
|
+
location: 'right',
|
63
|
+
childViews: ->(view) do
|
64
|
+
view.panels_responsive styleClass: 'popover-menu', width: 200, childViews: ->(res) do
|
65
|
+
res.label text: 'Item 1', styleClass: 'popover-menu-item', onClick: ->(saction) do
|
66
|
+
saction.popovers_close key: 'menu'
|
67
|
+
end
|
68
|
+
res.label text: 'Item 2', styleClass: 'popover-menu-item', onClick: ->(saction) do
|
69
|
+
saction.popovers_close key: 'menu'
|
70
|
+
end
|
71
|
+
res.label text: 'Item 3', styleClass: 'popover-menu-item', onClick: ->(saction) do
|
72
|
+
saction.popovers_close key: 'menu'
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
42
77
|
|
43
78
|
scroll.spacer height: 20
|
44
79
|
scroll.button \
|
45
80
|
icon: 'info',
|
46
|
-
|
81
|
+
styleClasses: ['icon', 'plain'],
|
47
82
|
tooltip: { text: 'Disabled Icon button with tooltip text and custom tooltip position', position: 'right' },
|
48
83
|
disabled: true
|
49
84
|
scroll.spacer height: 20
|
@@ -12,10 +12,11 @@
|
|
12
12
|
<%#= javascript_include_tag 'vue_renderer_extras', defer: true %>
|
13
13
|
|
14
14
|
<%= vite_stylesheet_tag 'vue_renderer' %>
|
15
|
-
|
15
|
+
<%# TODO: Remove this, for dev only %>
|
16
|
+
<%# <script src="https://cdn.tailwindcss.com"></script> %>
|
16
17
|
<link href="//fonts.googleapis.com/css?family=Material+Icons" rel="stylesheet" />
|
17
18
|
<%# Without this, checkboxes and radio buttons will not display. %>
|
18
|
-
<link href="//cdn.materialdesignicons.com/2.1.99/css/materialdesignicons.min.css" rel="stylesheet" />
|
19
|
+
<%# <link href="//cdn.materialdesignicons.com/2.1.99/css/materialdesignicons.min.css" rel="stylesheet" /> %>
|
19
20
|
<%= yield :head %>
|
20
21
|
<% if @__glib_head_code %>
|
21
22
|
<%= @__glib_head_code.html_safe %>
|
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: 3.0.
|
4
|
+
version: 3.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ''
|
@@ -98,6 +98,7 @@ files:
|
|
98
98
|
- app/helpers/glib/json_ui/action_builder/http.rb
|
99
99
|
- app/helpers/glib/json_ui/action_builder/iap.rb
|
100
100
|
- app/helpers/glib/json_ui/action_builder/panels.rb
|
101
|
+
- app/helpers/glib/json_ui/action_builder/popovers.rb
|
101
102
|
- app/helpers/glib/json_ui/action_builder/sheets.rb
|
102
103
|
- app/helpers/glib/json_ui/action_builder/snackbars.rb
|
103
104
|
- app/helpers/glib/json_ui/action_builder/tours.rb
|
@@ -309,9 +310,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
309
310
|
version: '0'
|
310
311
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
311
312
|
requirements:
|
312
|
-
- - "
|
313
|
+
- - ">="
|
313
314
|
- !ruby/object:Gem::Version
|
314
|
-
version:
|
315
|
+
version: '0'
|
315
316
|
requirements: []
|
316
317
|
rubygems_version: 3.1.4
|
317
318
|
signing_key:
|