glib-web 4.3.0 → 4.4.1

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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/glib/glib_direct_uploads_controller.rb +1 -1
  3. data/app/controllers/glib/home_controller.rb +5 -0
  4. data/app/helpers/glib/enum_helper.rb +5 -6
  5. data/app/helpers/glib/json_ui/abstract_builder.rb +1 -1
  6. data/app/helpers/glib/json_ui/action_builder/browsers.rb +12 -0
  7. data/app/helpers/glib/json_ui/action_builder/fields.rb +6 -0
  8. data/app/helpers/glib/json_ui/action_builder/files.rb +8 -0
  9. data/app/helpers/glib/json_ui/action_builder/logics.rb +9 -0
  10. data/app/helpers/glib/json_ui/action_builder/storage_items.rb +23 -0
  11. data/app/helpers/glib/json_ui/action_builder.rb +0 -18
  12. data/app/helpers/glib/json_ui/list_builders.rb +16 -1
  13. data/app/helpers/glib/json_ui/menu_builder.rb +1 -1
  14. data/app/helpers/glib/json_ui/page_helper.rb +3 -2
  15. data/app/helpers/glib/json_ui/view_builder/charts.rb +3 -2
  16. data/app/helpers/glib/json_ui/view_builder/fields.rb +37 -29
  17. data/app/helpers/glib/json_ui/view_builder/panels.rb +40 -11
  18. data/app/helpers/glib/json_ui/view_builder.rb +20 -8
  19. data/app/models/glib/dummy_job_application.rb +3 -2
  20. data/app/views/json_ui/garage/_nav_menu.json.jbuilder +1 -1
  21. data/app/views/json_ui/garage/forms/_alert_post_all_data.json.jbuilder +4 -0
  22. data/app/views/json_ui/garage/forms/file_upload.json.jbuilder +2 -2
  23. data/app/views/json_ui/garage/forms/generic_post_all.json.jbuilder +3 -0
  24. data/app/views/json_ui/garage/forms/selects.json.jbuilder +0 -1
  25. data/app/views/json_ui/garage/forms/show_hide.json.jbuilder +41 -7
  26. data/app/views/json_ui/garage/forms/submit_on_change.json.jbuilder +1 -1
  27. data/app/views/json_ui/garage/forms/text_validation.json.jbuilder +13 -8
  28. data/app/views/json_ui/garage/panels/index.json.jbuilder +4 -0
  29. data/app/views/json_ui/garage/panels/tree.json.jbuilder +77 -0
  30. data/app/views/json_ui/garage/test_page/_header.json.jbuilder +14 -0
  31. data/app/views/json_ui/garage/test_page/auto_validate.json.jbuilder +77 -0
  32. data/app/views/json_ui/garage/test_page/dialog.json.jbuilder +38 -0
  33. data/app/views/json_ui/garage/test_page/dialog_open.json.jbuilder +14 -0
  34. data/app/views/json_ui/garage/test_page/form.json.jbuilder +111 -0
  35. data/app/views/json_ui/garage/test_page/form_dynamic.json.jbuilder +63 -0
  36. data/app/views/json_ui/garage/test_page/multiupload.json.jbuilder +65 -0
  37. data/lib/glib/mailer_tester.rb +1 -1
  38. metadata +14 -2
  39. data/app/views/json_ui/garage/test_page/index.json.jbuilder +0 -120
@@ -0,0 +1,3 @@
1
+ json_ui_response json do |action|
2
+ render "#{@path_prefix}/forms/alert_post_all_data", action: action
3
+ end
@@ -54,7 +54,6 @@ page.form url: json_ui_garage_url(path: 'forms/generic_post'), method: 'post', p
54
54
  value: ['melbourne', 'sydney'],
55
55
  multiple: true,
56
56
  onChange: ->(action) do
57
- # TODO: Fix needed. When closing this dialog, the dirty prompt appears.
58
57
  action.dialogs_alert message: 'Options selected'
59
58
  end
60
59
 
@@ -76,6 +76,23 @@ page.form \
76
76
  form.spacer height: 10
77
77
  form.label id: 'label5', text: 'Both Checked'
78
78
 
