glib-web 5.0.4 → 5.0.6

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 (79) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/glib/analytics/funnel.rb +10 -1
  3. data/app/controllers/concerns/glib/json/libs.rb +13 -0
  4. data/app/helpers/glib/json_ui/view_builder/fields.rb +6 -2
  5. data/app/models/concerns/glib/enum_symbolization.rb +26 -0
  6. data/app/models/glib/application_record.rb +1 -0
  7. data/app/views/json_ui/garage/test_page/_header.json.jbuilder +31 -28
  8. data/app/views/json_ui/garage/test_page/auth.json.jbuilder +2 -1
  9. data/app/views/json_ui/garage/test_page/auto_validate.json.jbuilder +2 -1
  10. data/app/views/json_ui/garage/test_page/browsers.json.jbuilder +2 -1
  11. data/app/views/json_ui/garage/test_page/calendar.json.jbuilder +2 -1
  12. data/app/views/json_ui/garage/test_page/carousel.json.jbuilder +2 -1
  13. data/app/views/json_ui/garage/test_page/charts.json.jbuilder +2 -1
  14. data/app/views/json_ui/garage/test_page/column.json.jbuilder +2 -1
  15. data/app/views/json_ui/garage/test_page/commands.json.jbuilder +2 -1
  16. data/app/views/json_ui/garage/test_page/components.json.jbuilder +2 -1
  17. data/app/views/json_ui/garage/test_page/cookies.json.jbuilder +2 -1
  18. data/app/views/json_ui/garage/test_page/custom.json.jbuilder +2 -1
  19. data/app/views/json_ui/garage/test_page/dialog.json.jbuilder +2 -1
  20. data/app/views/json_ui/garage/test_page/dirty_state.json.jbuilder +2 -1
  21. data/app/views/json_ui/garage/test_page/fields.json.jbuilder +2 -1
  22. data/app/views/json_ui/garage/test_page/fields_captcha.json.jbuilder +2 -1
  23. data/app/views/json_ui/garage/test_page/fields_creditCard.json.jbuilder +2 -1
  24. data/app/views/json_ui/garage/test_page/fields_date_time.json.jbuilder +2 -1
  25. data/app/views/json_ui/garage/test_page/fields_dynamicSelect.json.jbuilder +2 -1
  26. data/app/views/json_ui/garage/test_page/fields_location.json.jbuilder +2 -1
  27. data/app/views/json_ui/garage/test_page/fields_otp.json.jbuilder +2 -1
  28. data/app/views/json_ui/garage/test_page/fields_phone.json.jbuilder +2 -1
  29. data/app/views/json_ui/garage/test_page/fields_radio.json.jbuilder +293 -0
  30. data/app/views/json_ui/garage/test_page/fields_rating.json.jbuilder +2 -1
  31. data/app/views/json_ui/garage/test_page/fields_richText.json.jbuilder +2 -1
  32. data/app/views/json_ui/garage/test_page/fields_select.json.jbuilder +3 -2
  33. data/app/views/json_ui/garage/test_page/fields_sign.json.jbuilder +2 -1
  34. data/app/views/json_ui/garage/test_page/fields_stripeExternalAccount.json.jbuilder +2 -1
  35. data/app/views/json_ui/garage/test_page/fields_stripeToken.json.jbuilder +2 -1
  36. data/app/views/json_ui/garage/test_page/fields_text.json.jbuilder +312 -0
  37. data/app/views/json_ui/garage/test_page/fields_timer.json.jbuilder +2 -1
  38. data/app/views/json_ui/garage/test_page/fields_upload.json.jbuilder +66 -4
  39. data/app/views/json_ui/garage/test_page/fields_url_fragment.json.jbuilder +2 -1
  40. data/app/views/json_ui/garage/test_page/flow.json.jbuilder +2 -1
  41. data/app/views/json_ui/garage/test_page/form.json.jbuilder +2 -1
  42. data/app/views/json_ui/garage/test_page/form_dynamic.json.jbuilder +2 -1
  43. data/app/views/json_ui/garage/test_page/forms.json.jbuilder +2 -1
  44. data/app/views/json_ui/garage/test_page/grid.json.jbuilder +2 -1
  45. data/app/views/json_ui/garage/test_page/horizontal.json.jbuilder +2 -1
  46. data/app/views/json_ui/garage/test_page/http.json.jbuilder +2 -1
  47. data/app/views/json_ui/garage/test_page/image.json.jbuilder +26 -2
  48. data/app/views/json_ui/garage/test_page/lifecycle.json.jbuilder +2 -1
  49. data/app/views/json_ui/garage/test_page/list.json.jbuilder +2 -1
  50. data/app/views/json_ui/garage/test_page/list_editable.json.jbuilder +2 -1
  51. data/app/views/json_ui/garage/test_page/lists_append.json.jbuilder +2 -1
  52. data/app/views/json_ui/garage/test_page/logics_set.json.jbuilder +0 -1
  53. data/app/views/json_ui/garage/test_page/multimedia_video.json.jbuilder +2 -1
  54. data/app/views/json_ui/garage/test_page/pagination.json.jbuilder +2 -1
  55. data/app/views/json_ui/garage/test_page/panels.json.jbuilder +2 -1
  56. data/app/views/json_ui/garage/test_page/panels_bulkEdit2.json.jbuilder +2 -1
  57. data/app/views/json_ui/garage/test_page/popovers.json.jbuilder +2 -1
  58. data/app/views/json_ui/garage/test_page/progressCircle.json.jbuilder +2 -1
  59. data/app/views/json_ui/garage/test_page/responsive.json.jbuilder +2 -1
  60. data/app/views/json_ui/garage/test_page/scroll.json.jbuilder +2 -1
  61. data/app/views/json_ui/garage/test_page/selectable.json.jbuilder +2 -1
  62. data/app/views/json_ui/garage/test_page/sheets.json.jbuilder +2 -1
  63. data/app/views/json_ui/garage/test_page/snackbars.json.jbuilder +2 -1
  64. data/app/views/json_ui/garage/test_page/split.json.jbuilder +2 -1
  65. data/app/views/json_ui/garage/test_page/storage_items.json.jbuilder +2 -1
  66. data/app/views/json_ui/garage/test_page/switch.json.jbuilder +56 -0
  67. data/app/views/json_ui/garage/test_page/tabBar.json.jbuilder +144 -0
  68. data/app/views/json_ui/garage/test_page/table.json.jbuilder +2 -1
  69. data/app/views/json_ui/garage/test_page/timeline.json.jbuilder +2 -1
  70. data/app/views/json_ui/garage/test_page/timeouts.json.jbuilder +9 -3
  71. data/app/views/json_ui/garage/test_page/ul.json.jbuilder +2 -1
  72. data/app/views/json_ui/garage/test_page/vertical.json.jbuilder +2 -1
  73. data/app/views/json_ui/garage/test_page/web.json.jbuilder +2 -1
  74. data/app/views/json_ui/garage/test_page/window.json.jbuilder +2 -1
  75. data/app/views/json_ui/garage/test_page/windows.json.jbuilder +2 -1
  76. data/lib/glib/json_crawler/router.rb +39 -0
  77. data/lib/glib/mailer_tester.rb +90 -5
  78. data/lib/glib/test_helpers.rb +68 -2
  79. 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: 2e9d0b6eb1a02d147f08a0166a4d67075ebbf903af3601e78ab592c5f9a11808
