glib-web 0.5.71 → 0.5.72

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 (185) hide show
  1. checksums.yaml +4 -4
  2. data/app/channels/glib/channel/is_typing_channel.rb +34 -34
  3. data/app/channels/glib/channel/online_channel.rb +36 -36
  4. data/app/controllers/concerns/glib/analytics/funnel.rb +61 -61
  5. data/app/controllers/concerns/glib/auth/policy.rb +148 -148
  6. data/app/controllers/concerns/glib/json/dynamic_text.rb +126 -126
  7. data/app/controllers/concerns/glib/json/libs.rb +149 -149
  8. data/app/controllers/concerns/glib/json/new_dynamic_text.rb +122 -122
  9. data/app/controllers/concerns/glib/json/transformation.rb +11 -11
  10. data/app/controllers/concerns/glib/json/traversal.rb +92 -92
  11. data/app/controllers/concerns/glib/json/ui.rb +88 -88
  12. data/app/controllers/concerns/glib/json/validation.rb +13 -13
  13. data/app/controllers/glib/home_controller.rb +54 -54
  14. data/app/helpers/glib/app_feature_support_helper.rb +16 -16
  15. data/app/helpers/glib/dynamic_images_helper.rb +55 -55
  16. data/app/helpers/glib/dynamic_texts_helper.rb +42 -42
  17. data/app/helpers/glib/enum_helper.rb +18 -8
  18. data/app/helpers/glib/forms_helper.rb +15 -15
  19. data/app/helpers/glib/json_ui/abstract_builder.rb +309 -309
  20. data/app/helpers/glib/json_ui/action_builder.rb +140 -140
  21. data/app/helpers/glib/json_ui/action_builder/dialogs.rb +58 -58
  22. data/app/helpers/glib/json_ui/action_builder/http.rb +39 -39
  23. data/app/helpers/glib/json_ui/action_builder/panels.rb +14 -14
  24. data/app/helpers/glib/json_ui/action_builder/sheets.rb +15 -15
  25. data/app/helpers/glib/json_ui/action_builder/snackbars.rb +41 -41
  26. data/app/helpers/glib/json_ui/action_builder/windows.rb +33 -33
  27. data/app/helpers/glib/json_ui/analytics_helper.rb +17 -17
  28. data/app/helpers/glib/json_ui/dynamic_field_builders.rb +25 -25
  29. data/app/helpers/glib/json_ui/generic_builders.rb +28 -28
  30. data/app/helpers/glib/json_ui/list_builders.rb +110 -110
  31. data/app/helpers/glib/json_ui/menu_builder.rb +94 -94
  32. data/app/helpers/glib/json_ui/page_helper.rb +221 -221
  33. data/app/helpers/glib/json_ui/response_helper.rb +25 -25
  34. data/app/helpers/glib/json_ui/split_builders.rb +32 -32
  35. data/app/helpers/glib/json_ui/styling_helper.rb +55 -55
  36. data/app/helpers/glib/json_ui/table_builders.rb +74 -74
  37. data/app/helpers/glib/json_ui/view_builder.rb +240 -240
  38. data/app/helpers/glib/json_ui/view_builder/banners.rb +26 -26
  39. data/app/helpers/glib/json_ui/view_builder/charts.rb +33 -33
  40. data/app/helpers/glib/json_ui/view_builder/fields.rb +278 -279
  41. data/app/helpers/glib/json_ui/view_builder/panels.rb +256 -256
  42. data/app/helpers/glib/urls_helper.rb +12 -12
  43. data/app/models/glib/active_storage/attachment.rb +9 -9
  44. data/app/models/glib/active_storage/blob.rb +9 -9
  45. data/app/models/glib/application_record.rb +18 -18
  46. data/app/models/glib/dynamic_text_record.rb +9 -9
  47. data/app/models/glib/text.rb +95 -95
  48. data/app/policies/glib/application_policy.rb +161 -161
  49. data/app/validators/email_typo_validator.rb +38 -38
  50. data/app/validators/email_validator.rb +7 -7
  51. data/app/validators/url_validator.rb +20 -20
  52. data/app/views/json_ui/garage/_nav_menu.json.jbuilder +70 -70
  53. data/app/views/json_ui/garage/actions/_dialogs.json.jbuilder +104 -104
  54. data/app/views/json_ui/garage/actions/_http.json.jbuilder +24 -24
  55. data/app/views/json_ui/garage/actions/_panels.json.jbuilder +18 -18
  56. data/app/views/json_ui/garage/actions/_reload.json.jbuilder +17 -17
  57. data/app/views/json_ui/garage/actions/_sheets.json.jbuilder +18 -18
  58. data/app/views/json_ui/garage/actions/_snackbars.json.jbuilder +33 -33
  59. data/app/views/json_ui/garage/actions/_timeouts.json.jbuilder +24 -24
  60. data/app/views/json_ui/garage/actions/_windows.json.jbuilder +24 -24
  61. data/app/views/json_ui/garage/actions/dialogs_oauth_post.json.jbuilder +6 -6
  62. data/app/views/json_ui/garage/actions/index.json.jbuilder +24 -24
  63. data/app/views/json_ui/garage/forms/_alert_post_data.json.jbuilder +6 -6
  64. data/app/views/json_ui/garage/forms/basic.json.jbuilder +21 -21
  65. data/app/views/json_ui/garage/forms/basic_post.json.jbuilder +8 -8
  66. data/app/views/json_ui/garage/forms/checkboxes.json.jbuilder +43 -43
  67. data/app/views/json_ui/garage/forms/conditional_value.json.jbuilder +36 -36
  68. data/app/views/json_ui/garage/forms/dynamic_group.json.jbuilder +39 -39
  69. data/app/views/json_ui/garage/forms/dynamic_select.json.jbuilder +24 -22
  70. data/app/views/json_ui/garage/forms/dynamic_select_data.json.jbuilder +38 -38
  71. data/app/views/json_ui/garage/forms/file_upload.json.jbuilder +32 -37
  72. data/app/views/json_ui/garage/forms/floating_submit.json.jbuilder +19 -19
  73. data/app/views/json_ui/garage/forms/generic_post.json.jbuilder +3 -3
  74. data/app/views/json_ui/garage/forms/get_request.json.jbuilder +27 -27
  75. data/app/views/json_ui/garage/forms/index.json.jbuilder +113 -113
  76. data/app/views/json_ui/garage/forms/new_rich_text.json.jbuilder +39 -39
  77. data/app/views/json_ui/garage/forms/online_participant1.json.jbuilder +25 -25
  78. data/app/views/json_ui/garage/forms/online_participant2.json.jbuilder +25 -25
  79. data/app/views/json_ui/garage/forms/pickers.json.jbuilder +81 -81
  80. data/app/views/json_ui/garage/forms/ratings.json.jbuilder +49 -49
  81. data/app/views/json_ui/garage/forms/rich_text.json.jbuilder +40 -40
  82. data/app/views/json_ui/garage/forms/selects.json.jbuilder +91 -84
  83. data/app/views/json_ui/garage/forms/show_hide.json.jbuilder +130 -130
  84. data/app/views/json_ui/garage/forms/styled_boxes.json.jbuilder +35 -35
  85. data/app/views/json_ui/garage/forms/submission_flow.json.jbuilder +17 -17
  86. data/app/views/json_ui/garage/forms/submission_flow_post.json.jbuilder +26 -26
  87. data/app/views/json_ui/garage/forms/submission_indicator.json.jbuilder +63 -63
  88. data/app/views/json_ui/garage/forms/submission_indicator_post.json.jbuilder +25 -25
  89. data/app/views/json_ui/garage/forms/text_validation.json.jbuilder +81 -81
  90. data/app/views/json_ui/garage/forms/timers.json.jbuilder +120 -120
  91. data/app/views/json_ui/garage/home/blank.json.jbuilder +10 -10
  92. data/app/views/json_ui/garage/home/index.json.jbuilder +36 -36
  93. data/app/views/json_ui/garage/home/slow.json.jbuilder +11 -11
  94. data/app/views/json_ui/garage/lists/_autoload_section.json.jbuilder +28 -28
  95. data/app/views/json_ui/garage/lists/autoload_all.json.jbuilder +32 -32
  96. data/app/views/json_ui/garage/lists/autoload_as_needed.json.jbuilder +35 -35
  97. data/app/views/json_ui/garage/lists/chat_ui.json.jbuilder +94 -94
  98. data/app/views/json_ui/garage/lists/edit_actions.json.jbuilder +62 -62
  99. data/app/views/json_ui/garage/lists/fab.json.jbuilder +12 -12
  100. data/app/views/json_ui/garage/lists/index.json.jbuilder +38 -38
  101. data/app/views/json_ui/garage/lists/reordering.json.jbuilder +34 -34
  102. data/app/views/json_ui/garage/lists/templating.json.jbuilder +35 -35
  103. data/app/views/json_ui/garage/notifications/action_cable.json.jbuilder +114 -114
  104. data/app/views/json_ui/garage/notifications/android_post.json.jbuilder +48 -48
  105. data/app/views/json_ui/garage/notifications/index.json.jbuilder +36 -36
  106. data/app/views/json_ui/garage/notifications/web_socket.json.jbuilder +60 -60
  107. data/app/views/json_ui/garage/pages/flat_centered.json.jbuilder +29 -29
  108. data/app/views/json_ui/garage/pages/full_width.json.jbuilder +29 -29
  109. data/app/views/json_ui/garage/pages/full_width_height.json.jbuilder +16 -16
  110. data/app/views/json_ui/garage/pages/index.json.jbuilder +62 -62
  111. data/app/views/json_ui/garage/pages/layout.json.jbuilder +18 -18
  112. data/app/views/json_ui/garage/pages/lifecycle_hooks.json.jbuilder +13 -13
  113. data/app/views/json_ui/garage/pages/loading_indicator.json.jbuilder +10 -10
  114. data/app/views/json_ui/garage/pages/nav_buttons.json.jbuilder +21 -21
  115. data/app/views/json_ui/garage/pages/nested_scroll.json.jbuilder +40 -40
  116. data/app/views/json_ui/garage/pages/tab_bar.json.jbuilder +31 -31
  117. data/app/views/json_ui/garage/panels/_styled.json.jbuilder +78 -78
  118. data/app/views/json_ui/garage/panels/card.json.jbuilder +4 -4
  119. data/app/views/json_ui/garage/panels/carousel.json.jbuilder +37 -37
  120. data/app/views/json_ui/garage/panels/custom.json.jbuilder +17 -17
  121. data/app/views/json_ui/garage/panels/flow.json.jbuilder +59 -59
  122. data/app/views/json_ui/garage/panels/horizontal.json.jbuilder +91 -91
  123. data/app/views/json_ui/garage/panels/index.json.jbuilder +138 -134
  124. data/app/views/json_ui/garage/panels/outlined.json.jbuilder +4 -4
  125. data/app/views/json_ui/garage/panels/responsive.json.jbuilder +98 -98
  126. data/app/views/json_ui/garage/panels/split.json.jbuilder +182 -182
  127. data/app/views/json_ui/garage/panels/ul.json.jbuilder +33 -0
  128. data/app/views/json_ui/garage/panels/vertical.json.jbuilder +55 -55
  129. data/app/views/json_ui/garage/panels/web.json.jbuilder +15 -15
  130. data/app/views/json_ui/garage/services/dynamic_text.json.jbuilder +13 -13
  131. data/app/views/json_ui/garage/services/image.json.jbuilder +47 -47
  132. data/app/views/json_ui/garage/services/index.json.jbuilder +17 -17
  133. data/app/views/json_ui/garage/tables/_autoload_section.json.jbuilder +16 -16
  134. data/app/views/json_ui/garage/tables/autoload_all.json.jbuilder +43 -43
  135. data/app/views/json_ui/garage/tables/autoload_as_needed.json.jbuilder +50 -50
  136. data/app/views/json_ui/garage/tables/export_import.json.jbuilder +29 -29
  137. data/app/views/json_ui/garage/tables/horizontal_scroll.json.jbuilder +26 -26
  138. data/app/views/json_ui/garage/tables/index.json.jbuilder +25 -25
  139. data/app/views/json_ui/garage/tables/layout.json.jbuilder +40 -40
  140. data/app/views/json_ui/garage/views/_chart_data.json.jbuilder +17 -17
  141. data/app/views/json_ui/garage/views/banners.json.jbuilder +63 -63
  142. data/app/views/json_ui/garage/views/calendar_data.json.jbuilder +30 -30
  143. data/app/views/json_ui/garage/views/charts.json.jbuilder +115 -115
  144. data/app/views/json_ui/garage/views/controls.json.jbuilder +37 -37
  145. data/app/views/json_ui/garage/views/icon_names.json.jbuilder +1450 -1450
  146. data/app/views/json_ui/garage/views/icons.json.jbuilder +15 -14
  147. data/app/views/json_ui/garage/views/images.json.jbuilder +89 -89
  148. data/app/views/json_ui/garage/views/index.json.jbuilder +67 -67
  149. data/app/views/json_ui/garage/views/links.json.jbuilder +70 -70
  150. data/app/views/json_ui/garage/views/map_cluster_data.json.jbuilder +41 -41
  151. data/app/views/json_ui/garage/views/map_data.json.jbuilder +51 -51
  152. data/app/views/json_ui/garage/views/maps.json.jbuilder +31 -31
  153. data/app/views/json_ui/garage/views/markdowns.json.jbuilder +41 -41
  154. data/app/views/json_ui/garage/views/misc.json.jbuilder +34 -34
  155. data/app/views/json_ui/garage/views/texts.json.jbuilder +35 -35
  156. data/app/views/layouts/json_ui/renderer.html.erb +35 -35
  157. data/config/routes.rb +7 -7
  158. data/lib/generators/glib/install_generator.rb +24 -24
  159. data/lib/generators/templates/20191017062519_create_texts.rb +12 -12
  160. data/lib/generators/templates/20191024063257_add_scope_to_texts.rb +7 -7
  161. data/lib/generators/templates/20191112095018_add_lang_to_texts.rb +7 -7
  162. data/lib/generators/templates/20191126071051_create_active_storage_tables.active_storage.rb +27 -27
  163. data/lib/generators/templates/database.yml +107 -107
  164. data/lib/generators/templates/dynamic_text.rb +2 -2
  165. data/lib/glib-web.rb +9 -9
  166. data/lib/glib/crypt/utils.rb +26 -26
  167. data/lib/glib/dynamic_text/config.rb +21 -21
  168. data/lib/glib/engine.rb +7 -7
  169. data/lib/glib/json_crawler.rb +11 -11
  170. data/lib/glib/json_crawler/action_crawler.rb +23 -23
  171. data/lib/glib/json_crawler/action_crawlers/action_http.rb +11 -11
  172. data/lib/glib/json_crawler/action_crawlers/forms_submit.rb +48 -48
  173. data/lib/glib/json_crawler/action_crawlers/menu.rb +12 -12
  174. data/lib/glib/json_crawler/action_crawlers/nav_initiate.rb +19 -19
  175. data/lib/glib/json_crawler/action_crawlers/run_multiple.rb +13 -13
  176. data/lib/glib/json_crawler/action_crawlers/windows_open.rb +33 -33
  177. data/lib/glib/json_crawler/coverage.rb +20 -20
  178. data/lib/glib/json_crawler/http.rb +120 -120
  179. data/lib/glib/json_crawler/router.rb +98 -98
  180. data/lib/glib/mailer_tester.rb +36 -36
  181. data/lib/glib/test_helpers.rb +52 -52
  182. data/lib/glib/value.rb +7 -7
  183. data/lib/glib/version.rb +5 -5
  184. data/lib/tasks/db.rake +95 -95
  185. metadata +3 -3
