glib-web 5.0.4 → 5.0.5

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 (76) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/glib/json_ui/view_builder/fields.rb +6 -2
  3. data/app/models/concerns/glib/enum_symbolization.rb +26 -0
  4. data/app/models/glib/application_record.rb +1 -0
  5. data/app/views/json_ui/garage/test_page/_header.json.jbuilder +31 -28
  6. data/app/views/json_ui/garage/test_page/auth.json.jbuilder +2 -1
  7. data/app/views/json_ui/garage/test_page/auto_validate.json.jbuilder +2 -1
  8. data/app/views/json_ui/garage/test_page/browsers.json.jbuilder +2 -1
  9. data/app/views/json_ui/garage/test_page/calendar.json.jbuilder +2 -1
  10. data/app/views/json_ui/garage/test_page/carousel.json.jbuilder +2 -1
  11. data/app/views/json_ui/garage/test_page/charts.json.jbuilder +2 -1
  12. data/app/views/json_ui/garage/test_page/column.json.jbuilder +2 -1
  13. data/app/views/json_ui/garage/test_page/commands.json.jbuilder +2 -1
  14. data/app/views/json_ui/garage/test_page/components.json.jbuilder +2 -1
  15. data/app/views/json_ui/garage/test_page/cookies.json.jbuilder +2 -1
  16. data/app/views/json_ui/garage/test_page/custom.json.jbuilder +2 -1
  17. data/app/views/json_ui/garage/test_page/dialog.json.jbuilder +2 -1
  18. data/app/views/json_ui/garage/test_page/dirty_state.json.jbuilder +2 -1
  19. data/app/views/json_ui/garage/test_page/fields.json.jbuilder +2 -1
  20. data/app/views/json_ui/garage/test_page/fields_captcha.json.jbuilder +2 -1
  21. data/app/views/json_ui/garage/test_page/fields_creditCard.json.jbuilder +2 -1
  22. data/app/views/json_ui/garage/test_page/fields_date_time.json.jbuilder +2 -1
  23. data/app/views/json_ui/garage/test_page/fields_dynamicSelect.json.jbuilder +2 -1
  24. data/app/views/json_ui/garage/test_page/fields_location.json.jbuilder +2 -1
  25. data/app/views/json_ui/garage/test_page/fields_otp.json.jbuilder +2 -1
  26. data/app/views/json_ui/garage/test_page/fields_phone.json.jbuilder +2 -1
  27. data/app/views/json_ui/garage/test_page/fields_radio.json.jbuilder +293 -0
  28. data/app/views/json_ui/garage/test_page/fields_rating.json.jbuilder +2 -1
  29. data/app/views/json_ui/garage/test_page/fields_richText.json.jbuilder +2 -1
  30. data/app/views/json_ui/garage/test_page/fields_select.json.jbuilder +3 -2
  31. data/app/views/json_ui/garage/test_page/fields_sign.json.jbuilder +2 -1
  32. data/app/views/json_ui/garage/test_page/fields_stripeExternalAccount.json.jbuilder +2 -1
  33. data/app/views/json_ui/garage/test_page/fields_stripeToken.json.jbuilder +2 -1
  34. data/app/views/json_ui/garage/test_page/fields_text.json.jbuilder +312 -0
  35. data/app/views/json_ui/garage/test_page/fields_timer.json.jbuilder +2 -1
  36. data/app/views/json_ui/garage/test_page/fields_upload.json.jbuilder +66 -4
  37. data/app/views/json_ui/garage/test_page/fields_url_fragment.json.jbuilder +2 -1
  38. data/app/views/json_ui/garage/test_page/flow.json.jbuilder +2 -1
  39. data/app/views/json_ui/garage/test_page/form.json.jbuilder +2 -1
  40. data/app/views/json_ui/garage/test_page/form_dynamic.json.jbuilder +2 -1
  41. data/app/views/json_ui/garage/test_page/forms.json.jbuilder +2 -1
  42. data/app/views/json_ui/garage/test_page/grid.json.jbuilder +2 -1
  43. data/app/views/json_ui/garage/test_page/horizontal.json.jbuilder +2 -1
  44. data/app/views/json_ui/garage/test_page/http.json.jbuilder +2 -1
  45. data/app/views/json_ui/garage/test_page/image.json.jbuilder +26 -2
  46. data/app/views/json_ui/garage/test_page/lifecycle.json.jbuilder +2 -1
  47. data/app/views/json_ui/garage/test_page/list.json.jbuilder +2 -1
  48. data/app/views/json_ui/garage/test_page/list_editable.json.jbuilder +2 -1
  49. data/app/views/json_ui/garage/test_page/lists_append.json.jbuilder +2 -1
  50. data/app/views/json_ui/garage/test_page/logics_set.json.jbuilder +0 -1
  51. data/app/views/json_ui/garage/test_page/multimedia_video.json.jbuilder +2 -1
  52. data/app/views/json_ui/garage/test_page/pagination.json.jbuilder +2 -1
  53. data/app/views/json_ui/garage/test_page/panels.json.jbuilder +2 -1
  54. data/app/views/json_ui/garage/test_page/panels_bulkEdit2.json.jbuilder +2 -1
  55. data/app/views/json_ui/garage/test_page/popovers.json.jbuilder +2 -1
  56. data/app/views/json_ui/garage/test_page/progressCircle.json.jbuilder +2 -1
  57. data/app/views/json_ui/garage/test_page/responsive.json.jbuilder +2 -1
  58. data/app/views/json_ui/garage/test_page/scroll.json.jbuilder +2 -1
  59. data/app/views/json_ui/garage/test_page/selectable.json.jbuilder +2 -1
  60. data/app/views/json_ui/garage/test_page/sheets.json.jbuilder +2 -1
  61. data/app/views/json_ui/garage/test_page/snackbars.json.jbuilder +2 -1
  62. data/app/views/json_ui/garage/test_page/split.json.jbuilder +2 -1
  63. data/app/views/json_ui/garage/test_page/storage_items.json.jbuilder +2 -1
  64. data/app/views/json_ui/garage/test_page/switch.json.jbuilder +56 -0
  65. data/app/views/json_ui/garage/test_page/tabBar.json.jbuilder +144 -0
  66. data/app/views/json_ui/garage/test_page/table.json.jbuilder +2 -1
  67. data/app/views/json_ui/garage/test_page/timeline.json.jbuilder +2 -1
  68. data/app/views/json_ui/garage/test_page/timeouts.json.jbuilder +9 -3
  69. data/app/views/json_ui/garage/test_page/ul.json.jbuilder +2 -1
  70. data/app/views/json_ui/garage/test_page/vertical.json.jbuilder +2 -1
  71. data/app/views/json_ui/garage/test_page/web.json.jbuilder +2 -1
  72. data/app/views/json_ui/garage/test_page/window.json.jbuilder +2 -1
  73. data/app/views/json_ui/garage/test_page/windows.json.jbuilder +2 -1
  74. data/lib/glib/json_crawler/router.rb +39 -0
  75. data/lib/glib/test_helpers.rb +68 -2
  76. metadata +6 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 66e524f15bee8e6c628653e76d1785f79410bed28efd00504e6dfeab4368e0d2
