glib-web 4.6.0 → 4.8.0

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 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