glib-web 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/helpers/glib/json_ui/abstract_builder.rb +63 -0
- data/app/helpers/glib/json_ui/action_builder.rb +8 -0
- data/app/helpers/glib/json_ui/list_builders.rb +3 -0
- data/app/helpers/glib/json_ui/view_builder/fields.rb +67 -5
- data/app/helpers/glib/json_ui/view_builder/panels.rb +10 -0
- data/app/helpers/glib/json_ui/view_builder.rb +9 -4
- data/app/views/json_ui/garage/_nav_menu.json.jbuilder +6 -1
- data/app/views/json_ui/garage/actions/index.json.jbuilder +40 -28
- data/app/views/json_ui/garage/forms/basic.json.jbuilder +0 -1
- data/app/views/json_ui/garage/forms/basic_post.json.jbuilder +5 -4
- data/app/views/json_ui/garage/forms/file_upload.json.jbuilder +8 -1
- data/app/views/json_ui/garage/forms/index.json.jbuilder +9 -0
- data/app/views/json_ui/garage/forms/others.json.jbuilder +40 -0
- data/app/views/json_ui/garage/forms/pickers.json.jbuilder +40 -0
- data/app/views/json_ui/garage/forms/text_validation.json.jbuilder +15 -0
- data/app/views/json_ui/garage/home/index.json.jbuilder +1 -1
- data/app/views/json_ui/garage/lists/templating.json.jbuilder +2 -2
- data/app/views/json_ui/garage/pages/tab_bar.json.jbuilder +9 -35
- data/app/views/json_ui/garage/views/basic.json.jbuilder +8 -1
- data/app/views/json_ui/garage/views/calendar_data.json.jbuilder +29 -0
- data/app/views/json_ui/garage/views/charts.json.jbuilder +46 -0
- data/app/views/json_ui/garage/views/index.json.jbuilder +4 -1
- metadata +6 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c9296a445e5e0d74a2b3c801fe2fc02d2534c97
|
4
|
+
data.tar.gz: e2670acc3fb614affb71939f1d33609f7cd53e17
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aeeb6f7c4b82cded13854c5ed44e80836257d29c98b06b223f00947fa77692a3191c50a07ffe0c56e1bedd7aa5656ec241398ec46a78aa8c6651c6bbb0baf051
|
7
|
+
data.tar.gz: 7d176519ccc425f4bf889e73e41ad068bf93c7366902a9f3230f2fbe5ed8655d6dabc53193220abf34f4553bff59f63b89192d434a115d95aa660e898f7e4642
|
@@ -50,6 +50,63 @@ module Glib
|
|
50
50
|
|
51
51
|
private
|
52
52
|
|
53
|
+
def self.date propName
|
54
|
+
define_method(propName) do |value|
|
55
|
+
if (value = value&.to_s)
|
56
|
+
if !Rails.env.production?
|
57
|
+
# TODO: Use regex to validate date
|
58
|
+
end
|
59
|
+
|
60
|
+
json.set! propName, value
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.date_time propName
|
66
|
+
define_method(propName) do |value|
|
67
|
+
if (value = value&.to_s)
|
68
|
+
if !Rails.env.production?
|
69
|
+
# TODO: Use regex to validate datetime
|
70
|
+
end
|
71
|
+
|
72
|
+
json.set! propName, value
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.color propName
|
78
|
+
define_method(propName) do |value|
|
79
|
+
if (value = value&.to_s)
|
80
|
+
if !Rails.env.production?
|
81
|
+
if !value.match /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/i
|
82
|
+
raise "Invalid color: #{value}"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
json.set! propName, value
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.length propName
|
92
|
+
define_method(propName) do |value|
|
93
|
+
if value
|
94
|
+
if !Rails.env.production?
|
95
|
+
case value
|
96
|
+
when 'matchParent'
|
97
|
+
when 'wrapContent'
|
98
|
+
else
|
99
|
+
if !value.is_a? Integer
|
100
|
+
raise "Invalid length: #{value}"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
json.set! propName, value
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
53
110
|
def self.string propName
|
54
111
|
define_method(propName) do |value|
|
55
112
|
json.set! propName, value&.to_s
|
@@ -106,6 +163,12 @@ module Glib
|
|
106
163
|
end
|
107
164
|
end
|
108
165
|
|
166
|
+
def self.singleton_array singletonName, arrayName
|
167
|
+
define_method(singletonName) do |value|
|
168
|
+
json.set! arrayName, [value]
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
109
172
|
def created
|
110
173
|
# To be overridden
|
111
174
|
end
|
@@ -50,6 +50,10 @@ module Glib
|
|
50
50
|
end
|
51
51
|
|
52
52
|
module Windows
|
53
|
+
class Close < Action
|
54
|
+
action :onClose
|
55
|
+
end
|
56
|
+
|
53
57
|
class CloseAll < Action
|
54
58
|
action :onClose
|
55
59
|
end
|
@@ -61,6 +65,10 @@ module Glib
|
|
61
65
|
class OpenWeb < Action
|
62
66
|
string :url
|
63
67
|
end
|
68
|
+
|
69
|
+
class Reload < Action
|
70
|
+
string :url
|
71
|
+
end
|
64
72
|
end
|
65
73
|
|
66
74
|
# Consider deprecating this. See Data
|
@@ -32,9 +32,15 @@ class Glib::JsonUi::ViewBuilder
|
|
32
32
|
bool :readOnly
|
33
33
|
end
|
34
34
|
|
35
|
+
class Number < Text
|
36
|
+
end
|
37
|
+
|
35
38
|
class Email < Text
|
36
39
|
end
|
37
40
|
|
41
|
+
class Url < Text
|
42
|
+
end
|
43
|
+
|
38
44
|
class Password < Text
|
39
45
|
end
|
40
46
|
|
@@ -49,6 +55,10 @@ class Glib::JsonUi::ViewBuilder
|
|
49
55
|
bool :readOnly
|
50
56
|
end
|
51
57
|
|
58
|
+
class RichText < Text
|
59
|
+
array :images
|
60
|
+
end
|
61
|
+
|
52
62
|
class Country < AbstractField
|
53
63
|
hash :region
|
54
64
|
end
|
@@ -63,17 +73,69 @@ class Glib::JsonUi::ViewBuilder
|
|
63
73
|
views :childViews
|
64
74
|
end
|
65
75
|
|
76
|
+
# TODO: Support array props
|
66
77
|
class Radio < View
|
67
78
|
string :label
|
68
79
|
string :value
|
69
80
|
end
|
70
81
|
|
82
|
+
# TODO: Use the array props above to implement `value` property
|
71
83
|
class File < Text
|
72
|
-
string :
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
84
|
+
# string :value
|
85
|
+
|
86
|
+
# def value(value)
|
87
|
+
# # @value = value if value != Glib::Value::DEFAULT
|
88
|
+
# end
|
89
|
+
|
90
|
+
# def prop(prop)
|
91
|
+
# super
|
92
|
+
|
93
|
+
# @value ||= form.field_value(prop)
|
94
|
+
|
95
|
+
# # if (form = page.current_form)
|
96
|
+
# # @name ||= form.field_name(prop)
|
97
|
+
# # @value ||= form.field_value(prop)
|
98
|
+
# # end
|
99
|
+
# end
|
100
|
+
|
101
|
+
hash :accepts
|
102
|
+
string :directUploadUrl
|
103
|
+
# int :file_size_limit
|
104
|
+
# string :file_size_limit_alert_text
|
105
|
+
|
106
|
+
|
107
|
+
def blob(active_storage_blob)
|
108
|
+
value(active_storage_blob.signed_id)
|
109
|
+
fileUrl(active_storage_blob.key)
|
110
|
+
|
111
|
+
# Avoid returning active_storage_blob.filename for privacy reason
|
112
|
+
fileTitle(active_storage_blob.created_at)
|
113
|
+
end
|
114
|
+
|
115
|
+
# Rename
|
116
|
+
def fileTitle(file_title)
|
117
|
+
json.fileTitle file_title
|
118
|
+
end
|
119
|
+
|
120
|
+
def fileUrl(file_url)
|
121
|
+
json.fileUrl file_url
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
class Date < AbstractField
|
126
|
+
date :min
|
127
|
+
date :max
|
128
|
+
end
|
129
|
+
|
130
|
+
# This doesn't use camel case to be consistent with the html input equivalent
|
131
|
+
class Datetime < AbstractField
|
132
|
+
date_time :min
|
133
|
+
date_time :max
|
134
|
+
end
|
135
|
+
|
136
|
+
class LatLong < AbstractField
|
137
|
+
hash :latitudeField
|
138
|
+
hash :longitudeField
|
77
139
|
end
|
78
140
|
|
79
141
|
end
|
@@ -82,6 +82,16 @@ class Glib::JsonUi::ViewBuilder
|
|
82
82
|
block.call page.list_section_builder
|
83
83
|
end
|
84
84
|
end
|
85
|
+
|
86
|
+
def sections(blocks)
|
87
|
+
json.sections do
|
88
|
+
blocks.each do |block|
|
89
|
+
json.child! do
|
90
|
+
block.call page.list_section_builder
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
85
95
|
end
|
86
96
|
|
87
97
|
class Table < View
|
@@ -10,9 +10,9 @@ module Glib
|
|
10
10
|
end
|
11
11
|
|
12
12
|
class View < JsonUiElement
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
length :width
|
14
|
+
length :height
|
15
|
+
color :backgroundColor
|
16
16
|
hash :padding
|
17
17
|
end
|
18
18
|
|
@@ -42,6 +42,7 @@ module Glib
|
|
42
42
|
string :text
|
43
43
|
action :onClick
|
44
44
|
array :styleClasses
|
45
|
+
singleton_array :styleClass, :styleClasses
|
45
46
|
end
|
46
47
|
|
47
48
|
class Fab < View
|
@@ -66,8 +67,12 @@ module Glib
|
|
66
67
|
string :dataUrl
|
67
68
|
end
|
68
69
|
|
70
|
+
class Calendar < View
|
71
|
+
string :dataUrl
|
72
|
+
end
|
73
|
+
|
69
74
|
class TabBar < View
|
70
|
-
|
75
|
+
color :color
|
71
76
|
|
72
77
|
def tabButtons(block)
|
73
78
|
json.tabButtons do
|
@@ -3,12 +3,17 @@
|
|
3
3
|
page.leftDrawer content: ->(drawer) do
|
4
4
|
drawer.header childViews: ->(header) do
|
5
5
|
header.h1 text: 'App', onClick: ->(action) do
|
6
|
-
action.windows_open url: json_ui_garage_url
|
6
|
+
# action.windows_open url: json_ui_garage_url
|
7
|
+
action.windows_open url: root_url
|
7
8
|
end
|
8
9
|
end
|
9
10
|
|
10
11
|
drawer.rows builder: ->(menu) do
|
11
12
|
|
13
|
+
menu.button text: 'Menu', onClick: ->(action) do
|
14
|
+
action.windows_open url: json_ui_garage_url
|
15
|
+
end
|
16
|
+
|
12
17
|
menu.button text: 'Pages', onClick: ->(action) do
|
13
18
|
action.windows_open url: json_ui_garage_url(path: 'pages/index')
|
14
19
|
end
|
@@ -3,41 +3,53 @@ json.title 'Actions'
|
|
3
3
|
json_ui_page json do |page|
|
4
4
|
render "#{@path_prefix}/nav_menu", json: json, page: page
|
5
5
|
|
6
|
-
page.list
|
7
|
-
|
8
|
-
|
9
|
-
action.dialogs_alert message: 'This is an alert'
|
6
|
+
page.list sections: [->(section) do
|
7
|
+
section.header padding: { top: 12, bottom: 12, left: 16, right: 16 }, childViews: ->(header) do
|
8
|
+
header.h3 text: 'Dialogs'
|
10
9
|
end
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
action.dialogs_alert message: 'Option 2'
|
11
|
+
section.rows builder: ->(template) do
|
12
|
+
template.thumbnail title: 'dialogs/alert', onClick: ->(action) do
|
13
|
+
action.dialogs_alert message: 'This is an alert'
|
14
|
+
end
|
15
|
+
|
16
|
+
template.thumbnail title: 'dialogs/option', onClick: ->(action) do
|
17
|
+
action.dialogs_options message: 'Select one', buttons: ->(menu) do
|
18
|
+
menu.button text: 'Option1', onClick: ->(action) do
|
19
|
+
action.dialogs_alert message: 'Option 1'
|
20
|
+
end
|
21
|
+
menu.button text: 'Option2', onClick: ->(action) do
|
22
|
+
action.dialogs_alert message: 'Option 2'
|
23
|
+
end
|
24
|
+
menu.button text: 'Cancel'
|
27
25
|
end
|
28
|
-
menu.button text: 'Cancel'
|
29
26
|
end
|
30
|
-
end
|
31
27
|
|
32
|
-
|
33
|
-
|
34
|
-
|
28
|
+
template.thumbnail title: 'dialogs/open', onClick: ->(action) do
|
29
|
+
action.dialogs_open url: json_ui_garage_url(path: 'forms/basic')
|
30
|
+
end
|
31
|
+
|
32
|
+
template.thumbnail title: 'dialogs/snackbar', onClick: ->(action) do
|
33
|
+
action.dialogs_snackbar message: 'This is a snackbar'
|
34
|
+
end
|
35
35
|
|
36
|
-
|
37
|
-
|
36
|
+
end
|
37
|
+
end, ->(section) do
|
38
|
+
section.header padding: { top: 12, bottom: 12, left: 16, right: 16 }, childViews: ->(header) do
|
39
|
+
header.h3 text: 'Windows'
|
38
40
|
end
|
39
41
|
|
40
|
-
|
42
|
+
section.rows builder: ->(template) do
|
43
|
+
template.thumbnail title: 'windows/reload', onClick: ->(action) do
|
44
|
+
action.windows_reload
|
45
|
+
end
|
41
46
|
|
42
|
-
|
47
|
+
template.thumbnail title: 'windows/close', onClick: ->(action) do
|
48
|
+
action.windows_close onClose: ->(subaction) do
|
49
|
+
subaction.dialogs_alert message: 'Previous window closed'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
]
|
43
55
|
end
|
@@ -5,7 +5,6 @@ json_ui_page json do |page|
|
|
5
5
|
|
6
6
|
page.form url: json_ui_garage_url(path: 'forms/basic_post'), method: 'post', padding: { top: 12, left: 20, right: 20, bottom: 12 }, childViews: ->(form) do
|
7
7
|
form.fields_text name: 'user[name]', width: 'matchParent', label: 'Name'
|
8
|
-
form.fields_email name: 'user[email]', width: 'matchParent', label: 'Email'
|
9
8
|
form.fields_password name: 'user[password]', width: 'matchParent', label: 'Password'
|
10
9
|
|
11
10
|
form.fields_radioGroup name: 'user[gender]', childViews: ->(group) do
|
@@ -1,10 +1,11 @@
|
|
1
|
-
|
1
|
+
|
2
|
+
name, _ = params.require(:user).values_at(:name)
|
2
3
|
json.onResponse do
|
3
|
-
if name.present?
|
4
|
+
if name.present?
|
4
5
|
json.action 'dialogs/alert-v1'
|
5
|
-
json.message "Submitted information: #{
|
6
|
+
json.message "Submitted information: #{params.require(:user).values.join(", ")}"
|
6
7
|
else
|
7
8
|
json.action 'dialogs/alert-v1'
|
8
|
-
json.message 'Please enter
|
9
|
+
json.message 'Please enter name'
|
9
10
|
end
|
10
11
|
end
|
@@ -10,11 +10,18 @@ json_ui_page json do |page|
|
|
10
10
|
render "#{@path_prefix}/nav_menu", json: json, page: page
|
11
11
|
|
12
12
|
page.form options.merge(childViews: ->(form) do
|
13
|
-
|
13
|
+
rules1 = { fileType: "image/*", maxFileSize: 5000 }
|
14
|
+
rules2 = { fileType: "image/*", maxFileSize: 1, fileTypeErrorText: 'Invalid!', maxFileSizeErrorText: 'Too big!' }
|
15
|
+
form.fields_file name: 'user[photo][]', width: 'matchParent', label: 'Photo', accepts: rules1, directUploadUrl: rails_direct_uploads_path,
|
16
|
+
value: 'eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBFQT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--193dc0d939b9558fc4973fafbba91d989cbb04d4',
|
17
|
+
fileUrl: 'https://imageserver-demo.herokuapp.com/image/itinerarybuilder-demo/o6CKzNt67PWnkPdUEnWMt7pr?h=100&w=100',
|
18
|
+
fileTitle: '1 month ago'
|
19
|
+
form.fields_file name: 'user[photo][]', width: 'matchParent', label: 'Photo', accepts: rules2, directUploadUrl: rails_direct_uploads_path
|
14
20
|
form.button text: 'Submit', onClick: ->(action) { action.forms_submit }
|
15
21
|
end)
|
16
22
|
end
|
17
23
|
|
24
|
+
|
18
25
|
# json_body_with_form json, nil, nil, options do
|
19
26
|
# json.child! do
|
20
27
|
# json.view 'fields/file-v1'
|
@@ -17,6 +17,15 @@ json_ui_page json do |page|
|
|
17
17
|
template.thumbnail title: 'File Upload', onClick: ->(action) do
|
18
18
|
action.windows_open url: json_ui_garage_url(path: 'forms/file_upload')
|
19
19
|
end
|
20
|
+
template.thumbnail title: 'Pickers', onClick: ->(action) do
|
21
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/pickers')
|
22
|
+
end
|
23
|
+
template.thumbnail title: 'Text Validation', onClick: ->(action) do
|
24
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/text_validation')
|
25
|
+
end
|
26
|
+
template.thumbnail title: 'Others', onClick: ->(action) do
|
27
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/others')
|
28
|
+
end
|
20
29
|
end
|
21
30
|
|
22
31
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
json.title 'Forms'
|
2
|
+
|
3
|
+
json_ui_page json do |page|
|
4
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page
|
5
|
+
|
6
|
+
page.form url: json_ui_garage_url(path: 'forms/basic_post'), method: 'post', padding: { top: 12, left: 20, right: 20, bottom: 12 }, childViews: ->(form) do
|
7
|
+
form.fields_text name: 'user[name]', width: 'matchParent', label: 'Name'
|
8
|
+
|
9
|
+
# images = [
|
10
|
+
# {
|
11
|
+
# value: "eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBFQT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--193dc0d939b9558fc4973fafbba91d989cbb04d4",
|
12
|
+
# fileUrl: "https://imageserver-demo.herokuapp.com/image/itinerarybuilder-demo/o6CKzNt67PWnkPdUEnWMt7pr?h=100&w=100"
|
13
|
+
# }
|
14
|
+
# ]
|
15
|
+
# form.fields_richText name: 'user[bio]', width: 'matchParent', label: 'Content', images: images, value: '<p>Test {{image1}}</p>'
|
16
|
+
|
17
|
+
json.child! do
|
18
|
+
json.view 'fields/richText-v1'
|
19
|
+
json.width 'matchParent'
|
20
|
+
json.label 'Content'
|
21
|
+
json.name 'user[bio]'
|
22
|
+
json.value '<p>Test {{image1}}</p>'
|
23
|
+
|
24
|
+
json.images do
|
25
|
+
json.child! do
|
26
|
+
json.value "eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBFQT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--193dc0d939b9558fc4973fafbba91d989cbb04d4"
|
27
|
+
# json.fileTitle "hita i hanom hg.jpg"
|
28
|
+
json.fileUrl "https://imageserver-demo.herokuapp.com/image/itinerarybuilder-demo/o6CKzNt67PWnkPdUEnWMt7pr?h=100&w=100"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
json.imageUploader do
|
33
|
+
json.accepts(fileType: "image/*", maxFileSize: 5000)
|
34
|
+
json.directUploadUrl rails_direct_uploads_url
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
form.button text: 'Submit', onClick: ->(action) { action.forms_submit }
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
json.title 'Forms'
|
2
|
+
|
3
|
+
json_ui_page json do |page|
|
4
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page
|
5
|
+
|
6
|
+
page.form url: json_ui_garage_url(path: 'forms/basic_post'), method: 'post', padding: { top: 12, left: 20, right: 20, bottom: 12 }, childViews: ->(form) do
|
7
|
+
# TODO: Implement vuejs component, e.g. https://vuetifyjs.com/en/components/date-pickers#date-pickers-in-dialog-and-menu
|
8
|
+
form.fields_date name: 'user[date]', width: 'matchParent', label: 'Date', min: '1990-01-01', max: '2030-01-01', value: '2010-01-01'
|
9
|
+
|
10
|
+
# TODO: Implement vuejs component, e.g. using a combination of:
|
11
|
+
# - https://vuetifyjs.com/en/components/date-pickers#date-pickers-in-dialog-and-menu
|
12
|
+
# - https://vuetifyjs.com/en/components/time-pickers
|
13
|
+
form.fields_datetime name: 'user[date_time]', width: 'matchParent', label: 'Date Time', min: '2018-06-07T00:00', max: '2018-06-14T00:00', value: '2018-06-12T19:30'
|
14
|
+
|
15
|
+
form.fields_latLong name: 'user[address]', width: 'matchParent', label: 'Type an address', value: 'Sydney Harbour Bridge',
|
16
|
+
latitudeField: { name: 'user[latitude]', label: 'Lat', value: -33.8523063, readOnly: true },
|
17
|
+
longitudeField: { name: 'user[longitude]', label: 'Long', value: 151.21078710000006, readOnly: true }
|
18
|
+
|
19
|
+
# json.child! do
|
20
|
+
# json.view 'fields/latLong-v1'
|
21
|
+
# json.name 'user[address]'
|
22
|
+
# json.value 'Sydney Harbour Bridge'
|
23
|
+
# json.label 'Type an address'
|
24
|
+
# json.latitudeField do
|
25
|
+
# json.name 'user[latitude]'
|
26
|
+
# json.label 'Lat'
|
27
|
+
# json.value -33.8523063
|
28
|
+
# json.readOnly true
|
29
|
+
# end
|
30
|
+
# json.longitudeField do
|
31
|
+
# json.name 'user[longitude]'
|
32
|
+
# json.label 'Long'
|
33
|
+
# json.value 151.21078710000006
|
34
|
+
# json.readOnly true
|
35
|
+
# end
|
36
|
+
# end
|
37
|
+
|
38
|
+
form.button text: 'Submit', onClick: ->(action) { action.forms_submit }
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
json.title 'Forms'
|
2
|
+
|
3
|
+
json_ui_page json do |page|
|
4
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page
|
5
|
+
|
6
|
+
page.form url: json_ui_garage_url(path: 'forms/basic_post'), method: 'post', padding: { top: 12, left: 20, right: 20, bottom: 12 }, childViews: ->(form) do
|
7
|
+
# TODO: Turn on html5 validation
|
8
|
+
form.fields_email name: 'user[email]', width: 'matchParent', label: 'Email'
|
9
|
+
form.fields_email name: 'user[url]', width: 'matchParent', label: 'URL'
|
10
|
+
|
11
|
+
form.panels_split width: 'matchParent', rightViews: ->(split) do
|
12
|
+
split.button text: 'Submit', onClick: ->(action) { action.forms_submit }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -4,8 +4,8 @@ json_ui_page json do |page|
|
|
4
4
|
render "#{@path_prefix}/nav_menu", json: json, page: page
|
5
5
|
|
6
6
|
page.list firstSection: ->(section) do
|
7
|
-
section.header
|
8
|
-
header.
|
7
|
+
section.header padding: { top: 12, left: 16, right: 16, bottom: 12 }, childViews: ->(header) do
|
8
|
+
header.h3 text: 'Section Header'
|
9
9
|
end
|
10
10
|
|
11
11
|
section.rows builder: ->(template) do
|
@@ -8,47 +8,21 @@ json_ui_page json do |page|
|
|
8
8
|
|
9
9
|
['FIRST', 'SECOND', 'THIRD'].each_with_index do |text, index|
|
10
10
|
menu.button text: text, disabled: params[:tab].to_i == index, onClick: ->(action) do
|
11
|
-
action.windows_open url: json_ui_garage_url(path: 'pages/tab_bar', tab: index)
|
11
|
+
# action.windows_open url: json_ui_garage_url(path: 'pages/tab_bar', tab: index)
|
12
|
+
action.windows_reload url: json_ui_garage_url(path: 'pages/tab_bar', tab: index)
|
12
13
|
end
|
13
14
|
end
|
14
15
|
end
|
15
|
-
|
16
|
-
# json.child! do
|
17
|
-
# json.view 'tabBar-v1'
|
18
|
-
# json.width 'matchParent'
|
19
|
-
# json.backgroundColor '#ffca05'
|
20
|
-
# json.color '#7f561b'
|
21
|
-
# json.tabButtons do
|
22
|
-
# json.child! do
|
23
|
-
# json.text 'FIRST'
|
24
|
-
# json.selected params[:tab] == 0
|
25
|
-
# json.onClick do
|
26
|
-
# json.action 'windows/open-v1'
|
27
|
-
# json.url json_ui_garage_url(path: 'pages/tab_bar', tab: 0)
|
28
|
-
# end
|
29
|
-
# end
|
30
|
-
# json.child! do
|
31
|
-
# json.text 'SECOND'
|
32
|
-
# json.selected params[:tab] == 1
|
33
|
-
# json.onClick do
|
34
|
-
# json.action 'windows/open-v1'
|
35
|
-
# json.url json_ui_garage_url(path: 'pages/tab_bar', tab: 1)
|
36
|
-
# end
|
37
|
-
# end
|
38
|
-
# json.child! do
|
39
|
-
# json.text 'THIRD'
|
40
|
-
# json.selected params[:tab] == 2
|
41
|
-
# json.onClick do
|
42
|
-
# json.action 'windows/open-v1'
|
43
|
-
# json.url json_ui_garage_url(path: 'pages/tab_bar', tab: 2)
|
44
|
-
# end
|
45
|
-
# end
|
46
|
-
# end
|
47
|
-
# end
|
48
16
|
end
|
49
17
|
|
50
18
|
page.scroll padding: {top: 12, left: 20, right: 20, bottom: 12}, childViews: ->(scroll) do
|
51
|
-
scroll.label text: "Tab index #{params[:tab]} selected"
|
19
|
+
scroll.label text: "Tab index #{params[:tab].to_i} selected"
|
20
|
+
|
21
|
+
scroll.br height: 10
|
22
|
+
|
23
|
+
100.times do |i|
|
24
|
+
scroll.label text: "Line #{i + 1}"
|
25
|
+
end
|
52
26
|
end
|
53
27
|
|
54
28
|
end
|
@@ -6,6 +6,13 @@ json_ui_page json do |page|
|
|
6
6
|
page.scroll padding: {top: 20, left: 20, right: 20, bottom: 20}, childViews: ->(scroll) do
|
7
7
|
scroll.h1 text: 'Map'
|
8
8
|
scroll.br height: 6
|
9
|
-
scroll.map latitude: 13.4837, longitude: 144.7917, zoom: 11,
|
9
|
+
scroll.map width: 'matchParent', latitude: 13.4837, longitude: 144.7917, zoom: 11, height: 250, dataUrl: json_ui_garage_url(path: 'views/map_data')
|
10
|
+
|
11
|
+
# TODO: Implement in vuejs
|
12
|
+
scroll.br height: 20
|
13
|
+
scroll.h1 text: 'Calendar'
|
14
|
+
scroll.br height: 6
|
15
|
+
scroll.calendar width: 'matchParent', height: 500, dataUrl: json_ui_garage_url(path: 'views/calendar_data')
|
16
|
+
|
10
17
|
end
|
11
18
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
json.events do
|
3
|
+
json.child! do
|
4
|
+
json.date '2018-12-30'
|
5
|
+
json.text 'Birthday'
|
6
|
+
json.onClick do
|
7
|
+
json.action 'dialogs/alert-v1'
|
8
|
+
json.message 'At home'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
json.child! do
|
13
|
+
json.date '2018-12-31'
|
14
|
+
json.text 'Conference'
|
15
|
+
json.onClick do
|
16
|
+
json.action 'dialogs/alert-v1'
|
17
|
+
json.message 'In Perth'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
json.child! do
|
22
|
+
json.date '2019-01-01'
|
23
|
+
json.text 'Hackathon'
|
24
|
+
json.onClick do
|
25
|
+
json.action 'dialogs/alert-v1'
|
26
|
+
json.message 'At Town Hall'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
json.title 'Views'
|
2
|
+
|
3
|
+
json_ui_page json do |page|
|
4
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page
|
5
|
+
|
6
|
+
page.scroll padding: {top: 20, left: 20, right: 20, bottom: 20}, childViews: ->(scroll) do
|
7
|
+
scroll.h1 text: 'Line Chart'
|
8
|
+
|
9
|
+
json.child! do
|
10
|
+
json.view 'charts/line-v1'
|
11
|
+
json.dataSeries do
|
12
|
+
json.child! do
|
13
|
+
json.title 'Line 1'
|
14
|
+
|
15
|
+
points = {
|
16
|
+
'Sat, 10 Nov 2018' => 1,
|
17
|
+
'Sun, 11 Nov 2018' => 7,
|
18
|
+
'Mon, 12 Nov 2018' => 2,
|
19
|
+
'Tue, 13 Nov 2018' => 0,
|
20
|
+
'Wed, 14 Nov 2018' => 1,
|
21
|
+
'Thu, 15 Nov 2018' => 1,
|
22
|
+
'Fri, 16 Nov 2018' => 5,
|
23
|
+
}
|
24
|
+
json.dataPoints points
|
25
|
+
end
|
26
|
+
|
27
|
+
json.child! do
|
28
|
+
json.title 'Line 2'
|
29
|
+
|
30
|
+
points = {
|
31
|
+
'Sat, 10 Nov 2018' => 5,
|
32
|
+
'Sun, 11 Nov 2018' => 3,
|
33
|
+
'Mon, 12 Nov 2018' => 8,
|
34
|
+
'Tue, 13 Nov 2018' => 5,
|
35
|
+
'Wed, 14 Nov 2018' => 3,
|
36
|
+
'Thu, 15 Nov 2018' => 5,
|
37
|
+
'Fri, 16 Nov 2018' => 1,
|
38
|
+
}
|
39
|
+
json.dataPoints points
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -11,9 +11,12 @@ json_ui_page json do |page|
|
|
11
11
|
template.thumbnail title: 'Images', onClick: ->(action) do
|
12
12
|
action.windows_open url: json_ui_garage_url(path: 'views/images')
|
13
13
|
end
|
14
|
-
template.thumbnail title: '
|
14
|
+
template.thumbnail title: 'Carousels', onClick: ->(action) do
|
15
15
|
action.windows_open url: json_ui_garage_url(path: 'views/carousels')
|
16
16
|
end
|
17
|
+
template.thumbnail title: 'Charts', onClick: ->(action) do
|
18
|
+
action.windows_open url: json_ui_garage_url(path: 'views/charts')
|
19
|
+
end
|
17
20
|
end
|
18
21
|
|
19
22
|
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.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ''
|
@@ -54,8 +54,11 @@ files:
|
|
54
54
|
- app/views/json_ui/garage/forms/floating_submit.json.jbuilder
|
55
55
|
- app/views/json_ui/garage/forms/generic_post.json.jbuilder
|
56
56
|
- app/views/json_ui/garage/forms/index.json.jbuilder
|
57
|
+
- app/views/json_ui/garage/forms/others.json.jbuilder
|
58
|
+
- app/views/json_ui/garage/forms/pickers.json.jbuilder
|
57
59
|
- app/views/json_ui/garage/forms/submit_indicator.json.jbuilder
|
58
60
|
- app/views/json_ui/garage/forms/submit_indicator_post.json.jbuilder
|
61
|
+
- app/views/json_ui/garage/forms/text_validation.json.jbuilder
|
59
62
|
- app/views/json_ui/garage/home/index.json.jbuilder
|
60
63
|
- app/views/json_ui/garage/lists/_infinite_scroll_section.json.jbuilder
|
61
64
|
- app/views/json_ui/garage/lists/index.json.jbuilder
|
@@ -72,7 +75,9 @@ files:
|
|
72
75
|
- app/views/json_ui/garage/panels/split.json.jbuilder
|
73
76
|
- app/views/json_ui/garage/panels/vertical.json.jbuilder
|
74
77
|
- app/views/json_ui/garage/views/basic.json.jbuilder
|
78
|
+
- app/views/json_ui/garage/views/calendar_data.json.jbuilder
|
75
79
|
- app/views/json_ui/garage/views/carousels.json.jbuilder
|
80
|
+
- app/views/json_ui/garage/views/charts.json.jbuilder
|
76
81
|
- app/views/json_ui/garage/views/images.json.jbuilder
|
77
82
|
- app/views/json_ui/garage/views/index.json.jbuilder
|
78
83
|
- app/views/json_ui/garage/views/map_data.json.jbuilder
|