glib-web 4.6.0 → 4.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7da379749ad7926e906360b7b5c9745f2b045d356a6243c288d604f6771ffdef
4
- data.tar.gz: 232afbb6f1375f6051d479b9484078c8db4cf7542fa7d97978b1294220bb0c6d
3
+ metadata.gz: 14b477903f0539909ec17ac01c7f892fc27a90dfc205680435539c2eb7cfc688
4
+ data.tar.gz: c08e982d602198ee4a1d5568143ed0a763d3f19a6f3fb9289ad37faa9c2519c5
5
5
  SHA512:
6
- metadata.gz: 4c95fec35e27845b1dd69eae972056a6b65afdc8b26a50c3fb0732ca3bdbddc32d21c829bde0a7cf69e91d19de9c95b6842ca36d210c0ed217e0661edd396819
7
- data.tar.gz: ab56beeee17a57e7fd37bb670a7135504694c003f52f033611c56faf325903623e25f6733e49755160c6f40ce7423412e9a58b42bd1a92e60280c42ba81a1073
6
+ metadata.gz: 0a25abbe0d1571f5545e4edb184899a90c5159069672ec3d88d353ca450add1b264b2d172b4b90caa94ae24cebf9dbb1b5e7cd015fe1c239eef47c85daf71923
7
+ data.tar.gz: 9f65a3e84dc11bb8b87c2af03c028e7722f3b57b994bb746d494da000e9e0b85b1a290ebea7289535bf5d6daba2a69f0a20533f59ae0334af14b8d6b63dc3d99
@@ -3,6 +3,9 @@ class Glib::JsonUi::ActionBuilder
3
3
  class Upload < Action
4
4
  include Glib::JsonUi::Upload
5
5
  action :onFinished
6
+ string :paramNameForFiles
7
+ string :paramNameForContext
8
+ string :paramNameForFormData
6
9
  end
7
10
  end
8
11
  end
@@ -117,6 +117,7 @@ class Glib::JsonUi::ViewBuilder
117
117
  string :rightText
118
118
  action :onTypeStart
119
119
  action :onTypeEnd
120
+ bool :clearable
120
121
  end
121
122
 
122
123
  class Number < Text
@@ -190,13 +191,21 @@ class Glib::JsonUi::ViewBuilder
190
191
  end
191
192
 
192
193
  class Select < AbstractField
193
- array :options
194
+ attr_reader :_options
195
+
196
+ # array :options
194
197
  # bool :readOnly
195
198
  bool :multiple, cache: true
196
199
  # bool :manualEntry
197
200
  hash :append, optional: [:icon]
198
201
 
199
202
  panels_builder :accessory, :header, :footer
203
+ bool :clearable
204
+
205
+ def options(value)
206
+ @_options = value
207
+ json.set! 'options', value&.to_a
208
+ end
200
209
 
201
210
  def searchable(value)
202
211
  @searchable = value
@@ -205,7 +214,9 @@ class Glib::JsonUi::ViewBuilder
205
214
  def created
206
215
  super
207
216
 
208
- @searchable = @searchable.nil? ? true : @searchable
217
+ if @searchable.nil?
218
+ @searchable = _options.size >= 10
219
+ end
209
220
  json.set! 'searchable', @searchable
210
221
  end
211
222
  end
@@ -218,7 +229,7 @@ class Glib::JsonUi::ViewBuilder
218
229
 
219
230
  class TimeZone < AbstractField
220
231
  include Glib::EnumHelper
221
-
232
+ bool :clearable
222
233
  # Override
223
234
  def created
224
235
  super
@@ -284,13 +295,6 @@ class Glib::JsonUi::ViewBuilder
284
295
  string :onIcon
285
296
  hash :image, required: [:url, :template], optional: [:width, :height]
286
297
  hash :icon, required: [:name, :template], optional: [:color, :size]
287
- # bool :featured
288
- # bool :thumbnail
289
- # hash :image
290
- # string :imageUrl
291
- # string :icon
292
- # string :iconColor
293
- # string :iconSize
294
298
 
295
299
  views :childViews
296
300
  end
@@ -422,6 +426,7 @@ class Glib::JsonUi::ViewBuilder
422
426
  date :min
423
427
  date :max
424
428
  string :type
429
+ bool :clearable
425
430
 
426
431
  # Override
427
432
  def value(value)
@@ -434,6 +439,7 @@ class Glib::JsonUi::ViewBuilder
434
439
  class Datetime < AbstractField
435
440
  date_time :min
436
441
  date_time :max
442
+ bool :clearable
437
443
  end
438
444
 
439
445
  class Location < AbstractField
@@ -459,6 +465,7 @@ class Glib::JsonUi::ViewBuilder
459
465
  class Phone < AbstractField
460
466
  string :defaultCountry
