glib-web 0.5.52 → 0.5.53

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