79
+ form.spacer height: 6
80
+ form.fields_check\
81
+ image: { template: 'thumbnail', url: 'https://cdn.pixabay.com/photo/2020/08/05/13/12/eco-5465432_1280.png', width: 24, height: 24 },
82
+ name: 'user[check22]', checkValue: 'on', label: 'check thumbnail', uncheckValue: 'off', onChangeAndLoad: ->(action) do
83
+ action.logics_set targetId: 'label22', conditionalData: { displayed: { "==": [{ "var": 'user[check22]' }, 'on'] } }
84
+ end
85
+ form.fields_check\
86
+ image: { template: 'featured', url: 'https://cdn.pixabay.com/photo/2020/08/05/13/12/eco-5465432_1280.png', width: 80, height: 80 },
87
+ name: 'user[check25]', checkValue: 'on', label: 'Check featured', uncheckValue: 'off', onChangeAndLoad: ->(action) do
88
+ action.logics_set targetId: 'label25', conditionalData: { displayed: { "==": [{ "var": 'user[check25]' }, 'on'] } }
89
+ end
90
+ form.spacer height: 10
91
+ form.label id: 'label25', text: 'Is Checked25'
92
+
93
+ form.spacer height: 10
94
+ form.label id: 'label22', text: 'Is Checked22'
95
+
79
96
  form.spacer height: 20
80
97
  form.h1 text: 'Radio Group'
81
98
  form.fields_radioGroup \
@@ -106,8 +123,14 @@ page.form \
106
123
  end
107
124
  end,
108
125
  childViews: ->(group) do
109
- group.fields_radio value: 'show', label: 'Show', icon: 'edit', iconSize: 40
110
- group.fields_radio value: 'hide', label: 'Hide', imageUrl: 'https://cdn.pixabay.com/photo/2020/08/05/13/12/eco-5465432_1280.png'
126
+ group.fields_radio\
127
+ value: 'show', label: 'Show', icon: { template: 'featured', name: 'edit', size: 40, color: '#d1d1d1' }
128
+ group.fields_radio\
129
+ value: 'hide', label: 'Hide',
130
+ image: { template: 'featured', url: 'https://cdn.pixabay.com/photo/2020/08/05/13/12/eco-5465432_1280.png', width: 80, height: 80 }
131
+ group.fields_radio\
132
+ value: 'no', label: 'No',
133
+ image: { template: 'thumbnail', url: 'https://cdn.pixabay.com/photo/2020/08/05/13/12/eco-5465432_1280.png', width: 24, height: 24 }
111
134
  group.fields_radio value: '', label: 'Empty'
112
135
  end
113
136
  form.spacer height: 10
@@ -349,12 +372,14 @@ page.form \
349
372
  form.spacer height: 20
350
373
  options = [
351
374
  { text: 'Option 1', value: 'option1' },
352
- { text: 'Option 2', value: 'option2' }
375
+ { text: 'Option 2', value: 'option2' },
376
+ { text: 'Option 3', value: 'option3' }
353
377
  ]
354
378
  form.fields_select name: 'user[loadif7]', width: 'matchParent', label: 'Select "show"', options: options, value: '', onChangeAndLoad: ->(action) do
355
379
  action.runMultiple childActions: ->(saction) do
356
380
  saction.logics_set targetId: 'panel7a', conditionalData: { displayed: { "==": [{ "var": 'user[loadif7]' }, 'option1'] } }
357
381
  saction.logics_set targetId: 'panel7b', conditionalData: { displayed: { "==": [{ "var": 'user[loadif7]' }, 'option2'] } }
382
+ saction.logics_set targetId: 'panel7c', conditionalData: { displayed: { "==": [{ "var": 'user[loadif7]' }, 'option3'] } }
358
383
  end
359
384
  end
360
385
 
@@ -363,8 +388,8 @@ page.form \
363
388
  styleClass: 'border-2',
364
389
  width: 'matchParent',
365
390
  padding: { top: 8, right: 8, bottom: 8, left: 8 },
366
- childViews: ->(res) do
367
- res.fields_text name: 'user[loadif_target9]', width: 'matchParent', value: 'Value 7a'
391
+ childViews: ->(vertical) do
392
+ vertical.fields_text name: 'user[0][loadif_target9]', width: 'matchParent', value: 'Value 7a'
368
393
  end