461
467
  bool :disableAutoDetect
468
+ bool :clearable
462
469
  end
463
470
 
464
471
  class CreditCard < AbstractField
@@ -427,6 +427,8 @@ class Glib::JsonUi::ViewBuilder
427
427
  class Tree < View
428
428
  include Glib::JsonUi::Upload
429
429
 
430
+ string :paramNameForFormData
431
+ string :paramNameForContext
430
432
  string :selected
431
433
  action :onDropFile
432
434
  action :onDropView
@@ -50,6 +50,7 @@ module Glib
50
50
  include Builder::MouseEvents
51
51
 
52
52
  string :id
53
+ string :key
53
54
  length :width
54
55
  length :height
55
56
  color :backgroundColor
@@ -175,6 +176,8 @@ module Glib
175
176
  string :url
176
177
  string :base64Data
177
178
  action :onClick
179
+ color :backgroundColor
180
+ hash :initials, required: [:text], optional: [:color]
178
181
  end
179
182
 
180
183
  class Icon < View
@@ -46,7 +46,7 @@ page.form url: json_ui_garage_url(path: 'forms/basic_post'), method: 'post', pad
46
46
  ],
47
47
  imageUploader: {
48
48
  name: 'user[images_attributes][]',
49
- accepts: { fileType: 'image/*', maxFileSize: 5000 },
49
+ accepts: { fileType: 'image', maxFileSize: 5000 },
50
50
  directUploadUrl: glib_direct_uploads_url
51
51
  },
52
52
  onChange: ->(action) do
@@ -20,6 +20,7 @@ page.form url: json_ui_garage_url(path: 'forms/generic_post'), method: 'post', p
20
20
  form.fields_select \
21
21
  name: 'user[city]',
22
22
  width: 'matchParent',
23
+ clearable: true,
23
24
  label: 'City1',
24
25
  placeholder: 'This is a placeholder',
25
26
  options: languages.map { |k, v| { value: k, text: v } },
@@ -147,7 +148,7 @@ page.form url: json_ui_garage_url(path: 'forms/generic_post'), method: 'post', p
147
148
  form.spacer height: 6
148
149
  form.label text: 'The select field defaults to the device\'s time zone.'
149
150
  form.spacer height: 6
150
- form.fields_timeZone name: 'user[time_zone]', width: 'matchParent', label: 'Time Zone'
151
+ form.fields_timeZone name: 'user[time_zone]', width: 'matchParent', label: 'Time Zone', clearable: true
151
152
 
152
153
 
153
154
  form.button text: 'Submit', onClick: ->(action) { action.forms_submit }
@@ -383,7 +383,7 @@ page.form \
383
383
  end
384
384
  end
385
385
 
386
- form.panels_vertical \
386
+ form.panels_responsive \
387
387
  id: 'panel7a',
388
388
  styleClass: 'border-2',
389
389
  width: 'matchParent',
@@ -392,7 +392,7 @@ page.form \
392
392
  vertical.fields_text name: 'user[0][loadif_target9]', width: 'matchParent', value: 'Value 7a'
393
393
  end
394
394
 
395
- form.panels_vertical \
395
+ form.panels_responsive \
396
396
  id: 'panel7b',
397
397
  styleClass: 'border-2',
398
398
  width: 'matchParent',
@@ -401,7 +401,7 @@ page.form \
401
401
  vertical.fields_text name: 'user[1][loadif_target9]', width: 'matchParent', value: 'Value 7b'
402
402
  end
403
403
 
404
- form.panels_vertical \
404
+ form.panels_responsive \
405
405
  id: 'panel7c',
406
406
  styleClass: 'border-2',
407
407
  width: 'matchParent',
@@ -20,26 +20,30 @@ page.form \
20
20
  form.fields_email \
21
21
  name: 'user[email]',
22
22
  width: 'matchParent',
23
- label: 'Email'
23
+ label: 'Email',
24
+ clearable: true
24
25
  form.spacer height: 8
25
26
 
26
27
  form.fields_url \
27
28
  name: 'user[url]',
28
29
  width: 'matchParent',
29
- label: 'URL'
30
+ label: 'URL',
31
+ clearable: true
30
32
  form.spacer height: 8
31
33
 
32
34
  form.fields_number \
33
35
  prop: :age,
34
36
  name: 'user[age]',
35
37
  width: 'matchParent',
36
- label: 'Age'
38
+ label: 'Age',
39
+ clearable: true
37
40
  form.spacer height: 8
38
41
 
39
42
  form.fields_phone \
40
43
  name: 'user[phone1]',
41
44
  width: 'matchParent',
42
- label: 'Phone field'
45
+ label: 'Phone field',
46
+ clearable: true
43
47
  form.spacer height: 8
44
48
 