4
- data.tar.gz: e7aef35ec5bdee993bef230ebda57dcbbee5c20f2b7b15633f4b2bea5aba0375
3
+ metadata.gz: f17a1a4daae7e40a97af1832e97b2d8c9dd67310f5c633cbdeb4ab3dd5d5d46a
4
+ data.tar.gz: 669a156ca671210d00fb34383fc99bdfe9089e69470709d733b4a686922b4291
5
5
  SHA512:
6
- metadata.gz: 6cf36807eaf18d6260a603451835ccfbf449aef03ba8a37141428dc094997e6130c304756d473f198419852b504b7aad8c2fe84f36594036cf82a526857558e3
7
- data.tar.gz: 40888a54de77dc4560411d06b3a05bdbf805e12b90985fd87b0a03dcce600c4029c7bd2c8c36e140c61147d060b23d1d61eb14aaaaa4e8a38b113a05ac99af1a
6
+ metadata.gz: e707bdf53ababa1afe4b53fa4a8d6d0f6c7bf4db2730a18fc576cf58fd7c7d16e3081a98a488c18a5c8d6ee953edaa44c4a8c2f4e53840ae367f44d735435e2d
7
+ data.tar.gz: f88d6a7ddec4a1c364396579a3b56eaaf82e98dd32a16a5d2f0595c0ea0d79dbfa63ab94df4ccefefd47aa6a4b12b601793a67aed5d51d22ee8c2670ed8993c0
@@ -641,6 +641,7 @@ class Glib::JsonUi::ViewBuilder
641
641
  def created