369
394
 
370
395
  form.panels_vertical \
@@ -372,8 +397,17 @@ page.form \
372
397
  styleClass: 'border-2',
373
398
  width: 'matchParent',
374
399
  padding: { top: 8, right: 8, bottom: 8, left: 8 },
375
- childViews: ->(res) do
376
- res.fields_text name: 'user[loadif_target9]', width: 'matchParent', value: 'Value 7b'
400
+ childViews: ->(vertical) do
401
+ vertical.fields_text name: 'user[1][loadif_target9]', width: 'matchParent', value: 'Value 7b'
402
+ end
403
+
404
+ form.panels_vertical \
405
+ id: 'panel7c',
406
+ styleClass: 'border-2',
407
+ width: 'matchParent',
408
+ padding: { top: 8, right: 8, bottom: 8, left: 8 },
409
+ childViews: ->(vertical) do
410
+ vertical.fields_text id: 'target_panel_3', name: 'user[2][loadif_target9]', width: 'matchParent', value: 'Value 7c'
377
411
  end
378
412
 
379
413
  form.spacer height: 20
@@ -107,7 +107,7 @@ page.scroll childViews: ->(scroll) do
107
107
  end
108
108
 
109
109
  form.spacer height: 20
110
- rules = { fileType: 'image', maxFileSize: 5000, fileTypeErrorText: 'Invalid!', maxFileSizeErrorText: 'Too big!' }
110
+ rules = { fileType: 'image', maxFileSize: 5000, maxFileSizeErrorText: 'Too big!' }
111
111
  form.fields_file \
112
112
  name: 'user[photo][]',
113
113
  width: 'matchParent',
@@ -15,29 +15,32 @@ page.form \
15
15
  name: 'user[name]',
16
16
  width: 'matchParent',
17
17
  label: 'Name'
18
-
18
+ form.spacer height: 8
19
19
 
20
20
  form.fields_email \
21
21
  name: 'user[email]',
22
22
  width: 'matchParent',
23
23
  label: 'Email'
24
+ form.spacer height: 8
24
25
 
25
26
  form.fields_url \
26
27
  name: 'user[url]',
27
28
  width: 'matchParent',
28
29
  label: 'URL'
30
+ form.spacer height: 8
29
31
 
30
32
  form.fields_number \
31
33
  prop: :age,
32
34
  name: 'user[age]',
33
35
  width: 'matchParent',
34
36
  label: 'Age'
35
-
37
+ form.spacer height: 8
36
38
 
37
39
  form.fields_phone \
38
40
  name: 'user[phone1]',
39
41
  width: 'matchParent',
40
42
  label: 'Phone field'
43
+ form.spacer height: 8
41
44
 
42
45
  form.fields_phone \
43
46
  name: 'user[phone2]',
@@ -45,6 +48,7 @@ page.form \
45
48
  label: 'Phone field with Australia as the default country',
46
49
  disableAutoDetect: true, # Disable country auto detect by user IP
47
50
  defaultCountry: 'AU' # ISO Country code, see: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes
51
+ form.spacer height: 8
48
52
 
49
53
  form.fields_password \
50
54
  name: 'user[password]',
@@ -52,6 +56,7 @@ page.form \
52
56
  label: 'Password',
53
57
  hint: 'Should contain at least 6 characters',
54
58
  leftIcon: 'lock'
59
+ form.spacer height: 8
55
60
 
56
61
  form.fields_textarea \
57
62
  prop: :words,
@@ -59,6 +64,7 @@ page.form \
59
64
  width: 'matchParent',
60
65
  label: 'Textarea with maxLength',
61
66
  maxLength: 1000
67
+ form.spacer height: 8
62
68
 
63
69
 
64
70
  options = ['programmer', 'devops', 'designer', 'ceo', 'office_boy'].map { |v| { text: v.humanize, value: v } }
@@ -68,11 +74,10 @@ page.form \
68
74
  width: 'matchParent',
69
75
  label: 'Position',
70
76
  options: options
77
+ form.spacer height: 8
71
78
 
72
79
 
73
- form.spacer height: 10
74
80
  form.h4 text: 'Gender'
75
- form.spacer height: 4
76
81
  form.fields_radioGroup \