45
49
  form.fields_phone \
@@ -55,7 +59,8 @@ page.form \
55
59
  width: 'matchParent',
56
60
  label: 'Password',
57
61
  hint: 'Should contain at least 6 characters',
58
- leftIcon: 'lock'
62
+ leftIcon: 'lock',
63
+ clearable: true
59
64
  form.spacer height: 8
60
65
 
61
66
  form.fields_textarea \
@@ -63,7 +68,8 @@ page.form \
63
68
  name: 'user[words]',
64
69
  width: 'matchParent',
65
70
  label: 'Textarea with maxLength',
66
- maxLength: 1000
71
+ maxLength: 1000,
72
+ clearable: true
67
73
  form.spacer height: 8
68
74
 
69
75
 
@@ -73,7 +79,8 @@ page.form \
73
79
  name: 'user[position]',
74
80
  width: 'matchParent',
75
81
  label: 'Position',
76
- options: options
82
+ options: options,
83
+ clearable: true
77
84
  form.spacer height: 8
78
85
 
79
86
 
@@ -1,9 +1,12 @@
1
1
  json.title 'Panels'
2
2
 
3
3
  onDropFile = ->(action) do
4
- action.files_upload directUploadUrl: glib_direct_uploads_url, onFinished: ->(saction) do
5
- saction.http_post url: json_ui_garage_url(path: 'forms/generic_post_all')
6
- end
4
+ action.files_upload \
5
+ directUploadUrl: glib_direct_uploads_url,
6
+ paramNameForFiles: 'signedIds',
7
+ onFinished: ->(saction) do
8
+ saction.http_post url: json_ui_garage_url(path: 'forms/generic_post_all')
9
+ end
7
10
  end
8
11
  onDropView = ->(action) do
9
12
  action.http_post url: json_ui_garage_url(path: 'forms/generic_post_all')
@@ -18,6 +21,8 @@ json_ui_page json do |page|
18
21
 
19
22
  scroll.panels_column md: { cols: 4 }, childViews: ->(col) do
20
23
  scroll.panels_tree \
24
+ paramNameForContext: 'moved',
25
+ # paramNameForFormData: 'message',
21
26
  onDropFile: onDropFile,
22
27
  onDropView: onDropView,
23
28
  selected: params[:selected] || 'arabian-1.mp3',
@@ -33,6 +38,7 @@ json_ui_page json do |page|
33
38
  id: 'pop',
34
39
  title: 'Pop',
35
40
  icon: { name: 'folder', size: 24, color: '#6e6e6e' },
41
+ dropData: { genre: 'pop' },
36
42
  onClick: ->(action) { action.windows_reload url: json_ui_garage_current_url(selected: 'pop') },
37
43
  subtitle: params['selected'] == 'pop' ? 'Pop music is a genre of popular music that originated in its modern' : nil,
38
44
  rows: ['pop-1.mp3', 'pop-2.mp3', 'pop-3.mp3']
@@ -40,6 +46,7 @@ json_ui_page json do |page|
40
46
  id: 'arab',
41
47
  title: 'Arabian',
42
48
  icon: { name: 'folder', size: 24, color: '#6e6e6e' },
49
+ dropData: { genre: 'arab' },
43
50
  onClick: ->(action) { action.windows_reload url: json_ui_garage_current_url(selected: 'arab') },
44
51
  subtitle: params['selected'] == 'arab' ? 'Arabic music is the music of the Arab world' : nil,
45
52
  rows: ['arabian-1.mp3', 'arabian-2.mp3', 'arabian-3.mp3']
@@ -48,6 +55,7 @@ json_ui_page json do |page|
48
55
  title: 'Phonk',
49
56
  onClick: ->(action) { action.windows_reload url: json_ui_garage_current_url(selected: 'phonk') },
50
57
  icon: { name: 'folder', size: 24, color: '#6e6e6e' },
58
+ dropData: { genre: 'phonk' },
51
59
  subtitle: params['selected'] == 'phonk' ? 'Phonk is a subgenre of hip hop and trap music' : nil,
52
60
  rows: ['phonk1.mp3', 'phonk-2.mp3', { id: 'hard-phonk', title: 'Hard Phonk', rows: ['hard-phonk-1.mp3', 'hard-phonk-2.mp3'] }]
53
61
  end
@@ -44,7 +44,11 @@ page.body childViews: ->(body) do
44
44
  end
45
45
  hori.spacer width: 4
46
46
  hori.button text: 'hide select', onClick: ->(action) do
47
- action.components_set targetId: 'select', data: { displayed: false }
47
+ action.runMultiple childActions: ->(saction) do
48
+ ['select', 'select1', 'select2', 'select3'].each do |id|
49
+ saction.components_set targetId: id, data: { displayed: false }
50
+ end
51
+ end
48
52
  end