642
642
  super
643
643
 
644
+ json.searchable true
644
645
  json.options glib_time_zone_options
645
646
  end
646
647
  end
@@ -761,7 +762,8 @@ class Glib::JsonUi::ViewBuilder
761
762
  action :onFinishUpload
762
763
  bool :multiple
763
764
  hash :placeholderView, required: [:type, :width, :height], optional: [:url]
764
- hash :inputView, optional: [:multiple, :files, :variant]
765
+ hash :inputView, optional: [:files, :variant]
766
+ hash :clipboardView, optional: [:icon]
765
767
 
766
768
  def multiProgressView(values)
767
769
  @multi_progress = values
@@ -775,7 +777,9 @@ class Glib::JsonUi::ViewBuilder
775
777
  @hint ||= I18n.t('glib.multi_upload.hint', default: nil)
776
778
 
777
779
  if @prop && context && @multi_progress
778
- @multi_progress['files'] ||= context.field_value(@prop, collect_ids: false).to_a.map { |file| { name: file.blob&.filename, signed_id: file.signed_id, url: url_for(file) } }
780
+ value = context.field_value(@prop, collect_ids: false)
781
+ attachments = value.is_a?(::ActiveStorage::Attached::One) ? Array.wrap(value.attachment) : value.to_a
782
+ @multi_progress['files'] ||= attachments.map { |file| { name: file.blob&.filename, signed_id: file.signed_id, url: url_for(file) } }
779
783
  end
780
784
 
781
785
  if @multi_progress
@@ -0,0 +1,26 @@
1
+ module Glib
2
+ # Class-level helper that overrides one or more enum readers to return a
3
+ # symbol instead of Rails' default string form. Lets callers compare with
4
+ # `record.status == :active` without having to remember which form they're
5
+ # holding (see backend/01a_defensive_programming.md item 7).
6
+ #
7
+ # Usage:
8
+ #
9
+ # class Order < ApplicationRecord
10
+ # enum :payment_status, { draft: 0, pending: 1, finalized: 2 }
11
+ # enum :finalize_intent, { unknown: 0, charge: 1 }, prefix: true
12
+ #
13
+ # enum_symbolize :payment_status, :finalize_intent
14
+ # end
15
+ module EnumSymbolization
16
+ extend ActiveSupport::Concern
17
+
18
+ class_methods do
19
+ def enum_symbolize(*attrs)
20
+ attrs.each do |attr|
21
+ define_method(attr) { super()&.to_sym }
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,6 +1,7 @@
1
1
  module Glib
2
2
  class ApplicationRecord < ActiveRecord::Base
3
3
  include EnumHumanization
4
+ include EnumSymbolization
4
5
 
5
6
  self.abstract_class = true
6
7
 