4
+ data.tar.gz: ee0d8980dfa1158fa65126b8d29dad29e2b788f1b51e4fb062a2de306a1d789a
5
5
  SHA512:
6
- metadata.gz: 6cf36807eaf18d6260a603451835ccfbf449aef03ba8a37141428dc094997e6130c304756d473f198419852b504b7aad8c2fe84f36594036cf82a526857558e3
7
- data.tar.gz: 40888a54de77dc4560411d06b3a05bdbf805e12b90985fd87b0a03dcce600c4029c7bd2c8c36e140c61147d060b23d1d61eb14aaaaa4e8a38b113a05ac99af1a
6
+ metadata.gz: 21960f43365ee50457f2ad2856d5bf5e6cf6c1a5014332006e9fe43e7f2e6cec9633a35cb5678a34388310d88e69222ab4641d1267125e87e01d822d00fb7e4f
7
+ data.tar.gz: cf920f5f56177c092fc2bd84bacf4b096d1b41ae4364b47bcfe3beba1b58bb8afa76883a33210a9f9ad709085c7dc33644933128cddbe93b4ff2251e6f2367b5
@@ -38,7 +38,16 @@ module Glib::Analytics
38
38
  referrer_url = request.headers['referer'] # Notice that the HTTP header uses one "r"
39
39
  if group.nil? && action.nil? && !referrer_url.nil?
40
40
  current_host = request.host
41
- referrer_host = URI.parse(referrer_url).host
41
+ # The Referer header is attacker-controlled and may not be a valid URI
42
+ # (scanners send junk like "() { ignored; }; cat /etc/passwd"). Treat an
43
+ # unparseable referer as "no referer" rather than letting URI::InvalidURIError
44
+ # bubble up mid-render, where the 500 rescue then double-renders.
45
+ referrer_host =
46
+ begin
47
+ URI.parse(referrer_url).host
48
+ rescue URI::InvalidURIError
49
+ nil
50
+ end
42
51
 
43
52
  # Replace the subdomain portion with regex so it will only match the non-subdomain part.
44
53
  # This will allow cross-subdomain referral, but it will not work if the host is a bare domain,
@@ -249,6 +249,13 @@ module Glib::Json::Libs
249
249
  Rollbar.error(exception, use_exception_level_filters: true)
250
250
  end
251
251
 
252
+ # The exception may have been raised AFTER a response was already rendered
253
+ # (e.g. from an after_action injection). Rendering the error page on top of that
254
+ # would raise AbstractController::DoubleRenderError, which masks the genuine
255
+ # exception reported above. The real cause is already logged, so leave the
256
+ # already-rendered response in place rather than double-rendering.
257
+ return if performed?
258
+
252
259
  render file: Rails.root.join('public', '500.html'), status: :internal_server_error
253
260
  else
254
261
  raise exception
@@ -261,6 +268,12 @@ module Glib::Json::Libs
261
268
  def glib_json_handle_404(exception, preview_mode)
262
269
  if json_ui_activated?
263
270
  if Rails.env.production? || preview_mode
271
+ # As with glib_json_handle_500: if a response was already rendered (e.g. an
272
+ # after_action raised RecordNotFound), rendering the 404 page on top would raise
273
+ # AbstractController::DoubleRenderError and mask the real exception. Keep the
274
+ # already-rendered response instead of double-rendering.
275
+ return if performed?
276
+
264
277
  render file: Rails.root.join('public', '404.html'), status: :not_found
265
278
  else
266
279
  raise exception
@@ -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,