glib-web 0.5.45 → 0.5.51
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/is_typing_channel.rb +28 -0
- data/app/controllers/concerns/glib/json/traversal.rb +5 -0
- data/app/controllers/glib/home_controller.rb +0 -0
- data/app/helpers/glib/json_ui/abstract_builder.rb +0 -0
- data/app/helpers/glib/json_ui/action_builder.rb +9 -0
- data/app/helpers/glib/json_ui/list_builders.rb +6 -1
- data/app/helpers/glib/json_ui/page_helper.rb +11 -3
- data/app/helpers/glib/json_ui/response_helper.rb +0 -0
- data/app/helpers/glib/json_ui/view_builder.rb +1 -0
- data/app/helpers/glib/json_ui/view_builder/fields.rb +4 -0
- data/app/helpers/glib/json_ui/view_builder/panels.rb +0 -0
- data/app/views/json_ui/garage/actions/index.json.jbuilder +0 -0
- data/app/views/json_ui/garage/forms/_alert_post_data.json.jbuilder +0 -0
- data/app/views/json_ui/garage/forms/conditional_value.json.jbuilder +0 -0
- data/app/views/json_ui/garage/forms/dynamic_group.json.jbuilder +30 -47
- data/app/views/json_ui/garage/forms/dynamic_select.json.jbuilder +16 -19
- data/app/views/json_ui/garage/forms/file_upload.json.jbuilder +24 -57
- data/app/views/json_ui/garage/forms/floating_submit.json.jbuilder +11 -23
- data/app/views/json_ui/garage/forms/get_request.json.jbuilder +20 -21
- data/app/views/json_ui/garage/forms/index.json.jbuilder +83 -85
- data/app/views/json_ui/garage/forms/new_rich_text.json.jbuilder +28 -29
- data/app/views/json_ui/garage/forms/pickers.json.jbuilder +41 -43
- data/app/views/json_ui/garage/forms/selects.json.jbuilder +0 -0
- data/app/views/json_ui/garage/forms/show_hide.json.jbuilder +0 -0
- data/app/views/json_ui/garage/forms/styled_boxes.json.jbuilder +0 -0
- data/app/views/json_ui/garage/forms/text_validation.json.jbuilder +4 -2
- data/app/views/json_ui/garage/home/index.json.jbuilder +0 -0
- data/app/views/json_ui/garage/lists/_autoload_section.json.jbuilder +0 -0
- data/app/views/json_ui/garage/lists/edit_actions.json.jbuilder +0 -0
- data/app/views/json_ui/garage/lists/index.json.jbuilder +0 -0
- data/app/views/json_ui/garage/lists/reordering.json.jbuilder +13 -3
- data/app/views/json_ui/garage/notifications/action_cable.json.jbuilder +97 -0
- data/app/views/json_ui/garage/notifications/android_post.json.jbuilder +0 -0
- data/app/views/json_ui/garage/notifications/index.json.jbuilder +5 -1
- data/app/views/json_ui/garage/views/maps.json.jbuilder +0 -0
- data/app/views/json_ui/garage/views/texts.json.jbuilder +40 -37
- data/lib/glib/json_crawler/router.rb +2 -0
- data/lib/glib/test_helpers.rb +16 -4
- metadata +24 -9
@@ -1,110 +1,108 @@
|
|
1
1
|
json.title 'Forms'
|
2
2
|
|
3
|
-
json_ui_page json
|
4
|
-
|
3
|
+
page = json_ui_page json
|
4
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page, top_nav: true
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
section.rows builder: ->(template) do
|
13
|
-
template.thumbnail title: 'Basic Logic', onClick: ->(action) do
|
14
|
-
action.windows_open url: json_ui_garage_url(path: 'forms/basic')
|
15
|
-
end
|
16
|
-
template.thumbnail title: "Submission Flow (timestamp: #{DateTime.current.to_i})", onClick: ->(action) do
|
17
|
-
action.windows_open url: json_ui_garage_url(path: 'forms/submission_flow')
|
18
|
-
end
|
19
|
-
template.thumbnail title: "Submission Indicator", onClick: ->(action) do
|
20
|
-
action.windows_open url: json_ui_garage_url(path: 'forms/submission_indicator')
|
21
|
-
end
|
22
|
-
template.thumbnail title: 'GET Request', onClick: ->(action) do
|
23
|
-
action.windows_open url: json_ui_garage_url(path: 'forms/get_request')
|
24
|
-
end
|
6
|
+
page.list sections: [
|
7
|
+
->(section) do
|
8
|
+
section.header padding: glib_json_padding_list, childViews: ->(header) do
|
9
|
+
header.h2 text: 'Submission Logics'
|
10
|
+
end
|
25
11
|
|
12
|
+
section.rows builder: ->(template) do
|
13
|
+
template.thumbnail title: 'Basic Logic', onClick: ->(action) do
|
14
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/basic')
|
26
15
|
end
|
27
|
-
|
28
|
-
|
29
|
-
|
16
|
+
template.thumbnail title: "Submission Flow (timestamp: #{DateTime.current.to_i})", onClick: ->(action) do
|
17
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/submission_flow')
|
18
|
+
end
|
19
|
+
template.thumbnail title: "Submission Indicator", onClick: ->(action) do
|
20
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/submission_indicator')
|
21
|
+
end
|
22
|
+
template.thumbnail title: 'GET Request', onClick: ->(action) do
|
23
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/get_request')
|
30
24
|
end
|
31
25
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
action.windows_open url: json_ui_garage_url(path: 'forms/show_hide')
|
38
|
-
end
|
39
|
-
template.thumbnail title: 'Conditional Value', onClick: ->(action) do
|
40
|
-
action.windows_open url: json_ui_garage_url(path: 'forms/conditional_value')
|
41
|
-
end
|
26
|
+
end
|
27
|
+
end, ->(section) do
|
28
|
+
section.header padding: glib_json_padding_list, childViews: ->(header) do
|
29
|
+
header.h2 text: 'Form Logics'
|
30
|
+
end
|
42
31
|
|
32
|
+
section.rows builder: ->(template) do
|
33
|
+
template.thumbnail title: 'Text Validation', onClick: ->(action) do
|
34
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/text_validation')
|
35
|
+
end
|
36
|
+
template.thumbnail title: 'Show/Hide', onClick: ->(action) do
|
37
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/show_hide')
|
43
38
|
end
|
44
|
-
|
45
|
-
|
46
|
-
header.h2 text: 'Form Fields'
|
39
|
+
template.thumbnail title: 'Conditional Value', onClick: ->(action) do
|
40
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/conditional_value')
|
47
41
|
end
|
48
42
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
action.windows_open url: json_ui_garage_url(path: 'forms/selects')
|
55
|
-
end
|
56
|
-
template.thumbnail title: 'File Upload', onClick: ->(action) do
|
57
|
-
action.windows_open url: json_ui_garage_url(path: 'forms/file_upload')
|
58
|
-
end
|
59
|
-
template.thumbnail title: 'Floating Submit', onClick: ->(action) do
|
60
|
-
action.windows_open url: json_ui_garage_url(path: 'forms/floating_submit')
|
61
|
-
end
|
43
|
+
end
|
44
|
+
end, ->(section) do
|
45
|
+
section.header padding: glib_json_padding_list, childViews: ->(header) do
|
46
|
+
header.h2 text: 'Form Fields'
|
47
|
+
end
|
62
48
|
|
49
|
+
section.rows builder: ->(template) do
|
50
|
+
template.thumbnail title: 'Pickers', onClick: ->(action) do
|
51
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/pickers')
|
63
52
|
end
|
64
|
-
|
65
|
-
|
66
|
-
header.h2 text: 'Styling'
|
53
|
+
template.thumbnail title: 'Select Fields', onClick: ->(action) do
|
54
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/selects')
|
67
55
|
end
|
68
|
-
|
69
|
-
|
70
|
-
action.windows_open url: json_ui_garage_url(path: 'forms/styled_boxes')
|
71
|
-
end
|
56
|
+
template.thumbnail title: 'File Upload', onClick: ->(action) do
|
57
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/file_upload')
|
72
58
|
end
|
73
|
-
|
74
|
-
|
75
|
-
header.h2 text: 'Web Only'
|
59
|
+
template.thumbnail title: 'Floating Submit', onClick: ->(action) do
|
60
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/floating_submit')
|
76
61
|
end
|
77
62
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
63
|
+
end
|
64
|
+
end, ->(section) do
|
65
|
+
section.header padding: glib_json_padding_list, childViews: ->(header) do
|
66
|
+
header.h2 text: 'Styling'
|
67
|
+
end
|
68
|
+
section.rows builder: ->(template) do
|
69
|
+
template.thumbnail title: 'Text Boxes', onClick: ->(action) do
|
70
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/styled_boxes')
|
82
71
|
end
|
72
|
+
end
|
73
|
+
end, ->(section) do
|
74
|
+
section.header padding: glib_json_padding_list, childViews: ->(header) do
|
75
|
+
header.h2 text: 'Web Only'
|
76
|
+
end
|
83
77
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
end
|
88
|
-
|
78
|
+
section.rows builder: ->(template) do
|
79
|
+
template.thumbnail title: 'Rich Text Editor', onClick: ->(action) do
|
80
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/rich_text')
|
89
81
|
end
|
90
|
-
end
|
91
|
-
|
92
|
-
|
82
|
+
end
|
83
|
+
|
84
|
+
section.rows builder: ->(template) do
|
85
|
+
template.thumbnail title: 'New Rich Text Editor', onClick: ->(action) do
|
86
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/new_rich_text')
|
93
87
|
end
|
94
88
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
action.windows_open url: json_ui_garage_url(path: 'forms/dynamic_select')
|
101
|
-
end
|
102
|
-
template.thumbnail title: 'Checkboxes', onClick: ->(action) do
|
103
|
-
action.windows_open url: json_ui_garage_url(path: 'forms/checkboxes')
|
104
|
-
end
|
89
|
+
end
|
90
|
+
end, ->(section) do
|
91
|
+
section.header padding: glib_json_padding_list, childViews: ->(header) do
|
92
|
+
header.h2 text: 'Experimental (not required yet)'
|
93
|
+
end
|
105
94
|
|
95
|
+
section.rows builder: ->(template) do
|
96
|
+
template.thumbnail title: 'Dynamic Group', onClick: ->(action) do
|
97
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/dynamic_group')
|
98
|
+
end
|
99
|
+
template.thumbnail title: 'Dynamic Select', onClick: ->(action) do
|
100
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/dynamic_select')
|
101
|
+
end
|
102
|
+
template.thumbnail title: 'Checkboxes', onClick: ->(action) do
|
103
|
+
action.windows_open url: json_ui_garage_url(path: 'forms/checkboxes')
|
106
104
|
end
|
107
|
-
end
|
108
|
-
]
|
109
105
|
|
110
|
-
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
]
|
@@ -1,40 +1,39 @@
|
|
1
1
|
json.title 'Forms'
|
2
2
|
|
3
|
-
json_ui_page json
|
4
|
-
|
3
|
+
page = json_ui_page json
|
4
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page
|
5
5
|
|
6
|
-
|
7
|
-
|
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
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
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
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
json.child! do
|
18
|
+
json.view 'fields/newRichText-v1'
|
19
|
+
json.width 'matchParent'
|
20
|
+
json.label 'Content'
|
21
|
+
json.name 'user[bio]'
|
22
|
+
json.value '<p>Test {{image1}}</p>'
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
json.imageUploader do
|
33
|
-
json.accepts(fileType: "image/*", maxFileSize: 5000)
|
34
|
-
json.directUploadUrl rails_direct_uploads_url
|
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"
|
35
29
|
end
|
36
30
|
end
|
37
31
|
|
38
|
-
|
32
|
+
json.imageUploader do
|
33
|
+
json.accepts(fileType: "image/*", maxFileSize: 5000)
|
34
|
+
json.directUploadUrl rails_direct_uploads_url
|
35
|
+
end
|
39
36
|
end
|
37
|
+
|
38
|
+
form.button text: 'Submit', onClick: ->(action) { action.forms_submit }
|
40
39
|
end
|
@@ -1,48 +1,46 @@
|
|
1
1
|
json.title 'Forms'
|
2
2
|
|
3
|
-
json_ui_page json
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
form.spacer height: 20
|
17
|
-
form.h2 text: 'Single Checkbox'
|
18
|
-
form.fields_check name: 'user[age_range]', value: '16+', checkValue: '16+', uncheckValue: '0-16', label: 'I am over 16 (has default value)'
|
19
|
-
form.fields_check name: 'user[employer]', checkValue: 1, label: 'I am an employer (no default value)'
|
20
|
-
form.fields_check name: 'user[enabled]', checkValue: true, label: 'Enable', styleClass: 'switch', value: 'true'
|
21
|
-
|
22
|
-
form.spacer height: 20
|
23
|
-
form.h2 text: 'Date/Time'
|
24
|
-
form.spacer height: 6
|
25
|
-
form.fields_date name: 'user[date]', width: 'matchParent', label: 'Date', min: '2010-01-01', max: '2012-01-01', value: '2010-02-01'
|
26
|
-
form.fields_datetime name: 'user[date_time]', width: 'matchParent', label: 'Date Time', min: '2018-06-09T00:00', max: '2018-06-17T00:00', value: '2018-06-15T19:30'
|
27
|
-
|
28
|
-
form.spacer height: 20
|
29
|
-
form.h2 text: 'Country'
|
30
|
-
form.spacer height: 6
|
31
|
-
region_field = { name: 'user[city]', label: 'City' }
|
32
|
-
form.fields_country name: 'user[country]', width: 'matchParent', label: 'Country', region: region_field
|
33
|
-
|
34
|
-
form.spacer height: 20
|
35
|
-
form.h2 text: 'Map'
|
36
|
-
form.spacer height: 6
|
37
|
-
form.fields_location name: 'user[address]', width: 'matchParent', label: 'Type an address', value: 'Sydney Harbour Bridge',
|
38
|
-
autocompleteOptions: { componentRestrictions: { country: 'au' }, types: ['(cities)'] },
|
39
|
-
latitudeField: { view: 'fields/text', name: 'user[latitude]', label: 'Lat', value: -33.8523063, readOnly: true },
|
40
|
-
longitudeField: { view: 'fields/text', name: 'user[longitude]', label: 'Long', value: 151.21078710000006, readOnly: true },
|
41
|
-
zoomField: { view: 'fields/text', name: 'user[zoom]', label: 'Zoom' }
|
42
|
-
|
43
|
-
form.spacer height: 20
|
44
|
-
form.fields_submit text: 'Submit'
|
45
|
-
|
3
|
+
page = json_ui_page json
|
4
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page
|
5
|
+
|
6
|
+
page.form url: json_ui_garage_url(path: 'forms/generic_post'), method: 'post', padding: glib_json_padding_body, childViews: ->(form) do
|
7
|
+
form.h2 text: 'Radio Group'
|
8
|
+
form.spacer height: 6
|
9
|
+
form.h4 text: 'Gender'
|
10
|
+
form.fields_radioGroup name: 'user[gender]', value: 'F', childViews: ->(group) do
|
11
|
+
group.fields_radio value: '', label: 'Unknown'
|
12
|
+
group.fields_radio value: 'M', label: 'Male'
|
13
|
+
group.fields_radio value: 'F', label: 'Female'
|
46
14
|
end
|
47
15
|
|
16
|
+
form.spacer height: 20
|
17
|
+
form.h2 text: 'Single Checkbox'
|
18
|
+
form.fields_check name: 'user[age_range]', value: '16+', checkValue: '16+', uncheckValue: '0-16', label: 'I am over 16 (has default value)'
|
19
|
+
form.fields_check name: 'user[employer]', checkValue: 1, label: 'I am an employer (no default value)'
|
20
|
+
form.fields_check name: 'user[enabled]', checkValue: true, label: 'Enable', styleClass: 'switch', value: 'true'
|
21
|
+
|
22
|
+
form.spacer height: 20
|
23
|
+
form.h2 text: 'Date/Time'
|
24
|
+
form.spacer height: 6
|
25
|
+
form.fields_date name: 'user[date]', width: 'matchParent', label: 'Date', min: '2010-01-01', max: '2012-01-01', value: '2010-02-01'
|
26
|
+
form.fields_datetime name: 'user[date_time]', width: 'matchParent', label: 'Date Time', min: '2018-06-09T00:00', max: '2018-06-17T00:00', value: '2018-06-15T19:30'
|
27
|
+
|
28
|
+
form.spacer height: 20
|
29
|
+
form.h2 text: 'Country'
|
30
|
+
form.spacer height: 6
|
31
|
+
region_field = { name: 'user[city]', label: 'City' }
|
32
|
+
form.fields_country name: 'user[country]', width: 'matchParent', label: 'Country', region: region_field
|
33
|
+
|
34
|
+
form.spacer height: 20
|
35
|
+
form.h2 text: 'Map'
|
36
|
+
form.spacer height: 6
|
37
|
+
form.fields_location name: 'user[address]', width: 'matchParent', label: 'Type an address', value: 'Sydney Harbour Bridge',
|
38
|
+
autocompleteOptions: { componentRestrictions: { country: 'au' }, types: ['(cities)'] },
|
39
|
+
latitudeField: { view: 'fields/text', name: 'user[latitude]', label: 'Lat', value: -33.8523063, readOnly: true },
|
40
|
+
longitudeField: { view: 'fields/text', name: 'user[longitude]', label: 'Long', value: 151.21078710000006, readOnly: true },
|
41
|
+
zoomField: { view: 'fields/text', name: 'user[zoom]', label: 'Zoom' }
|
42
|
+
|
43
|
+
form.spacer height: 20
|
44
|
+
form.fields_submit text: 'Submit'
|
45
|
+
|
48
46
|
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -23,13 +23,15 @@ page.form \
|
|
23
23
|
width: 'matchParent',
|
24
24
|
label: 'Number',
|
25
25
|
validation: { required: { message: 'Required' } },
|
26
|
-
|
26
|
+
leftText: 'USD',
|
27
|
+
rightText: '.00'
|
27
28
|
|
28
29
|
form.fields_password \
|
29
30
|
name: 'user[password]',
|
30
31
|
width: 'matchParent',
|
31
32
|
label: 'Password',
|
32
|
-
hint: 'Should contain at least 6 characters'
|
33
|
+
hint: 'Should contain at least 6 characters',
|
34
|
+
leftIcon: 'lock'
|
33
35
|
|
34
36
|
form.fields_textarea \
|
35
37
|
name: 'user[textarea]',
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -18,7 +18,17 @@ else
|
|
18
18
|
|
19
19
|
render "#{@path_prefix}/nav_menu", json: json, page: page
|
20
20
|
|
21
|
-
page.list nextPage: next_page,
|
22
|
-
|
23
|
-
|
21
|
+
page.list nextPage: next_page, sections: [
|
22
|
+
->(section) do
|
23
|
+
section.header padding: glib_json_padding_list, childViews: ->(header) do
|
24
|
+
header.h3 text: 'Section One'
|
25
|
+
end
|
26
|
+
end,
|
27
|
+
->(section) do
|
28
|
+
section.header padding: glib_json_padding_list, childViews: ->(header) do
|
29
|
+
header.h3 text: 'Section Two'
|
30
|
+
end
|
31
|
+
render 'json_ui/garage/lists/autoload_section', page: page, page_index: page_index, reorder: true
|
32
|
+
end
|
33
|
+
]
|
24
34
|
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
json.title 'ActionCable Real-time Update'
|
2
|
+
page = json_ui_page json
|
3
|
+
|
4
|
+
# Implement a page that shows how ActionCable works in json_ui
|
5
|
+
|
6
|
+
# 1. Example for list
|
7
|
+
# column.panels_list actionCable: socket_config, width: 'matchParent', firstSection: ->(section) do
|
8
|
+
# section.rows objects: @messages, builder: -> (row, message, index) do
|
9
|
+
# render 'conversations/message', row: row, message: message, user: current_user
|
10
|
+
# end
|
11
|
+
# end
|
12
|
+
|
13
|
+
# page.form url: json_ui_garage_url(path: 'forms/basic_post'), method: 'post', padding: glib_json_padding_body, childViews: ->(form) do
|
14
|
+
# form.fields_textarea \
|
15
|
+
# width: 'matchParent',
|
16
|
+
# label: 'Message',
|
17
|
+
# onKeyUp: ->(action) do
|
18
|
+
# action.cables_push channel: 'isTypingChannel', data: { conversationId: 1, userId: 1 }
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
|
22
|
+
|
23
|
+
# 3. Example for online status
|
24
|
+
# - TODO: Implement "repeat: true" in glib-web-npm
|
25
|
+
# page.on load: ->(action) do
|
26
|
+
# action.timeouts_set interval: 10000, repeat: true, onTimeout: ->(subaction) do
|
27
|
+
# subaction.cables_push channel: 'message', event: 'online'
|
28
|
+
# end
|
29
|
+
# end
|
30
|
+
|
31
|
+
|
32
|
+
# put on app/channels/is_typing_channel.rb
|
33
|
+
# class IsTypingChannel < Glib::Channel::IsTypingChannel
|
34
|
+
# self.channel_name = 'IsTypingChannel'
|
35
|
+
# end
|
36
|
+
|
37
|
+
page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
|
38
|
+
|
39
|
+
channel = 'IsTypingChannel'
|
40
|
+
first_user = User.first
|
41
|
+
second_user = User.offset(1).first
|
42
|
+
|
43
|
+
scroll.panels_split width: 'matchParent', content: ->(content) do
|
44
|
+
content.left childViews: ->(left) do
|
45
|
+
left.fields_textarea \
|
46
|
+
width: 'matchParent',
|
47
|
+
label: "Messages from #{first_user.full_name}",
|
48
|
+
onTypeStart: lambda { |action|
|
49
|
+
action.cables_push \
|
50
|
+
channel: channel, event: 'typing',
|
51
|
+
payload: { status: true, user_id: first_user.id }
|
52
|
+
},
|
53
|
+
onTypeEnd: lambda { |action|
|
54
|
+
action.cables_push \
|
55
|
+
channel: channel,
|
56
|
+
event: 'typing',
|
57
|
+
payload: { status: false, user_id: first_user.id }
|
58
|
+
}
|
59
|
+
left.spacer height: 10
|
60
|
+
|
61
|
+
socket_config = {
|
62
|
+
channel: channel,
|
63
|
+
filterKey: first_user.id,
|
64
|
+
params: {
|
65
|
+
conversation: 2
|
66
|
+
}
|
67
|
+
}
|
68
|
+
left.label actionCable: socket_config, text: ' '
|
69
|
+
end
|
70
|
+
content.right childViews: ->(right) do
|
71
|
+
right.fields_textarea \
|
72
|
+
width: 'matchParent',
|
73
|
+
label: "Messages from #{second_user.full_name}",
|
74
|
+
onTypeStart: lambda { |action|
|
75
|
+
action.cables_push \
|
76
|
+
channel: channel, event: 'typing',
|
77
|
+
payload: { status: true, user_id: second_user.id }
|
78
|
+
},
|
79
|
+
onTypeEnd: lambda { |action|
|
80
|
+
action.cables_push \
|
81
|
+
channel: channel,
|
82
|
+
event: 'typing',
|
83
|
+
payload: { status: false, user_id: second_user.id }
|
84
|
+
}
|
85
|
+
right.spacer height: 10
|
86
|
+
|
87
|
+
socket_config = {
|
88
|
+
channel: channel,
|
89
|
+
filterKey: second_user.id,
|
90
|
+
params: {
|
91
|
+
conversation: 2
|
92
|
+
}
|
93
|
+
}
|
94
|
+
right.label actionCable: socket_config, text: ' '
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|