77
82
  name: 'user[gender]',
78
83
  validation: { required: { message: 'Required' } },
@@ -82,9 +87,9 @@ page.form \
82
87
  group.fields_radio value: 'F', label: 'Female'
83
88
  end
84
89
 
85
- form.spacer height: 10
90
+ form.spacer height: 8
91
+
86
92
  form.h4 text: 'Skills'
87
- form.spacer height: 4
88
93
  form.fields_checkGroup \
89
94
  name: 'user[skills][]',
90
95
  uncheckValue: 1,
@@ -95,10 +100,10 @@ page.form \
95
100
  group.fields_check checkValue: 4, label: 'Mobile Development'
96
101
  end
97
102
 
98
- form.spacer height: 10
103
+ form.spacer height: 8
99
104
  form.fields_check prop: :accept, label: 'Accept terms & condition', name: 'user[accept]'
100
105
 
101
- form.spacer height: 30
106
+ form.spacer height: 8
102
107
  form.fields_submit text: 'Submit'
103
108
  form.fields_submit text: 'Submit (disable if form invalid)', disableIfFormInvalid: true
104
109
  end
@@ -131,6 +131,10 @@ json_ui_page json do |page|
131
131
  action.windows_open url: json_ui_garage_url(path: 'panels/grid')
132
132
  end
133
133
 
134
+ template.thumbnail title: 'Tree', subtitle: 'Tree like view just like folder and subfolder', onClick: ->(action) do
135
+ action.windows_open url: json_ui_garage_url(path: 'panels/tree')
136
+ end
137
+
134
138
  template.thumbnail title: 'List Template Accessory', onClick: ->(action) do
135
139
  # TODO
136
140
  end
