glib-web 0.5.66 → 0.5.67

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 (181) hide show
  1. checksums.yaml +4 -4
  2. data/app/channels/glib/channel/is_typing_channel.rb +34 -28
  3. data/app/channels/glib/channel/online_channel.rb +36 -29
  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 +8 -8
  18. data/app/helpers/glib/forms_helper.rb +15 -15
  19. data/app/helpers/glib/json_ui/abstract_builder.rb +294 -294
  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 +31 -31
  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 +47 -47
  36. data/app/helpers/glib/json_ui/table_builders.rb +74 -74
  37. data/app/helpers/glib/json_ui/view_builder.rb +232 -232
  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 +267 -263
  41. data/app/helpers/glib/json_ui/view_builder/panels.rb +251 -251
  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 +22 -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 -32
  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 +116 -113
  76. data/app/views/json_ui/garage/forms/misc.json.jbuilder +57 -29
  77. data/app/views/json_ui/garage/forms/misc_two.json.jbuilder +61 -0
  78. data/app/views/json_ui/garage/forms/new_rich_text.json.jbuilder +39 -39
  79. data/app/views/json_ui/garage/forms/pickers.json.jbuilder +79 -79
  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 +83 -83
  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/home/blank.json.jbuilder +10 -10
  91. data/app/views/json_ui/garage/home/index.json.jbuilder +36 -36
  92. data/app/views/json_ui/garage/home/slow.json.jbuilder +11 -11
  93. data/app/views/json_ui/garage/lists/_autoload_section.json.jbuilder +28 -28
  94. data/app/views/json_ui/garage/lists/autoload_all.json.jbuilder +32 -32
  95. data/app/views/json_ui/garage/lists/autoload_as_needed.json.jbuilder +35 -35
  96. data/app/views/json_ui/garage/lists/chat_ui.json.jbuilder +94 -94
  97. data/app/views/json_ui/garage/lists/edit_actions.json.jbuilder +62 -62
  98. data/app/views/json_ui/garage/lists/fab.json.jbuilder +12 -12
  99. data/app/views/json_ui/garage/lists/index.json.jbuilder +32 -32
  100. data/app/views/json_ui/garage/lists/reordering.json.jbuilder +34 -34
  101. data/app/views/json_ui/garage/lists/templating.json.jbuilder +35 -35
  102. data/app/views/json_ui/garage/notifications/action_cable.json.jbuilder +114 -113
  103. data/app/views/json_ui/garage/notifications/android_post.json.jbuilder +48 -48
  104. data/app/views/json_ui/garage/notifications/index.json.jbuilder +36 -36
  105. data/app/views/json_ui/garage/notifications/web_socket.json.jbuilder +60 -60
  106. data/app/views/json_ui/garage/pages/flat_centered.json.jbuilder +29 -29
  107. data/app/views/json_ui/garage/pages/full_width.json.jbuilder +29 -29
  108. data/app/views/json_ui/garage/pages/full_width_height.json.jbuilder +16 -16
  109. data/app/views/json_ui/garage/pages/index.json.jbuilder +62 -62
  110. data/app/views/json_ui/garage/pages/layout.json.jbuilder +18 -18
  111. data/app/views/json_ui/garage/pages/lifecycle_hooks.json.jbuilder +13 -13
  112. data/app/views/json_ui/garage/pages/loading_indicator.json.jbuilder +10 -10
  113. data/app/views/json_ui/garage/pages/nav_buttons.json.jbuilder +21 -21
  114. data/app/views/json_ui/garage/pages/nested_scroll.json.jbuilder +40 -40
  115. data/app/views/json_ui/garage/pages/tab_bar.json.jbuilder +31 -31
  116. data/app/views/json_ui/garage/panels/_styled.json.jbuilder +78 -78
  117. data/app/views/json_ui/garage/panels/card.json.jbuilder +4 -4
  118. data/app/views/json_ui/garage/panels/carousel.json.jbuilder +37 -37
  119. data/app/views/json_ui/garage/panels/custom.json.jbuilder +17 -17
  120. data/app/views/json_ui/garage/panels/flow.json.jbuilder +49 -49
  121. data/app/views/json_ui/garage/panels/horizontal.json.jbuilder +91 -91
  122. data/app/views/json_ui/garage/panels/index.json.jbuilder +132 -132
  123. data/app/views/json_ui/garage/panels/outlined.json.jbuilder +4 -4
  124. data/app/views/json_ui/garage/panels/responsive.json.jbuilder +98 -98
  125. data/app/views/json_ui/garage/panels/split.json.jbuilder +182 -182
  126. data/app/views/json_ui/garage/panels/vertical.json.jbuilder +55 -55
  127. data/app/views/json_ui/garage/services/dynamic_text.json.jbuilder +13 -13
  128. data/app/views/json_ui/garage/services/image.json.jbuilder +47 -47
  129. data/app/views/json_ui/garage/services/index.json.jbuilder +17 -17
  130. data/app/views/json_ui/garage/tables/_autoload_section.json.jbuilder +16 -16
  131. data/app/views/json_ui/garage/tables/autoload_all.json.jbuilder +43 -43
  132. data/app/views/json_ui/garage/tables/autoload_as_needed.json.jbuilder +50 -50
  133. data/app/views/json_ui/garage/tables/export_import.json.jbuilder +29 -29
  134. data/app/views/json_ui/garage/tables/horizontal_scroll.json.jbuilder +26 -26
  135. data/app/views/json_ui/garage/tables/index.json.jbuilder +25 -25
  136. data/app/views/json_ui/garage/tables/layout.json.jbuilder +40 -40
  137. data/app/views/json_ui/garage/views/_chart_data.json.jbuilder +17 -17
  138. data/app/views/json_ui/garage/views/banners.json.jbuilder +63 -63
  139. data/app/views/json_ui/garage/views/calendar_data.json.jbuilder +30 -30
  140. data/app/views/json_ui/garage/views/charts.json.jbuilder +115 -115
  141. data/app/views/json_ui/garage/views/icon_names.json.jbuilder +1450 -1450
  142. data/app/views/json_ui/garage/views/icons.json.jbuilder +14 -14
  143. data/app/views/json_ui/garage/views/images.json.jbuilder +89 -89
  144. data/app/views/json_ui/garage/views/index.json.jbuilder +64 -64
  145. data/app/views/json_ui/garage/views/links.json.jbuilder +70 -70
  146. data/app/views/json_ui/garage/views/map_cluster_data.json.jbuilder +41 -41
  147. data/app/views/json_ui/garage/views/map_data.json.jbuilder +51 -51
  148. data/app/views/json_ui/garage/views/maps.json.jbuilder +31 -31
  149. data/app/views/json_ui/garage/views/markdowns.json.jbuilder +41 -41
  150. data/app/views/json_ui/garage/views/misc.json.jbuilder +34 -34
  151. data/app/views/json_ui/garage/views/texts.json.jbuilder +44 -44
  152. data/app/views/layouts/json_ui/renderer.html.erb +35 -35
  153. data/config/routes.rb +7 -7
  154. data/lib/generators/glib/install_generator.rb +24 -24
  155. data/lib/generators/templates/20191017062519_create_texts.rb +12 -12
  156. data/lib/generators/templates/20191024063257_add_scope_to_texts.rb +7 -7
  157. data/lib/generators/templates/20191112095018_add_lang_to_texts.rb +7 -7
  158. data/lib/generators/templates/20191126071051_create_active_storage_tables.active_storage.rb +27 -27
  159. data/lib/generators/templates/database.yml +107 -107
  160. data/lib/generators/templates/dynamic_text.rb +2 -2
  161. data/lib/glib-web.rb +9 -9
  162. data/lib/glib/crypt/utils.rb +26 -26
  163. data/lib/glib/dynamic_text/config.rb +21 -21
  164. data/lib/glib/engine.rb +7 -7
  165. data/lib/glib/json_crawler.rb +11 -11
  166. data/lib/glib/json_crawler/action_crawler.rb +23 -23
  167. data/lib/glib/json_crawler/action_crawlers/action_http.rb +11 -11
  168. data/lib/glib/json_crawler/action_crawlers/forms_submit.rb +48 -48
  169. data/lib/glib/json_crawler/action_crawlers/menu.rb +12 -12
  170. data/lib/glib/json_crawler/action_crawlers/nav_initiate.rb +19 -19
  171. data/lib/glib/json_crawler/action_crawlers/run_multiple.rb +13 -13
  172. data/lib/glib/json_crawler/action_crawlers/windows_open.rb +33 -33
  173. data/lib/glib/json_crawler/coverage.rb +20 -20
  174. data/lib/glib/json_crawler/http.rb +120 -120
  175. data/lib/glib/json_crawler/router.rb +98 -98
  176. data/lib/glib/mailer_tester.rb +36 -36
  177. data/lib/glib/test_helpers.rb +52 -52
  178. data/lib/glib/value.rb +7 -7
  179. data/lib/glib/version.rb +5 -5
  180. data/lib/tasks/db.rake +95 -95
  181. metadata +2 -1
