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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/app/channels/glib/channel/is_typing_channel.rb +28 -0
  3. data/app/controllers/concerns/glib/json/traversal.rb +5 -0
  4. data/app/controllers/glib/home_controller.rb +0 -0
  5. data/app/helpers/glib/json_ui/abstract_builder.rb +0 -0
  6. data/app/helpers/glib/json_ui/action_builder.rb +9 -0
  7. data/app/helpers/glib/json_ui/list_builders.rb +6 -1
  8. data/app/helpers/glib/json_ui/page_helper.rb +11 -3
  9. data/app/helpers/glib/json_ui/response_helper.rb +0 -0
  10. data/app/helpers/glib/json_ui/view_builder.rb +1 -0
  11. data/app/helpers/glib/json_ui/view_builder/fields.rb +4 -0
  12. data/app/helpers/glib/json_ui/view_builder/panels.rb +0 -0
  13. data/app/views/json_ui/garage/actions/index.json.jbuilder +0 -0
  14. data/app/views/json_ui/garage/forms/_alert_post_data.json.jbuilder +0 -0
  15. data/app/views/json_ui/garage/forms/conditional_value.json.jbuilder +0 -0
  16. data/app/views/json_ui/garage/forms/dynamic_group.json.jbuilder +30 -47
  17. data/app/views/json_ui/garage/forms/dynamic_select.json.jbuilder +16 -19
  18. data/app/views/json_ui/garage/forms/file_upload.json.jbuilder +24 -57
  19. data/app/views/json_ui/garage/forms/floating_submit.json.jbuilder +11 -23
  20. data/app/views/json_ui/garage/forms/get_request.json.jbuilder +20 -21
  21. data/app/views/json_ui/garage/forms/index.json.jbuilder +83 -85
  22. data/app/views/json_ui/garage/forms/new_rich_text.json.jbuilder +28 -29
  23. data/app/views/json_ui/garage/forms/pickers.json.jbuilder +41 -43
  24. data/app/views/json_ui/garage/forms/selects.json.jbuilder +0 -0
  25. data/app/views/json_ui/garage/forms/show_hide.json.jbuilder +0 -0
  26. data/app/views/json_ui/garage/forms/styled_boxes.json.jbuilder +0 -0
  27. data/app/views/json_ui/garage/forms/text_validation.json.jbuilder +4 -2
  28. data/app/views/json_ui/garage/home/index.json.jbuilder +0 -0
  29. data/app/views/json_ui/garage/lists/_autoload_section.json.jbuilder +0 -0
  30. data/app/views/json_ui/garage/lists/edit_actions.json.jbuilder +0 -0
  31. data/app/views/json_ui/garage/lists/index.json.jbuilder +0 -0
  32. data/app/views/json_ui/garage/lists/reordering.json.jbuilder +13 -3
  33. data/app/views/json_ui/garage/notifications/action_cable.json.jbuilder +97 -0
  34. data/app/views/json_ui/garage/notifications/android_post.json.jbuilder +0 -0
  35. data/app/views/json_ui/garage/notifications/index.json.jbuilder +5 -1
  36. data/app/views/json_ui/garage/views/maps.json.jbuilder +0 -0
  37. data/app/views/json_ui/garage/views/texts.json.jbuilder +40 -37
  38. data/lib/glib/json_crawler/router.rb +2 -0
  39. data/lib/glib/test_helpers.rb +16 -4
  40. metadata +24 -9
@@ -1,110 +1,108 @@
1
1
  json.title 'Forms'
2
2
 
3
- json_ui_page json do |page|
4
- render "#{@path_prefix}/nav_menu", json: json, page: page, top_nav: true
3
+ page = json_ui_page json
4
+ render "#{@path_prefix}/nav_menu", json: json, page: page, top_nav: true
5
5
 
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
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
- end, ->(section) do
28
- section.header padding: glib_json_padding_list, childViews: ->(header) do
29
- header.h2 text: 'Form Logics'
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
- 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')
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
- end, ->(section) do
45
- section.header padding: glib_json_padding_list, childViews: ->(header) do
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
- 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')
52
- end
53
- template.thumbnail title: 'Select Fields', onClick: ->(action) do
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
- end, ->(section) do
65
- section.header padding: glib_json_padding_list, childViews: ->(header) do
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
- 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')
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
- end, ->(section) do
74
- section.header padding: glib_json_padding_list, childViews: ->(header) do
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
- 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')
81
- end
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
- 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')
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, ->(section) do
91
- section.header padding: glib_json_padding_list, childViews: ->(header) do
92
- header.h2 text: 'Experimental (not required yet)'
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
- 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')
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 do |page|
4
- render "#{@path_prefix}/nav_menu", json: json, page: page
3
+ page = json_ui_page json
4
+ render "#{@path_prefix}/nav_menu", json: json, page: page
5
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'
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
- # 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>'
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
- 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>'
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
- 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
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
- form.button text: 'Submit', onClick: ->(action) { action.forms_submit }
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 do |page|
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'
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
@@ -23,13 +23,15 @@ page.form \
23
23
  width: 'matchParent',
24
24
  label: 'Number',
25
25
  validation: { required: { message: 'Required' } },
26
- leftIcon: 'attach_money'
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
@@ -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, firstSection: ->(section) do
22
- render 'json_ui/garage/lists/autoload_section', page: page, page_index: page_index, reorder: true
23
- end
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