@@ -23,12 +23,14 @@ nav_groups = {
23
23
  'Forms' => [
24
24
  'auto_validate',
25
25
  'dirty_state',
26
+ 'fields_text',
26
27
  'fields_select',
27
28
  'fields_dynamicSelect',
28
29
  'fields_date_time',
29
30
  'fields_location',
30
31
  'fields_phone',
31
32
  'fields_otp',
33
+ 'fields_radio',
32
34
  'fields_rating',
33
35
  'fields_richText',
34
36
  'fields_sign',
@@ -59,6 +61,7 @@ nav_groups = {
59
61
  'responsive',
60
62
  'scroll',
61
63
  'split',
64
+ 'tabBar',
62
65
  'timeline',
63
66
  'ul',
64
67
  'vertical',
@@ -72,40 +75,40 @@ nav_groups = {
72
75
  'charts',
73
76
  'image',
74
77
  'multimedia_video',
75
- 'progressCircle'
78
+ 'progressCircle',
79
+ 'switch'
76
80
  ]
77
81
  }
78
82
 
79
83
  current_path = params[:path].to_s
80
84
 
81
- view.panels_vertical(
82
- styleClass: 'align-right',
83
- width: 'matchParent',
84
- childViews: ->(res) do
85
+ page.navBar height: 44, backgroundColor: '#a8c4e3', color: '#ffffff', showTitle: true, rightButtons: ->(menu) do
86
+ menu.button icon: { name: 'refresh' }, onClick: ->(action) do
87
+ action.windows_reload
88
+ end
89
+ menu.button icon: { name: 'open_in_new' }, onClick: ->(action) do
90
+ action.windows_open url: json_ui_garage_current_url(step: params[:step].to_i + 1)
91
+ end
92
+ end
93
+
94
+ page.leftDrawer content: ->(drawer) do
95
+ drawer.header childViews: ->(header) do
96
+ header.button text: 'Test Page', styleClasses: ['link', 'logo'], onClick: ->(action) do
97
+ action.windows_open url: json_ui_garage_url(path: 'test_page/form')
98
+ end
99
+ end
100
+
101
+ drawer.rows builder: ->(menu) do
85
102
  nav_groups.each_with_index do |(group_name, items), group_index|
86
- res.panels_flow(
87
- innerPadding: { bottom: 0 },
88
- childViews: ->(flow) do
89
- flow.label text: "#{group_name}:"
90
- flow.spacer width: 6
91
- items.each_with_index do |nav, index|
92
- nav_path = "test_page/#{nav}"
93
- is_current = current_path == nav_path
94
- if index != 0
95
- flow.spacer width: 8
96
- end
97
- label_options = {
98
- text: nav,
99
- onClick: ->(action) do
100
- action.windows_open url: json_ui_garage_url(path: nav_path)
101
- end
102
- }
103
- label_options[:styleClass] = 'font-weight-bold' if is_current
104
- flow.label(**label_options)
105
- end
103
+ menu.divider if group_index > 0
104
+ menu.label text: group_name
105
+ items.each do |nav|
106
+ nav_path = "test_page/#{nav}"
107
+ is_current = current_path == nav_path
108
+ menu.button text: nav, styleClasses: (is_current ? ['font-weight-bold'] : []), onClick: ->(action) do
109
+ action.windows_open url: json_ui_garage_url(path: nav_path)
106
110
  end
107
- )
108
- res.spacer height: 4 if group_index < nav_groups.size - 1
111
+ end
109
112
  end
110
113
  end
111
- )
114
+ end
@@ -2,9 +2,10 @@ json.title 'Test Page (Auth)'
2
2
 
3
3
  page = json_ui_page json
4
4
 
5
+ render 'json_ui/garage/test_page/header', json: json, page: page
6
+
5
7
  page.body(
6
8
  childViews: ->(body) do
7
- render 'json_ui/garage/test_page/header', view: body
8
9
  body.panels_responsive(
9
10
  padding: glib_json_padding_body,
10
11
  childViews: ->(res) do
@@ -2,9 +2,10 @@ json.title 'Test Page (Form)'
2
2
 
3
3
  page = json_ui_page json
4
4
 
5
+ render 'json_ui/garage/test_page/header', json: json, page: page
6
+
5
7
  page.body(
6
8
  childViews: ->(body) do
7
- render 'json_ui/garage/test_page/header', view: body
8
9
  model = Glib::DummyJobApplication.new(
9
10
  name: 'John Deo',
10
11
  accept: '0',
@@ -2,9 +2,10 @@ json.title 'Test Page (Browsers)'
2
2
 
3
3
  page = json_ui_page json
4
4
 
5
+ render 'json_ui/garage/test_page/header', json: json, page: page
6
+
5
7
  page.body(
6
8
  childViews: ->(body) do
7
- render 'json_ui/garage/test_page/header', view: body
8
9
  body.panels_responsive(
9
10
  padding: glib_json_padding_body,
10
11
  childViews: ->(res) do
@@ -2,9 +2,10 @@ json.title 'Test Page (Calendar)'
2
2
 
3
3
  page = json_ui_page json
4
4
 
5
+ render 'json_ui/garage/test_page/header', json: json, page: page
6
+
5
7
  page.body(
6
8
  childViews: ->(body) do
7
- render 'json_ui/garage/test_page/header', view: body
8
9
 
9
10
  body.panels_responsive(
10
11
  padding: glib_json_padding_body,
@@ -2,8 +2,9 @@ json.title 'Test Page (Carousel)'
2
2
 
3
3
  page = json_ui_page json
4
4
 
5
+ render 'json_ui/garage/test_page/header', json: json, page: page
6
+
5
7
  page.body childViews: ->(body) do
6
- render 'json_ui/garage/test_page/header', view: body
7
8
 
8
9
  body.panels_responsive padding: glib_json_padding_body, childViews: ->(res) do
9
10
  res.h2 text: 'Overview'
@@ -68,8 +68,9 @@ line_series_churn = [
68
68
 
69
69
  page = json_ui_page json
70
70
 
71
+ render 'json_ui/garage/test_page/header', json: json, page: page
72
+
71
73
  page.body childViews: ->(body) do
72
- render 'json_ui/garage/test_page/header', view: body
73
74
 
74
75
  body.panels_responsive padding: glib_json_padding_body, childViews: ->(res) do
75
76
  res.h2 text: 'Charts'
@@ -2,9 +2,10 @@ json.title 'Test Page (Column)'
2
2
 
3
3
  page = json_ui_page json
4
4
 
5
+ render 'json_ui/garage/test_page/header', json: json, page: page
6
+
5
7
  page.body(
6
8
  childViews: ->(body) do
7
- render 'json_ui/garage/test_page/header', view: body
8
9
  body.panels_responsive(
9
10
  padding: glib_json_padding_body,
10
11
  childViews: ->(res) do
@@ -2,9 +2,10 @@ json.title 'Test Page (Commands)'
2
2
 
3
3
  page = json_ui_page json
4
4
 
5
+ render 'json_ui/garage/test_page/header', json: json, page: page
6
+
5
7
  page.body(
6
8
  childViews: ->(body) do
7
- render 'json_ui/garage/test_page/header', view: body
8
9
  body.panels_responsive(
9
10
  padding: glib_json_padding_body,
10
11
  childViews: ->(res) do
@@ -2,9 +2,10 @@ json.title 'Test Page (Components)'
2
2
 
3
3
  page = json_ui_page json
4
4
 
5
+ render 'json_ui/garage/test_page/header', json: json, page: page
6
+
5
7
  page.body(
6
8
  childViews: ->(body) do
7
- render 'json_ui/garage/test_page/header', view: body
8
9
  body.panels_responsive(
9
10
  padding: glib_json_padding_body,
10
11
  childViews: ->(res) do
@@ -2,9 +2,10 @@ json.title 'Test Page (Cookies)'
2
2
 
3
3
  page = json_ui_page json
4
4
 
5
+ render 'json_ui/garage/test_page/header', json: json, page: page
6
+
5
7
  page.body(
6
8
  childViews: ->(body) do
7
- render 'json_ui/garage/test_page/header', view: body
8
9
  body.panels_responsive(
9
10
  padding: glib_json_padding_body,
10
11
  childViews: ->(res) do
@@ -2,9 +2,10 @@ json.title 'Test Page (Custom)'
2
2
 
3
3
  page = json_ui_page json
4
4
 
5
+ render 'json_ui/garage/test_page/header', json: json, page: page
6
+
5
7
  page.body(
6
8
  childViews: ->(body) do
7
- render 'json_ui/garage/test_page/header', view: body
8
9
  body.panels_responsive(
9
10
  padding: glib_json_padding_body,
10
11
  childViews: ->(res) do
@@ -4,9 +4,10 @@ json.title 'Test Page (Form)'
4
4
 
5
5
  page = json_ui_page json
6
6
 
7
+ render 'json_ui/garage/test_page/header', json: json, page: page
8
+
7
9
  page.body(
8
10
  childViews: ->(body) do
9
- render 'json_ui/garage/test_page/header', view: body
10
11
  body.panels_responsive(
11
12
  padding: glib_json_padding_body,
12
13
  childViews: ->(res) do
@@ -4,8 +4,9 @@ json.title 'Test Page (Dirty state)'
4
4
 
5
5
  page = json_ui_page json
6
6
 
7
+ render 'json_ui/garage/test_page/header', json: json, page: page
8
+
7
9
  page.body childViews: ->(body) do
8
- render 'json_ui/garage/test_page/header', view: body
9
10
 
10
11
  body.panels_form padding: glib_json_padding_body, childViews: ->(form) do
11
12
  form.h2 text: 'Dirty state'
@@ -2,9 +2,10 @@ json.title 'Test Page (Fields Actions)'
2
2
 
3
3
  page = json_ui_page json
4
4
 
5
+ render 'json_ui/garage/test_page/header', json: json, page: page
6
+
5
7
  page.body(
6
8
  childViews: ->(body) do
7
- render 'json_ui/garage/test_page/header', view: body
8
9
  body.panels_form(
9
10
  padding: glib_json_padding_body,
10
11
  childViews: ->(res) do
@@ -2,9 +2,10 @@ json.title 'Test Page (Fields Captcha)'
2
2
 
3
3
  page = json_ui_page json
4
4
 
5
+ render 'json_ui/garage/test_page/header', json: json, page: page
6
+
5
7
  page.body(
6
8
  childViews: ->(body) do
7
- render 'json_ui/garage/test_page/header', view: body
8
9
 
9
10
  body.panels_responsive(
10
11
  padding: glib_json_padding_body,
@@ -2,9 +2,10 @@ json.title 'Test Page (Fields Credit Card)'
2
2
 
3
3
  page = json_ui_page json
4
4
 
5
+ render 'json_ui/garage/test_page/header', json: json, page: page
6
+
5
7
  page.body(
6
8
  childViews: ->(body) do
7
- render 'json_ui/garage/test_page/header', view: body
8
9
 
9
10
  body.panels_responsive(
10
11
  padding: glib_json_padding_body,
@@ -2,9 +2,10 @@ json.title 'Test Page (Fields Date/Datetime)'
2
2
 
3
3
  page = json_ui_page json
4
4
 
5
+ render 'json_ui/garage/test_page/header', json: json, page: page
6
+
5
7
  page.body(
6
8
  childViews: ->(body) do
7
- render 'json_ui/garage/test_page/header', view: body
8
9
 
9
10
  body.panels_responsive(
10
11
  padding: glib_json_padding_body,
@@ -2,9 +2,10 @@ json.title 'Test Page (Fields Dynamic Select)'
2
2
 
3
3
  page = json_ui_page json
4
4
 
5
+ render 'json_ui/garage/test_page/header', json: json, page: page
6
+
5
7
  page.body(
6
8
  childViews: ->(body) do
7
- render 'json_ui/garage/test_page/header', view: body
8
9
 
9
10
  body.panels_responsive(
10
11
  padding: glib_json_padding_body,
@@ -2,9 +2,10 @@ json.title 'Test Page (Fields Location)'
2
2
 
3
3
  page = json_ui_page json
4
4
 
5
+ render 'json_ui/garage/test_page/header', json: json, page: page
6
+
5
7
  page.body(
6
8
  childViews: ->(body) do
7
- render 'json_ui/garage/test_page/header', view: body
8
9
 
9
10
  body.panels_responsive(
10
11
  padding: glib_json_padding_body,
@@ -2,9 +2,10 @@ json.title 'Test Page (Fields OTP)'
2
2
 
3
3
  page = json_ui_page json
4
4
 
5
+ render 'json_ui/garage/test_page/header', json: json, page: page
6
+
5
7
  page.body(
6
8
  childViews: ->(body) do
7
- render 'json_ui/garage/test_page/header', view: body
8
9
 
9
10
  body.panels_responsive(
10
11
  padding: glib_json_padding_body,
@@ -2,9 +2,10 @@ json.title 'Test Page (Fields Phone)'
2
2
 
3
3
  page = json_ui_page json
4
4
 
5
+ render 'json_ui/garage/test_page/header', json: json, page: page
6
+
5
7
  page.body(
6
8
  childViews: ->(body) do
7
- render 'json_ui/garage/test_page/header', view: body
8
9
 
9
10
  body.panels_responsive(
10
11
  padding: glib_json_padding_body,