@@ -1,26 +1,26 @@
1
- class Glib::JsonUi::ViewBuilder
2
- module Banners
3
-
4
- class Alert < View
5
- icon :icon
6
- string :message
7
- # string :message_format
8
- singleton_array :styleClass, :styleClasses
9
- end
10
-
11
- class Select < View
12
- string :id
13
- icon :icon
14
- string :message
15
- singleton_array :styleClass, :styleClasses
16
- color :color
17
-
18
- def buttons(block)
19
- json.buttons do
20
- block.call page.menu_builder
21
- end
22
- end
23
- end
24
-
25
- end
26
- end
1
+ class Glib::JsonUi::ViewBuilder
2
+ module Banners
3
+
4
+ class Alert < View
5
+ icon :icon
6
+ string :message
7
+ # string :message_format
8
+ singleton_array :styleClass, :styleClasses
9
+ end
10
+
11
+ class Select < View
12
+ string :id
13
+ icon :icon
14
+ string :message
15
+ singleton_array :styleClass, :styleClasses
16
+ color :color
17
+
18
+ def buttons(block)
19
+ json.buttons do
20
+ block.call page.menu_builder
21
+ end
22
+ end
23
+ end
24
+
25
+ end
26
+ end
@@ -1,33 +1,33 @@
1
- class Glib::JsonUi::ViewBuilder
2
- module Charts
3
- class Line < View
4
- hash :nextPage
5
-
6
- def dataSeries(blocks)
7
- json.dataSeries do
8
- blocks.each do |block|
9
- json.child! do
10
- block.call
11
- end
12
- end
13
- end
14
- end
15
-
16
- end
17
-
18
- class Column < View
19
- bool :stacked
20
-
21
- def dataGroups(blocks)
22
- json.dataGroups do
23
- blocks.each do |block|
24
- json.child! do
25
- block.call
26
- end
27
- end
28
- end
29
- end
30
-
31
- end
32
- end
33
- end
1
+ class Glib::JsonUi::ViewBuilder
2
+ module Charts
3
+ class Line < View
4
+ hash :nextPage
5
+
6
+ def dataSeries(blocks)
7
+ json.dataSeries do
8
+ blocks.each do |block|
9
+ json.child! do
10
+ block.call
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ end
17
+
18
+ class Column < View
19
+ bool :stacked
20
+
21
+ def dataGroups(blocks)
22
+ json.dataGroups do
23
+ blocks.each do |block|
24
+ json.child! do
25
+ block.call
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -1,279 +1,278 @@
1
- class Glib::JsonUi::ViewBuilder
2
- module Fields
3
-
4
- class AbstractField < View
5
- bool :readOnly
6
- hash :validation
7
- # string :label
8
-
9
- def label(label)
10
- @label = label
11
- end
12
-
13
- def label_args(label_args)
14
- @label_args = label_args
15
- end
16
-
17
- def hint(hint)
18
- @hint = hint
19
- end
20
-
21
- def hint_args(hint_args)
22
- @hint_args = hint_args
23
- end
24
-
25
- def placeholder(placeholder)
26
- @placeholder = placeholder
27
- end
28
-
29
- def placeholder_args(placeholder_args)
30
- @placeholder_args = placeholder_args
31
- end
32
-
33
- def name(name)
34
- @name = name if name != Glib::Value::DEFAULT
35
- end
36
-
37
- def value(value)
38
- @value = value if value != Glib::Value::DEFAULT
39
- end
40
-
41
- def prop(prop)
42
- @prop = prop
43
- end
44
-
45
- # Override
46
- def created
47
- if @prop && (form = page.current_form)
48
- form.field_assert_respond_to(@prop)
49
-
50
- @name ||= form.field_name(@prop, @multiple || false)
51
- @value ||= form.field_value(@prop)
52
- @label ||= form.field_label(@prop, @label_args || {})
53
- @hint ||= form.hint_label(@prop, @hint_args || {})
54
- @placeholder ||= form.placeholder_label(@prop, @placeholder_args || {})
55
-
56
- @validation ||= form.field_validation(@prop)
57
- end
58
- json.name @name
59
- json.value @value if @value
60
- json.label @label if @label
61
- json.hint @hint if @hint
62
-
63
- # In general, use hint over placeholder for the following reasons:
64
- # - Placeholder gets hidden when there is input which may be confusing
65
- # - Placeholder competes with label for space
66
- json.placeholder @placeholder if @placeholder
67
-
68
- # TODO: Add a flag so the framework's user can turn it on and off.
69
- # json.validation @validation if @validation
70
- end
71
-
72
- end
73
-
74
- class Text < AbstractField
75
- int :maxLength
76
- icon :leftIcon
77
- string :leftText
78
- string :rightText
79
- action :onTypeStart
80
- action :onTypeEnd
81
- end
82
-
83
- class Number < Text
84
- int :min
85
- int :max
86
- end
87
-
88
- class Email < Text
89
- end
90
-
91
- class Url < Text
92
- end
93
-
94
- class Password < Text
95
- end
96
-
97
- class Hidden < Text
98
- end
99
-
100
- class Timer < Text
101
- hash :actionCable
102
- int :min
103
- int :max
104
- bool :forward
105
- end
106
-
107
- # Benefits of using `fields/submit` over `button`
108
- # - On the web, it translates to input[type=submit] which provides builtin functionality such as
109
- # submitting upon pressing enter on a field and remembering values for autofill.
110
- # - We can attach name-value param to it. See https://www.w3schools.com/tags/att_button_value.asp
111
- # - It has a default onClick so no need to specify `onClick: ->(action) { action.forms_submit }`
112
- class Submit < AbstractField
113
- string :text
114
- color :color
115
- end
116
-
117
- class CheckGroup < AbstractField
118
- views :childViews
119
- string :uncheckValue
120
- end
121
-
122
- class Check < Text
123
- any :uncheckValue
124
- any :checkValue
125
-
126
-
127
- def value(value)
128
- @value = value if value != Glib::Value::DEFAULT
129
- end
130
-
131
- # TODO: Remove (deprecated). Where possible, use value instead of this
132
- bool :checked
133
- end
134
-
135
- # This doesn't use camel case because some terms have become single words (e.g. snackbar)
136
- class Textarea < Text
137
- end
138
-
139
- class RichText < Text
140
- array :images
141
- end
142
-
143
- class Country < AbstractField
144
- hash :region
145
- end
146
-
147
- class Select < AbstractField
148
- array :options
149
- # bool :readOnly
150
- bool :multiple, cache: true
151
- # bool :manualEntry
152
- hash :append
153
- end
154
-
155
- # TODO: Remove (deprecated)
156
- class Autocomplete < AbstractField
157
- array :options
158
- # bool :readOnly
159
- bool :multiple, cache: true
160
- # bool :manualEntry
161
- hash :append
162
- end
163
-
164
- class DynamicSelect < AbstractField
165
- array :selectedOptions
166
- string :url
167
- bool :multiple, cache: true
168
-
169
- # Override
170
- def value(value)
171
- raise 'Use selectedOptions instead (for clarity)'
172
- end
173
- end
174
-
175
- class DynamicGroup < AbstractField
176
- string :titlePrefix
177
- panels_builder :content, :template
178
- hash :groupFieldProperties
179
-
180
- # NOTE: Consider using sub-panel instead (e.g. groupTemplate)
181
- # views :groupTemplateViews
182
- end
183
-
184
- class RadioGroup < AbstractField
185
- # string :name
186
- # string :value
187
- views :childViews
188
-
189
- # Override
190
- def value(value)
191
- # Convert to string to make sure the value matches with Radio#value
192
- @value = value.to_s if value != Glib::Value::DEFAULT
193
- end
194
-
195
- string :iconOfBeforeSelected
196
- string :iconOfSelected
197
- string :iconOfAfterSelected
198
- end
199
-
200
- class Radio < View
201
- string :label
202
- string :value
203
- end
204
-
205
- class File < Text
206
- # file_rules = { fileType: 'image/*', maxFileSize: 5000 }
207
- # file_rules = { fileType: 'video/*', maxFileSize: 50000 }
208
- # file_rules = { fileType: 'application/pdf', maxFileSize: 5000 }
209
- hash :accepts
210
-
211
- string :directUploadUrl
212
- string :fileUrl
213
- string :fileTitle
214
- hash :placeholderView
215
- end
216
-
217
- class MultiImage < Text
218
- # file_rules = { fileType: 'image/*', maxFileSize: 5000 }
219
- # file_rules = { fileType: 'video/*', maxFileSize: 50000 }
220
- # file_rules = { fileType: 'application/pdf', maxFileSize: 5000 }
221
- # hash :accepts
222
-
223
- string :directUploadUrl
224
- # string :fileUrl
225
- # string :fileTitle
226
- hash :placeholderView
227
- end
228
-
229
- class Date < AbstractField
230
- date :min
231
- date :max
232
-
233
- # Override
234
- def value(value)
235
- super(value&.to_date)
236
- end
237
- end
238
-
239
- # This doesn't use camel case to be consistent with the html input equivalent
240
- class Datetime < AbstractField
241
- date_time :min
242
- date_time :max
243
- end
244
-
245
- class Location < AbstractField
246
- hash :latitudeField
247
- hash :longitudeField
248
- hash :zoomField
249
- hash :autocompleteOptions
250
- end
251
-
252
- class StripeToken < AbstractField
253
- string :publicKey
254
- end
255
-
256
- class StripeExternalAccount < AbstractField
257
- string :publicKey
258
- string :accountHolderName
259
- string :accountHolderType
260
- string :country
261
- string :currency
262
- end
263
-
264
- class Phone < AbstractField
265
- string :defaultCountry
266
- bool :disableAutoDetect
267
- end
268
-
269
- class CreditCard < AbstractField
270
- string :publicKey
271
- end
272
-
273
- class Rating < AbstractField
274
- bool :halfIncrements
275
- string :color
276
- int :size
277
- end
278
- end
279
- end
1
+ class Glib::JsonUi::ViewBuilder
2
+ module Fields
3
+
4
+ class AbstractField < View
5
+ bool :readOnly
6
+ hash :validation
7
+ # string :label
8
+
9
+ def label(label)
10
+ @label = label
11
+ end
12
+
13
+ def label_args(label_args)
14
+ @label_args = label_args
15
+ end
16
+
17
+ def hint(hint)
18
+ @hint = hint
19
+ end
20
+
21
+ def hint_args(hint_args)
22
+ @hint_args = hint_args
23
+ end
24
+
25
+ def placeholder(placeholder)
26
+ @placeholder = placeholder
27
+ end
28
+
29
+ def placeholder_args(placeholder_args)
30
+ @placeholder_args = placeholder_args
31
+ end
32
+
33
+ def name(name)
34
+ @name = name if name != Glib::Value::DEFAULT
35
+ end
36
+
37
+ def value(value)
38
+ @value = value if value != Glib::Value::DEFAULT
39
+ end
40
+
41
+ def prop(prop)
42
+ @prop = prop
43
+ end
44
+
45
+ # Override
46
+ def created
47
+ if @prop && (form = page.current_form)
48
+ form.field_assert_respond_to(@prop)
49
+
50
+ @name ||= form.field_name(@prop, @multiple || false)
51
+ @value ||= form.field_value(@prop)
52
+ @label ||= form.field_label(@prop, @label_args || {})
53
+ @hint ||= form.hint_label(@prop, @hint_args || {})
54
+ @placeholder ||= form.placeholder_label(@prop, @placeholder_args || {})
55
+
56
+ @validation ||= form.field_validation(@prop)
57
+ end
58
+ json.name @name
59
+ json.value @value if @value
60
+ json.label @label if @label
61
+ json.hint @hint if @hint
62
+
63
+ # In general, use hint over placeholder for the following reasons:
64
+ # - Placeholder gets hidden when there is input which may be confusing
65
+ # - Placeholder competes with label for space
66
+ json.placeholder @placeholder if @placeholder
67
+
68
+ # TODO: Add a flag so the framework's user can turn it on and off.
69
+ # json.validation @validation if @validation
70
+ end
71
+
72
+ end
73
+
74
+ class Text < AbstractField
75
+ int :maxLength
76
+ icon :leftIcon
77
+ string :leftText
78
+ string :rightText
79
+ action :onTypeStart
80
+ action :onTypeEnd
81
+ end
82
+
83
+ class Number < Text
84
+ int :min
85
+ int :max
86
+ end
87
+
88
+ class Email < Text
89
+ end
90
+
91
+ class Url < Text
92
+ end
93
+
94
+ class Password < Text
95
+ end
96
+
97
+ class Hidden < Text
98
+ end
99
+
100
+ class Timer < Text
101
+ hash :actionCable
102
+ int :min
103
+ int :max
104
+ bool :forward
105
+ end
106
+
107
+ # Benefits of using `fields/submit` over `button`
108
+ # - On the web, it translates to input[type=submit] which provides builtin functionality such as
109
+ # submitting upon pressing enter on a field and remembering values for autofill.
110
+ # - We can attach name-value param to it. See https://www.w3schools.com/tags/att_button_value.asp
111
+ # - It has a default onClick so no need to specify `onClick: ->(action) { action.forms_submit }`
112
+ class Submit < AbstractField
113
+ string :text
114
+ color :color
115
+ end
116
+
117
+ class CheckGroup < AbstractField
118
+ views :childViews
119
+ string :uncheckValue
120
+ end
121
+
122
+ class Check < Text
123
+ any :uncheckValue
124
+ any :checkValue
125
+
126
+
127
+ def value(value)
128
+ @value = value if value != Glib::Value::DEFAULT
129
+ end
130
+
131
+ # TODO: Remove (deprecated). Where possible, use value instead of this
132
+ bool :checked
133
+ end
134
+
135
+ # This doesn't use camel case because some terms have become single words (e.g. snackbar)
136
+ class Textarea < Text
137
+ end
138
+
139
+ class RichText < Text
140
+ array :images
141
+ end
142
+
143
+ class Country < AbstractField
144
+ hash :region
145
+ end
146
+
147
+ class Select < AbstractField
148
+ array :options
149
+ # bool :readOnly
150
+ bool :multiple, cache: true
151
+ # bool :manualEntry
152
+ hash :append
153
+ end
154
+
155
+ class TimeZone < AbstractField
156
+ include Glib::EnumHelper
157
+
158
+ # Override
159
+ def created
160
+ super
161
+
162
+ json.options glib_time_zone_options
163
+ end
164
+ end
165
+
166
+ # TODO: Remove (deprecated)
167
+ class Autocomplete < AbstractField
168
+ array :options
169
+ # bool :readOnly
170
+ bool :multiple, cache: true
171
+ # bool :manualEntry
172
+ hash :append
173
+ end
174
+
175
+ class DynamicSelect < AbstractField
176
+ array :selectedOptions
177
+ string :url
178
+ bool :multiple, cache: true
179
+
180
+ # Override
181
+ def value(value)
182
+ raise 'Use selectedOptions instead (for clarity)'
183
+ end
184
+ end
185
+
186
+ class DynamicGroup < AbstractField
187
+ string :titlePrefix
188
+ panels_builder :content, :template
189
+ hash :groupFieldProperties
190
+
191
+ # NOTE: Consider using sub-panel instead (e.g. groupTemplate)
192
+ # views :groupTemplateViews
193
+ end
194
+
195
+ class RadioGroup < AbstractField
196
+ # string :name
197
+ # string :value
198
+ views :childViews
199
+
200
+ # Override
201
+ def value(value)
202
+ # Convert to string to make sure the value matches with Radio#value
203
+ @value = value.to_s if value != Glib::Value::DEFAULT
204
+ end
205
+
206
+ string :iconOfBeforeSelected
207
+ string :iconOfSelected
208
+ string :iconOfAfterSelected
209
+ end
210
+
211
+ class Radio < View
212
+ string :label
213
+ string :value
214
+ end
215
+
216
+ class File < Text
217
+ # file_rules = { fileType: 'image/*', maxFileSize: 5000 }
218
+ # file_rules = { fileType: 'video/*', maxFileSize: 50000 }
219
+ # file_rules = { fileType: 'application/pdf', maxFileSize: 5000 }
220
+ hash :accepts
221
+
222
+ string :directUploadUrl
223
+ string :fileUrl
224
+ string :fileTitle
225
+ hash :placeholderView
226
+ end
227
+
228
+ class Date < AbstractField
229
+ date :min
230
+ date :max
231
+
232
+ # Override
233
+ def value(value)
234
+ super(value&.to_date)
235
+ end
236
+ end
237
+
238
+ # This doesn't use camel case to be consistent with the html input equivalent
239
+ class Datetime < AbstractField
240
+ date_time :min
241
+ date_time :max
242
+ end
243
+
244
+ class Location < AbstractField
245
+ hash :latitudeField
246
+ hash :longitudeField
247
+ hash :zoomField
248
+ hash :autocompleteOptions
249
+ end
250
+
251
+ class StripeToken < AbstractField
252
+ string :publicKey
253
+ end
254
+
255
+ class StripeExternalAccount < AbstractField
256
+ string :publicKey
257
+ string :accountHolderName
258
+ string :accountHolderType
259
+ string :country
260
+ string :currency
261
+ end
262
+
263
+ class Phone < AbstractField
264
+ string :defaultCountry
265
+ bool :disableAutoDetect
266
+ end
267
+
268
+ class CreditCard < AbstractField
269
+ string :publicKey
270
+ end
271
+
272
+ class Rating < AbstractField
273
+ bool :halfIncrements
274
+ string :color
275
+ int :size
276
+ end
277
+ end
278
+ end