49
53
  hori.spacer height: 4
50
54
  hori.button text: 'hide jack', onClick: ->(action) do
@@ -71,8 +75,22 @@ page.body childViews: ->(body) do
71
75
 
72
76
  form.fields_date width: 'matchParent', name: 'user[date]', id: 'date', value: Date.new(2024, 7, 24), validation: validation
73
77
  form.hr width: 'matchParent'
74
- form.fields_select multiple: true, width: 'matchParent', name: 'user[select][]', id: 'select', options: options, value: ['option1', 'option2'], validation: validation
78
+ form.fields_select clearable: true, multiple: true, width: 'matchParent', name: 'user[select][]', id: 'select', options: options, value: ['option1', 'option2'], validation: validation
75
79
  form.hr width: 'matchParent'
80
+ form.panels_flow innerPadding: { bottom: 0 }, width: 'matchParent', id: 'select1', childViews: ->(flow) do
81
+ form.fields_select clearable: true, width: 'matchParent', name: 'user[select1]', options: options, value: 'option1'
82
+ form.hr width: 'matchParent'
83
+ end
84
+ form.panels_horizontal id: 'select2', width: 'matchParent', childViews: ->(hori) do
85
+ form.fields_select clearable: true, width: 'matchParent', name: 'user[select2]', options: options, value: 'option2'
86
+ form.hr width: 'matchParent'
87
+ end
88
+ form.panels_split id: 'select3', width: 'matchParent', content: ->(split) do
89
+ split.left childViews: ->(right) do
90
+ form.fields_select clearable: true, width: 'matchParent', name: 'user[select3]', options: options, value: 'option3'
91
+ form.hr width: 'matchParent'
92
+ end
93
+ end
76
94
  form.fields_chipGroup width: 'matchParent', name: 'user[chip_group]', id: 'chip_group', options: options, value: ['option2'], validation: validation
77
95
  form.hr width: 'matchParent'
78
96
  form.fields_radioGroup width: 'matchParent', name: 'user[radio_group]', id: 'radio_group', value: 'option3', validation: validation, childViews: ->(radio) do
@@ -7,6 +7,14 @@ render "#{@path_prefix}/nav_menu", json: json, page: page
7
7
  small_image_url = 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSGQpSWjtELISLBlmugOZ6wzl1JamYXQvbFeYywpfg3E8b8DrO0Kg&s'
8
8
 
9
9
  page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
10
+ scroll.h2 text: 'Avatar Text'
11
+ scroll.spacer height: 6
12
+ scroll.avatar \
13
+ url: glib_json_image_avatar_url,
14
+ tooltip: { text: 'This is a tooltip' },
15
+ backgroundColor: '#ddd',
16
+ initials: { text: 'JD', color: '#AAB396' }
17
+
10
18
  scroll.h2 text: 'Avatar'
11
19
  scroll.spacer height: 6
12
20
  scroll.avatar \
@@ -0,0 +1,9 @@
1
+ module Glib
2
+ class IntegrationTest < ActionDispatch::IntegrationTest
3
+ HOST = 'www.localhost:3000'.freeze
4
+
5
+ setup do
6
+ host! HOST
7
+ end
8
+ end
9
+ end
@@ -21,7 +21,10 @@ module Glib
21
21
  end
22
22
 
23
23
  # See https://stackoverflow.com/questions/51583321/it-is-safe-to-use-lvh-me-instead-of-localhost-for-testing
24
- HOST = 'www.lvh.me:3000'
24
+ # HOST = 'www.lvh.me:3000'
25
+
26
+ # The best practice is to avoid using lvh.me due to security and performance concerns.
27
+ HOST = 'www.localhost:3000'
25
28
 
26
29
  # LOG_DIR = File.expand_path(
27
30
  # File.join(File.dirname(__FILE__), 'integration/json_ui_crawler_test_results')
data/lib/glib-web.rb CHANGED
@@ -5,6 +5,7 @@ require 'glib/json_crawler'
5
5
 
6
6
  require 'glib/dynamic_text'
7
7
  require 'glib/test_helpers'
8
+ require 'glib/integration_test'
8
9
 
9
10
  require 'glib/time_freezable_mailer'
10
11
  require 'glib/time_returning_mailer'
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: 4.6.0
4
+ version: 4.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ''
@@ -342,6 +342,7 @@ files:
342
342
  - lib/glib/dynamic_text.rb
343
343
  - lib/glib/dynamic_text/config.rb
344
344
  - lib/glib/engine.rb
345
+ - lib/glib/integration_test.rb
345
346
  - lib/glib/json_crawler.rb
346
347
  - lib/glib/json_crawler/action_crawler.rb
347
348
  - lib/glib/json_crawler/action_crawlers/action_http.rb