@@ -0,0 +1,77 @@
1
+ json.title 'Panels'
2
+
3
+ json_ui_page json do |page|
4
+ render "#{@path_prefix}/nav_menu", json: json, page: page
5
+
6
+ page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
7
+ scroll.h2 text: 'Standard'
8
+ scroll.spacer height: 4
9
+
10
+ scroll.panels_tree selected: params[:selected] || 'arabian-1.mp3', width: 300, sections: [
11
+ ->(section) do
12
+ section.header childViews: ->(header) do
13
+ header.h2 text: 'Music 🎶'
14
+ end
15
+
16
+ section.rows builder: ->(template) do
17
+ template.standard id: 'pop', title: 'Pop', rows: ['pop-1.mp3', 'pop-2.mp3', 'pop-3.mp3']
18
+ template.standard id: 'arab', title: 'Arabian', rows: ['arabian-1.mp3', 'arabian-2.mp3', 'arabian-3.mp3']
19
+ template.standard id: 'phonk', title: 'Phonk', rows: ['phonk1.mp3', 'phonk-2.mp3', { id: 'hard-phonk', title: 'Hard Phonk', rows: ['hard-phonk-1.mp3', 'hard-phonk-2.mp3'] }]
20
+ end
21
+ end,
22
+ ->(section) do
23
+ section.header childViews: ->(header) do
24
+ header.h2 text: 'onClick windows/reload'
25
+ end
26
+
27
+ section.rows builder: ->(template) do
28
+ template.standard title: 'funny-video.mp4', id: 'fun', onClick: ->(action) { action.windows_reload url: json_ui_garage_current_url(selected: 'fun') }
29
+ template.standard title: 'animal-planet.mp4', id: 'animal', onClick: ->(action) { action.windows_reload url: json_ui_garage_current_url(selected: 'animal') }
30
+ template.standard title: 'wedding.mp4', id: 'wedding', onClick: ->(action) { action.windows_reload url: json_ui_garage_current_url(selected: 'wedding') }
31
+ end
32
+ end
33
+ ]
34
+
35
+ scroll.spacer height: 8
36
+ scroll.h2 text: 'Standard with drop functionality'
37
+ scroll.spacer height: 4
38
+
39
+ objects = [
40
+ { id: 'folder', name: 'folder', icon: { name: 'folder', color: '#6e6e6e' }, rows: ['subfolder1', 'subfolder2'], dropData: { key: 'folder' } },
41
+ { id: 'folder1', name: 'folder1', icon: { name: 'folder', color: '#6e6e6e' }, rows: ['subfolder1', 'subfolder2'] },
42
+ { id: 'folder2', name: 'folder2', icon: { name: 'folder', color: '#6e6e6e' }, rows: ['subfolder1', 'subfolder2'] },
43
+ ]
44
+
45
+ scroll.panels_column md: { cols: 6 }, childViews: ->(col) do
46
+ col.panels_tree \
47
+ selected: 'folder2',
48
+ width: 300,
49
+ onDrop: ->(action) do
50
+ action.files_upload directUploadUrl: glib_direct_uploads_url, onFinished: ->(saction) do
51
+ saction.http_post url: json_ui_garage_url(path: 'forms/generic_post_all')
52
+ end
53
+ end,
54
+ sections: [
55
+ ->(section) do
56
+ section.header childViews: ->(header) do
57
+ header.h2 text: 'Folder'
58
+ end
59
+
60
+ section.rows objects: objects, builder: ->(row, item, index) do
61
+ row.standard id: item[:id], title: item[:name], rows: item[:rows], dropData: item[:dropData], icon: item[:icon]
62
+ end
63
+ end
64
+ ]
65
+ end
66
+
67
+ scroll.panels_column md: { cols: 4 }, childViews: ->(col) do
68
+ col.panels_ul childViews: ->(li) do
69
+ li.label text: '🍌 Banana', dragData: { item: 'banana' }
70
+ li.label text: '💣 Bomb', dragData: { item: 'bomb' }
71
+ li.label text: '🍈 Melon', dragData: { item: 'melon' }
72
+ li.label text: '🐻 Bear', dragData: { item: 'bear' }
73
+ li.label text: '🍴 Fork and knife', dragData: { item: 'fork_and_knife' }
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,14 @@
1
+ navs = ['form', 'dialog', 'form_dynamic', 'auto_validate', 'multiupload']
2
+
3
+ view.panels_flow innerPadding: { bottom: 0 }, styleClass: 'align-right', width: 'matchParent', childViews: ->(res) do
4
+ navs.each_with_index do |nav, index|
5
+ if index < navs.size && index != 0
6
+ res.spacer width: 4
7
+ res.label text: '|'
8
+ res.spacer width: 4
9
+ end
10
+ res.label text: nav, onClick: ->(action) do
11
+ action.windows_open url: json_ui_garage_url(path: "test_page/#{nav}")
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,77 @@
1
+ json.title 'Test Page (Form)'
2
+
3
+ page = json_ui_page json
4
+
5
+ page.body childViews: ->(body) do
6
+ render 'json_ui/garage/test_page/header', view: body
7
+
8
+ model = Glib::DummyJobApplication.new(
9
+ name: 'John Deo',
10
+ accept: '0',
11
+ words: '',
12
+ age: 17,
13
+ position: 'ceo',
14
+ pet_you_have: 'crocodile'
15
+ )
16
+
17
+ body.panels_responsive padding: glib_json_padding_body, childViews: ->(res) do
18
+ res.h2 text: 'Job Application'
19
+ res.spacer height: 8
20
+ res.panels_form \
21
+ url: json_ui_garage_url(path: 'forms/generic_post'),
22
+ method: 'post',
23
+ model: model,
24
+ autoValidate: true,
25
+ childViews: ->(form) do
26
+ form.fields_text prop: :name, label: 'name', name: 'user[name]', width: 'matchParent'
27
+ form.spacer height: 4
28
+
29
+ form.fields_text label: 'say hello', name: 'user[say]', width: 'matchParent', validation: { format: { regex: 'hello', message: 'Say hello!' } }, value: 'sup'
30
+ form.spacer height: 4
31
+
32
+ form.fields_number prop: :age, label: 'age', name: 'user[age]', width: 'matchParent'
33
+ form.spacer height: 4
34
+
35
+ form.fields_number \
36
+ name: 'user[height]',
37
+ label: 'height',
38
+ width: 'matchParent',
39
+ validation: { numericality: { greater_than_or_equal_to: 155, less_than_or_equal_to: 190, message: { greater_than_or_equal_to: 'Too short', less_than_or_equal_to: 'Too long' } } },
40
+ value: 150
41
+ form.spacer height: 4
42
+
43
+ form.fields_textarea prop: :words, label: 'words', name: 'user[words]', width: 'matchParent'
44
+ form.spacer height: 4
45
+
46
+ form.fields_textarea label: 'Tell me story', name: 'user[story]', width: 'matchParent', validation: { length: { minimum: 1, message: { too_short: { one: 'Min %{count} word', other: 'Min %{count} words' } } } }
47
+ form.spacer height: 4
48
+
49
+ options = ['programmer', 'devops', 'designer', 'ceo', 'office_boy'].map { |v| { text: v.humanize, value: v } }
50
+ form.fields_select prop: :position, label: 'postion', name: 'user[position]', width: 'matchParent', options: options
51
+ form.spacer height: 4
52
+
53
+ options2 = ['crocodile', 'cat', 'dog', 'bird', 'shark'].map { |v| { text: v.humanize, value: v } }
54
+ form.fields_select prop: :pet_you_have, label: 'Pet you have', name: 'user[pet_you_have]', width: 'matchParent', options: options2
55
+ form.spacer height: 4
56
+
57
+ form.label text: 'Decision'
58
+ options3 = ['choose me', 'dont choose me', 'whatever']
59
+ form.fields_radioGroup value: 'dont choose me', validation: { exclusion: { in: ['dont choose me'], message: 'dont choose me' } }, childViews: ->(radio) do
60
+ options3.each do |option|
61
+ radio.fields_radio label: option, value: option
62
+ end
63
+ end
64
+ form.spacer height: 4
65
+
66
+ form.fields_check prop: :accept, label: 'accept', name: 'user[accept]', width: 'matchParent', checkValue: '1'
67
+ form.spacer height: 4
68
+
69
+ form.spacer height: 4
70
+ form.fields_submit text: 'submit'
71
+ form.spacer height: 2
72
+ form.fields_submit text: 'submit (if form valid)', disableIfFormInvalid: true
73
+ end
74
+
75
+ res.spacer height: 16
76
+ end
77
+ end
@@ -0,0 +1,38 @@
1
+
2
+
3
+ json.title 'Test Page (Form)'
4
+
5
+ page = json_ui_page json
6
+
7
+ page.body childViews: ->(body) do
8
+ render 'json_ui/garage/test_page/header', view: body
9
+
10
+ body.panels_responsive padding: glib_json_padding_body, childViews: ->(res) do
11
+ res.h2 text: 'Dialog'
12
+ res.spacer height: 8
13
+ res.button text: 'Dialog updateExisting', onClick: ->(action) do
14
+ action.runMultiple childActions: ->(saction) do
15
+ saction.dialogs_show content: ->(dialog) do
16
+ dialog.body padding: glib_json_padding_body, childViews: ->(sbody) do
17
+ sbody.h1 text: 'Hello world'
18
+ sbody.button text: 'change dialog content', onClick: ->(ssaction) do
19
+ ssaction.dialogs_show updateExisting: true, disableCloseButton: true, content: ->(sdialog) do
20
+ sdialog.body padding: glib_json_padding_body, childViews: ->(ssbody) do
21
+ ssbody.h1 text: 'Hello world (updated)'
22
+ ssbody.spacer height: 8
23
+ ssbody.button text: 'close', onClick: ->(xaction) do
24
+ xaction.dialogs_close
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ res.spacer height: 4
34
+ res.button text: 'Dialog open', onClick: ->(action) do
35
+ action.dialogs_open url: json_ui_garage_url(path: 'test_page/dialog_open')
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,14 @@
1
+ page = json_ui_page json
2
+
3
+ page.body padding: glib_json_padding_body, childViews: ->(body) do
4
+ body.panels_responsive width: 'matchParent', childViews: ->(res) do
5
+ res.h2 text: 'Title'
6
+ res.spacer height: 16
7
+ res.button text: 'open', onClick: ->(action) do
8
+ action.dialogs_open url: json_ui_garage_url(path: 'test_page/dialog_open')
9
+ end
10
+ res.button text: 'close', onClick: ->(action) do
11
+ action.dialogs_close
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,111 @@
1
+ json.title 'Test Page (Form)'
2
+
3
+ page = json_ui_page json
4
+
5
+ page.body childViews: ->(body) do
6
+ render 'json_ui/garage/test_page/header', view: body
7
+
8
+ body.panels_responsive padding: glib_json_padding_body, childViews: ->(res) do
9
+ res.h2 text: 'Form'
10
+ res.spacer height: 8
11
+ res.panels_form \
12
+ url: json_ui_garage_url(path: 'forms/generic_post'),
13
+ method: 'post',
14
+ childViews: ->(form) do
15
+ form.panels_flow innerPadding: { bottom: 0 }, width: 'matchParent', childViews: ->(hori) do
16
+ hori.button text: 'components/set', onClick: ->(action) do
17
+ action.runMultiple childActions: ->(saction) do
18
+ saction.components_set targetId: 'textarea', data: { value: 'The quick brown fox jumps over the lazy dog' }
19
+ new_options = [{ text: 'Option99', value: 'option99' }]
20
+ ['select', 'chip_group'].each do |id|
21
+ saction.components_set targetId: id, data: { options: new_options, value: ['option99'] }
22
+ end
23
+ end
24
+ end
25
+ hori.spacer width: 4
26
+ hori.button text: 'logics/set', onClick: ->(action) do
27
+ action.logics_set targetId: 'date', conditionalData: { value: { "+": [{ "var": ['user[date]'] }, 60 * 60 * 24 * 3] } }
28
+ end
29
+ hori.spacer width: 4
30
+ hori.button text: 'components/replace', onClick: ->(action) do
31
+ action.runMultiple childActions: ->(saction) do
32
+ saction.components_replace targetId: 'radio_group', newView: ->(view) do
33
+ view.fields_radioGroup value: '', childViews: ->(sview) do
34
+ sview.fields_radio label: 'Option99', value: 'option99'
35
+ end
36
+ end
37
+
38
+ saction.components_replace targetId: 'check_group', newView: ->(view) do
39
+ view.fields_checkGroup value: '', childViews: ->(sview) do
40
+ sview.fields_check label: 'Option99', value: nil, checkValue: 'option99'
41
+ end
42
+ end
43
+ end
44
+ end
45
+ hori.spacer width: 4
46
+ hori.button text: 'hide select', onClick: ->(action) do
47
+ action.components_set targetId: 'select', data: { displayed: false }
48
+ end
49
+ hori.spacer height: 4
50
+ hori.button text: 'hide jack', onClick: ->(action) do
51
+ action.runMultiple childActions: ->(saction) do
52
+ saction.components_set targetId: 'ver', data: { displayed: true }
53
+ saction.components_set targetId: 'ver1', data: { displayed: false }
54
+ end
55
+ end
56
+ hori.spacer height: 4
57
+ hori.button text: 'show jack', onClick: ->(action) do
58
+ action.runMultiple childActions: ->(saction) do
59
+ saction.components_set targetId: 'ver', data: { displayed: false }
60
+ saction.components_set targetId: 'ver1', data: { displayed: true }
61
+ end
62
+ end
63
+ end
64
+
65
+ form.spacer height: 8
66
+ form.hr width: 'matchParent'
67
+ form.spacer height: 8
68
+
69
+ validation = { required: { message: 'Required' } }
70
+ options = ['option1', 'option2', 'option3', 'option4'].map { |option| { 'text'=> option.humanize, 'value' => option } }
71
+
72
+ form.fields_date width: 'matchParent', name: 'user[date]', id: 'date', value: Date.new(2024, 7, 24), validation: validation
73
+ form.hr width: 'matchParent'
74
+ form.fields_select multiple: true, width: 'matchParent', name: 'user[select][]', id: 'select', options: options, value: ['option1', 'option2'], validation: validation
75
+ form.hr width: 'matchParent'
76
+ form.fields_chipGroup width: 'matchParent', name: 'user[chip_group]', id: 'chip_group', options: options, value: ['option2'], validation: validation
77
+ form.hr width: 'matchParent'
78
+ form.fields_radioGroup width: 'matchParent', name: 'user[radio_group]', id: 'radio_group', value: 'option3', validation: validation, childViews: ->(radio) do
79
+ options.each do |option|
80
+ radio.fields_radio label: option['text'], value: option['value']
81
+ end
82
+ end
83
+ form.hr width: 'matchParent'
84
+ check_group_value = ['option3', 'option1']
85
+ form.fields_checkGroup width: 'matchParent', name: 'user[check_group][]', id: 'check_group', value: check_group_value, validation: validation, childViews: ->(radio) do
86
+ options.each do |option|
87
+ radio.fields_check label: option['text'], checkValue: option['value']
88
+ end
89
+ end
90
+ form.hr width: 'matchParent'
91
+ form.panels_vertical width: 'matchParent', id: 'ver', childViews: ->(ver) do
92
+ form.fields_text width: 'matchParent', name: 'user[text]', id: 'text', value: 'John Doe', validation: validation.merge(format: { regex: /Doe\z/, message: 'Must end with Doe' })
93
+ end
94
+ form.panels_vertical width: 'matchParent', id: 'ver1', displayed: false, childViews: ->(ver) do
95
+ form.fields_text width: 'matchParent', name: 'user[text]', value: 'Jack Doe', validation: validation.merge(format: { regex: /Doe\z/, message: 'Must end with Doe' })
96
+ end
97
+
98
+ form.hr width: 'matchParent'
99
+
100
+ form.fields_textarea width: 'matchParent', name: 'user[textarea]', id: 'textarea', value: 'Lorem ipsum et dumet bla bla bla...'
101
+
102
+ form.hr width: 'matchParent'
103
+ form.fields_submit text: 'submit'
104
+ form.spacer height: 2
105
+ form.fields_submit text: 'submit (if form valid)', disableIfFormInvalid: true
106
+ end
107
+
108
+
109
+ res.spacer height: 16
110
+ end
111
+ end
@@ -0,0 +1,63 @@
1
+ json.title 'Test Page (Form)'
2
+
3
+ page = json_ui_page json
4
+
5
+ page.body childViews: ->(body) do
6
+ render 'json_ui/garage/test_page/header', view: body
7
+
8
+ body.panels_responsive padding: glib_json_padding_body, childViews: ->(res) do
9
+ res.h2 text: 'Form'
10
+ res.spacer height: 8
11
+ res.panels_form \
12
+ url: json_ui_garage_url(path: 'forms/generic_post'),
13
+ method: 'post',
14
+ childViews: ->(form) do
15
+
16
+ properties = [
17
+ [
18
+ { name: 'question', value: 'Punctuality' },
19
+ { name: 'type', value: 'rating' },
20
+ ],
21
+ [
22
+ { name: 'question', value: 'Quality of work' },
23
+ { name: 'type', value: 'rating' },
24
+ { name: 'enabled', value: '1' },
25
+ ],
26
+ [
27
+ { name: 'question', value: 'Satisfied?' },
28
+ { name: 'type', value: 'yes_no' },
29
+ ]
30
+ ]
31
+ validation = { required: { message: 'Required' } }
32
+ form.fields_dynamicGroup width: 'matchParent', name: 'user[evaluation]', groupFieldProperties: properties, titlePrefix: 'Entry', content: ->(group) do
33
+ group.template padding: { left: 32 }, childViews: ->(template) do
34
+ template.spacer height: 10
35
+ template.fields_text width: 'matchParent', name: 'question', label: 'Question', placeholder: 'Question', validation: validation
36
+
37
+ options = [ :rating, :yes_no ]
38
+ template.fields_select \
39
+ width: 'matchParent',
40
+ name: 'type',
41
+ label: 'Answer Type',
42
+ placeholder: 'Answer Type',
43
+ options: options.map { |o| { text: o.to_s.humanize, value: o } },
44
+ validation: validation
45
+
46
+ template.fields_check \
47
+ width: 'matchParent',
48
+ name: 'enabled',
49
+ label: 'Enable',
50
+ checkValue: '1',
51
+ showIf: { "==": [{ "var": 'user[evaluation][{{index}}][type]' }, 'rating'] }
52
+
53
+ template.spacer height: 14
54
+ end
55
+ end
56
+ form.fields_submit text: 'submit'
57
+ form.spacer height: 2
58
+ form.fields_submit text: 'submit (if form valid)', disableIfFormInvalid: true
59
+ end
60
+
61
+ res.spacer height: 16
62
+ end
63
+ end