@@ -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,263 +1,267 @@
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
- bool :forward
102
- end
103
-
104
- # Benefits of using `fields/submit` over `button`
105
- # - On the web, it translates to input[type=submit] which provides builtin functionality such as
106
- # submitting upon pressing enter on a field and remembering values for autofill.
107
- # - We can attach name-value param to it. See https://www.w3schools.com/tags/att_button_value.asp
108
- # - It has a default onClick so no need to specify `onClick: ->(action) { action.forms_submit }`
109
- class Submit < AbstractField
110
- string :text
111
- color :color
112
- end
113
-
114
- class CheckGroup < AbstractField
115
- views :childViews
116
- string :uncheckValue
117
- end
118
-
119
- class Check < Text
120
- any :uncheckValue
121
- any :checkValue
122
-
123
-
124
- def value(value)
125
- @value = value if value != Glib::Value::DEFAULT
126
- end
127
-
128
- # Where possible, use value instead of this
129
- bool :checked
130
- end
131
-
132
- # This doesn't use camel case because some terms have become single words (e.g. snackbar)
133
- class Textarea < Text
134
- end
135
-
136
- class RichText < Text
137
- array :images
138
- end
139
-
140
- class Country < AbstractField
141
- hash :region
142
- end
143
-
144
- class Select < AbstractField
145
- array :options
146
- # bool :readOnly
147
- bool :multiple, cache: true
148
- # bool :manualEntry
149
- hash :append
150
- end
151
-
152
- class Autocomplete < AbstractField
153
- array :options
154
- # bool :readOnly
155
- bool :multiple, cache: true
156
- # bool :manualEntry
157
- hash :append
158
- end
159
-
160
- class DynamicSelect < AbstractField
161
- array :selectedOptions
162
- string :url
163
- bool :multiple, cache: true
164
-
165
- # Override
166
- def value(value)
167
- raise 'Use selectedOptions instead (for clarity)'
168
- end
169
- end
170
-
171
- class DynamicGroup < AbstractField
172
- string :titlePrefix
173
- panels_builder :content, :template
174
- hash :groupFieldProperties
175
-
176
- # NOTE: Consider using sub-panel instead (e.g. groupTemplate)
177
- # views :groupTemplateViews
178
- end
179
-
180
- class RadioGroup < AbstractField
181
- # string :name
182
- # string :value
183
- views :childViews
184
-
185
- # Override
186
- def value(value)
187
- # Convert to string to make sure the value matches with Radio#value
188
- @value = value.to_s if value != Glib::Value::DEFAULT
189
- end
190
-
191
- string :iconOfBeforeSelected
192
- string :iconOfSelected
193
- string :iconOfAfterSelected
194
- end
195
-
196
- class Radio < View
197
- string :label
198
- string :value
199
- end
200
-
201
- class File < Text
202
- # file_rules = { fileType: 'image/*', maxFileSize: 5000 }
203
- # file_rules = { fileType: 'video/*', maxFileSize: 50000 }
204
- # file_rules = { fileType: 'application/pdf', maxFileSize: 5000 }
205
- hash :accepts
206
-
207
- string :directUploadUrl
208
- string :fileUrl
209
- string :fileTitle
210
- hash :placeholderView
211
- end
212
-
213
- class Date < AbstractField
214
- date :min
215
- date :max
216
-
217
- # Override
218
- def value(value)
219
- super(value&.to_date)
220
- end
221
- end
222
-
223
- # This doesn't use camel case to be consistent with the html input equivalent
224
- class Datetime < AbstractField
225
- date_time :min
226
- date_time :max
227
- end
228
-
229
- class Location < AbstractField
230
- hash :latitudeField
231
- hash :longitudeField
232
- hash :zoomField
233
- hash :autocompleteOptions
234
- end
235
-
236
- class StripeToken < AbstractField
237
- string :publicKey
238
- end
239
-
240
- class StripeExternalAccount < AbstractField
241
- string :publicKey
242
- string :accountHolderName
243
- string :accountHolderType
244
- string :country
245
- string :currency
246
- end
247
-
248
- class Phone < AbstractField
249
- string :defaultCountry
250
- bool :disableAutoDetect
251
- end
252
-
253
- class CreditCard < AbstractField
254
- string :publicKey
255
- end
256
-
257
- class Rating < AbstractField
258
- bool :halfIncrements
259
- string :color
260
- int :size
261
- end
262
- end
263
- 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
+ bool :forward
102
+ hash :actionCable
103
+ action :onZero
104
+ int :min
105
+ int :max
106
+ end
107
+
108
+ # Benefits of using `fields/submit` over `button`
109
+ # - On the web, it translates to input[type=submit] which provides builtin functionality such as
110
+ # submitting upon pressing enter on a field and remembering values for autofill.
111
+ # - We can attach name-value param to it. See https://www.w3schools.com/tags/att_button_value.asp
112
+ # - It has a default onClick so no need to specify `onClick: ->(action) { action.forms_submit }`
113
+ class Submit < AbstractField
114
+ string :text
115
+ color :color
116
+ end
117
+
118
+ class CheckGroup < AbstractField
119
+ views :childViews
120
+ string :uncheckValue
121
+ end
122
+
123
+ class Check < Text
124
+ any :uncheckValue
125
+ any :checkValue
126
+
127
+
128
+ def value(value)
129
+ @value = value if value != Glib::Value::DEFAULT
130
+ end
131
+
132
+ # Where possible, use value instead of this
133
+ bool :checked
134
+ end
135
+
136
+ # This doesn't use camel case because some terms have become single words (e.g. snackbar)
137
+ class Textarea < Text
138
+ end
139
+
140
+ class RichText < Text
141
+ array :images
142
+ end
143
+
144
+ class Country < AbstractField
145
+ hash :region
146
+ end
147
+
148
+ class Select < AbstractField
149
+ array :options
150
+ # bool :readOnly
151
+ bool :multiple, cache: true
152
+ # bool :manualEntry
153
+ hash :append
154
+ end
155
+
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 Date < AbstractField
218
+ date :min
219
+ date :max
220
+
221
+ # Override
222
+ def value(value)
223
+ super(value&.to_date)
224
+ end
225
+ end
226
+
227
+ # This doesn't use camel case to be consistent with the html input equivalent
228
+ class Datetime < AbstractField
229
+ date_time :min
230
+ date_time :max
231
+ end
232
+
233
+ class Location < AbstractField
234
+ hash :latitudeField
235
+ hash :longitudeField
236
+ hash :zoomField
237
+ hash :autocompleteOptions
238
+ end
239
+
240
+ class StripeToken < AbstractField
241
+ string :publicKey
242
+ end
243
+
244
+ class StripeExternalAccount < AbstractField
245
+ string :publicKey
246
+ string :accountHolderName
247
+ string :accountHolderType
248
+ string :country
249
+ string :currency
250
+ end
251
+
252
+ class Phone < AbstractField
253
+ string :defaultCountry
254
+ bool :disableAutoDetect
255
+ end
256
+
257
+ class CreditCard < AbstractField
258
+ string :publicKey
259
+ end
260
+
261
+ class Rating < AbstractField
262
+ bool :halfIncrements
263
+ string :color
264
+ int :size
265
+ end
266
+ end
267
+ end