glib-web 0.5.43 → 0.5.44

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 (171) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/glib/analytics/funnel.rb +61 -61
  3. data/app/controllers/concerns/glib/auth/policy.rb +148 -148
  4. data/app/controllers/concerns/glib/json/dynamic_text.rb +126 -126
  5. data/app/controllers/concerns/glib/json/libs.rb +144 -144
  6. data/app/controllers/concerns/glib/json/new_dynamic_text.rb +122 -122
  7. data/app/controllers/concerns/glib/json/transformation.rb +11 -11
  8. data/app/controllers/concerns/glib/json/traversal.rb +87 -87
  9. data/app/controllers/concerns/glib/json/ui.rb +88 -88
  10. data/app/controllers/concerns/glib/json/validation.rb +13 -13
  11. data/app/controllers/glib/home_controller.rb +16 -16
  12. data/app/helpers/glib/app_feature_support_helper.rb +16 -16
  13. data/app/helpers/glib/dynamic_images_helper.rb +55 -55
  14. data/app/helpers/glib/dynamic_texts_helper.rb +42 -42
  15. data/app/helpers/glib/enum_helper.rb +8 -8
  16. data/app/helpers/glib/forms_helper.rb +15 -15
  17. data/app/helpers/glib/json_ui/abstract_builder.rb +294 -294
  18. data/app/helpers/glib/json_ui/action_builder.rb +131 -131
  19. data/app/helpers/glib/json_ui/action_builder/dialogs.rb +58 -58
  20. data/app/helpers/glib/json_ui/action_builder/http.rb +39 -39
  21. data/app/helpers/glib/json_ui/action_builder/sheets.rb +15 -15
  22. data/app/helpers/glib/json_ui/action_builder/snackbars.rb +41 -41
  23. data/app/helpers/glib/json_ui/action_builder/windows.rb +26 -26
  24. data/app/helpers/glib/json_ui/analytics_helper.rb +17 -17
  25. data/app/helpers/glib/json_ui/dynamic_field_builders.rb +25 -25
  26. data/app/helpers/glib/json_ui/generic_builders.rb +28 -28
  27. data/app/helpers/glib/json_ui/list_builders.rb +104 -104
  28. data/app/helpers/glib/json_ui/menu_builder.rb +94 -94
  29. data/app/helpers/glib/json_ui/page_helper.rb +213 -213
  30. data/app/helpers/glib/json_ui/response_helper.rb +25 -25
  31. data/app/helpers/glib/json_ui/split_builders.rb +32 -32
  32. data/app/helpers/glib/json_ui/styling_helper.rb +47 -47
  33. data/app/helpers/glib/json_ui/table_builders.rb +74 -74
  34. data/app/helpers/glib/json_ui/view_builder.rb +208 -208
  35. data/app/helpers/glib/json_ui/view_builder/banners.rb +24 -24
  36. data/app/helpers/glib/json_ui/view_builder/charts.rb +33 -33
  37. data/app/helpers/glib/json_ui/view_builder/fields.rb +235 -235
  38. data/app/helpers/glib/json_ui/view_builder/panels.rb +250 -250
  39. data/app/helpers/glib/urls_helper.rb +7 -7
  40. data/app/models/glib/active_storage/attachment.rb +9 -9
  41. data/app/models/glib/active_storage/blob.rb +9 -9
  42. data/app/models/glib/application_record.rb +18 -18
  43. data/app/models/glib/dynamic_text_record.rb +9 -9
  44. data/app/models/glib/text.rb +95 -95
  45. data/app/policies/glib/application_policy.rb +161 -161
  46. data/app/validators/email_typo_validator.rb +38 -38
  47. data/app/validators/email_validator.rb +7 -7
  48. data/app/validators/url_validator.rb +20 -20
  49. data/app/views/json_ui/garage/_nav_menu.json.jbuilder +70 -70
  50. data/app/views/json_ui/garage/actions/_dialogs.json.jbuilder +104 -104
  51. data/app/views/json_ui/garage/actions/_http.json.jbuilder +24 -24
  52. data/app/views/json_ui/garage/actions/_reload.json.jbuilder +17 -17
  53. data/app/views/json_ui/garage/actions/_sheets.json.jbuilder +18 -18
  54. data/app/views/json_ui/garage/actions/_snackbars.json.jbuilder +33 -33
  55. data/app/views/json_ui/garage/actions/_timeouts.json.jbuilder +18 -18
  56. data/app/views/json_ui/garage/actions/_windows.json.jbuilder +24 -24
  57. data/app/views/json_ui/garage/actions/dialogs_oauth_post.json.jbuilder +6 -6
  58. data/app/views/json_ui/garage/actions/index.json.jbuilder +22 -22
  59. data/app/views/json_ui/garage/forms/_alert_post_data.json.jbuilder +6 -6
  60. data/app/views/json_ui/garage/forms/basic.json.jbuilder +21 -21
  61. data/app/views/json_ui/garage/forms/basic_post.json.jbuilder +8 -8
  62. data/app/views/json_ui/garage/forms/checkboxes.json.jbuilder +43 -43
  63. data/app/views/json_ui/garage/forms/conditional_value.json.jbuilder +36 -36
  64. data/app/views/json_ui/garage/forms/dynamic_group.json.jbuilder +56 -56
  65. data/app/views/json_ui/garage/forms/dynamic_select.json.jbuilder +25 -25
  66. data/app/views/json_ui/garage/forms/dynamic_select_data.json.jbuilder +38 -38
  67. data/app/views/json_ui/garage/forms/file_upload.json.jbuilder +65 -65
  68. data/app/views/json_ui/garage/forms/floating_submit.json.jbuilder +31 -31
  69. data/app/views/json_ui/garage/forms/generic_post.json.jbuilder +3 -3
  70. data/app/views/json_ui/garage/forms/get_request.json.jbuilder +28 -28
  71. data/app/views/json_ui/garage/forms/index.json.jbuilder +110 -110
  72. data/app/views/json_ui/garage/forms/new_rich_text.json.jbuilder +40 -40
  73. data/app/views/json_ui/garage/forms/pickers.json.jbuilder +48 -48
  74. data/app/views/json_ui/garage/forms/rich_text.json.jbuilder +40 -40
  75. data/app/views/json_ui/garage/forms/selects.json.jbuilder +70 -70
  76. data/app/views/json_ui/garage/forms/show_hide.json.jbuilder +105 -105
  77. data/app/views/json_ui/garage/forms/styled_boxes.json.jbuilder +36 -36
  78. data/app/views/json_ui/garage/forms/submission_flow.json.jbuilder +17 -17
  79. data/app/views/json_ui/garage/forms/submission_flow_post.json.jbuilder +24 -24
  80. data/app/views/json_ui/garage/forms/submission_indicator.json.jbuilder +63 -63
  81. data/app/views/json_ui/garage/forms/submission_indicator_post.json.jbuilder +25 -25
  82. data/app/views/json_ui/garage/forms/text_validation.json.jbuilder +22 -22
  83. data/app/views/json_ui/garage/home/blank.json.jbuilder +11 -11
  84. data/app/views/json_ui/garage/home/index.json.jbuilder +32 -32
  85. data/app/views/json_ui/garage/home/slow.json.jbuilder +11 -11
  86. data/app/views/json_ui/garage/lists/_autoload_section.json.jbuilder +28 -28
  87. data/app/views/json_ui/garage/lists/autoload_all.json.jbuilder +32 -32
  88. data/app/views/json_ui/garage/lists/autoload_as_needed.json.jbuilder +35 -35
  89. data/app/views/json_ui/garage/lists/chat_ui.json.jbuilder +93 -93
  90. data/app/views/json_ui/garage/lists/edit_actions.json.jbuilder +54 -54
  91. data/app/views/json_ui/garage/lists/fab.json.jbuilder +12 -12
  92. data/app/views/json_ui/garage/lists/index.json.jbuilder +32 -32
  93. data/app/views/json_ui/garage/lists/reordering.json.jbuilder +24 -24
  94. data/app/views/json_ui/garage/lists/templating.json.jbuilder +35 -35
  95. data/app/views/json_ui/garage/notifications/android_post.json.jbuilder +48 -48
  96. data/app/views/json_ui/garage/notifications/index.json.jbuilder +32 -32
  97. data/app/views/json_ui/garage/notifications/web_socket.json.jbuilder +60 -60
  98. data/app/views/json_ui/garage/pages/flat_centered.json.jbuilder +29 -29
  99. data/app/views/json_ui/garage/pages/full_width.json.jbuilder +29 -29
  100. data/app/views/json_ui/garage/pages/full_width_height.json.jbuilder +16 -16
  101. data/app/views/json_ui/garage/pages/index.json.jbuilder +58 -58
  102. data/app/views/json_ui/garage/pages/layout.json.jbuilder +18 -18
  103. data/app/views/json_ui/garage/pages/loading_indicator.json.jbuilder +10 -10
  104. data/app/views/json_ui/garage/pages/nav_buttons.json.jbuilder +21 -21
  105. data/app/views/json_ui/garage/pages/nested_scroll.json.jbuilder +40 -40
  106. data/app/views/json_ui/garage/pages/tab_bar.json.jbuilder +27 -27
  107. data/app/views/json_ui/garage/panels/_styled.json.jbuilder +78 -78
  108. data/app/views/json_ui/garage/panels/card.json.jbuilder +4 -4
  109. data/app/views/json_ui/garage/panels/carousel.json.jbuilder +37 -37
  110. data/app/views/json_ui/garage/panels/custom.json.jbuilder +17 -17
  111. data/app/views/json_ui/garage/panels/flow.json.jbuilder +49 -49
  112. data/app/views/json_ui/garage/panels/horizontal.json.jbuilder +91 -91
  113. data/app/views/json_ui/garage/panels/index.json.jbuilder +132 -132
  114. data/app/views/json_ui/garage/panels/outlined.json.jbuilder +4 -4
  115. data/app/views/json_ui/garage/panels/responsive.json.jbuilder +98 -98
  116. data/app/views/json_ui/garage/panels/split.json.jbuilder +182 -182
  117. data/app/views/json_ui/garage/panels/vertical.json.jbuilder +50 -50
  118. data/app/views/json_ui/garage/services/dynamic_text.json.jbuilder +13 -13
  119. data/app/views/json_ui/garage/services/image.json.jbuilder +47 -47
  120. data/app/views/json_ui/garage/services/index.json.jbuilder +17 -17
  121. data/app/views/json_ui/garage/tables/_autoload_section.json.jbuilder +16 -16
  122. data/app/views/json_ui/garage/tables/autoload_all.json.jbuilder +43 -43
  123. data/app/views/json_ui/garage/tables/autoload_as_needed.json.jbuilder +50 -50
  124. data/app/views/json_ui/garage/tables/export_import.json.jbuilder +29 -29
  125. data/app/views/json_ui/garage/tables/horizontal_scroll.json.jbuilder +26 -26
  126. data/app/views/json_ui/garage/tables/index.json.jbuilder +25 -25
  127. data/app/views/json_ui/garage/tables/layout.json.jbuilder +36 -36
  128. data/app/views/json_ui/garage/views/_chart_data.json.jbuilder +17 -17
  129. data/app/views/json_ui/garage/views/banners.json.jbuilder +63 -63
  130. data/app/views/json_ui/garage/views/calendar_data.json.jbuilder +30 -30
  131. data/app/views/json_ui/garage/views/charts.json.jbuilder +115 -115
  132. data/app/views/json_ui/garage/views/icons.json.jbuilder +1450 -1450
  133. data/app/views/json_ui/garage/views/images.json.jbuilder +89 -89
  134. data/app/views/json_ui/garage/views/index.json.jbuilder +54 -54
  135. data/app/views/json_ui/garage/views/links.json.jbuilder +70 -70
  136. data/app/views/json_ui/garage/views/map_cluster_data.json.jbuilder +41 -41
  137. data/app/views/json_ui/garage/views/map_data.json.jbuilder +51 -51
  138. data/app/views/json_ui/garage/views/maps.json.jbuilder +31 -31
  139. data/app/views/json_ui/garage/views/markdowns.json.jbuilder +41 -41
  140. data/app/views/json_ui/garage/views/misc.json.jbuilder +34 -34
  141. data/app/views/json_ui/garage/views/texts.json.jbuilder +41 -41
  142. data/app/views/layouts/json_ui/renderer.html.erb +35 -35
  143. data/config/routes.rb +7 -7
  144. data/lib/generators/glib/install_generator.rb +24 -24
  145. data/lib/generators/templates/20191017062519_create_texts.rb +12 -12
  146. data/lib/generators/templates/20191024063257_add_scope_to_texts.rb +7 -7
  147. data/lib/generators/templates/20191112095018_add_lang_to_texts.rb +7 -7
  148. data/lib/generators/templates/20191126071051_create_active_storage_tables.active_storage.rb +27 -27
  149. data/lib/generators/templates/database.yml +107 -107
  150. data/lib/generators/templates/dynamic_text.rb +2 -2
  151. data/lib/glib-web.rb +9 -9
  152. data/lib/glib/crypt/utils.rb +26 -26
  153. data/lib/glib/dynamic_text/config.rb +21 -21
  154. data/lib/glib/engine.rb +7 -7
  155. data/lib/glib/json_crawler.rb +11 -11
  156. data/lib/glib/json_crawler/action_crawler.rb +23 -23
  157. data/lib/glib/json_crawler/action_crawlers/action_http.rb +11 -11
  158. data/lib/glib/json_crawler/action_crawlers/forms_submit.rb +48 -48
  159. data/lib/glib/json_crawler/action_crawlers/menu.rb +12 -12
  160. data/lib/glib/json_crawler/action_crawlers/nav_initiate.rb +19 -19
  161. data/lib/glib/json_crawler/action_crawlers/run_multiple.rb +13 -13
  162. data/lib/glib/json_crawler/action_crawlers/windows_open.rb +33 -33
  163. data/lib/glib/json_crawler/coverage.rb +20 -20
  164. data/lib/glib/json_crawler/http.rb +120 -120
  165. data/lib/glib/json_crawler/router.rb +96 -96
  166. data/lib/glib/mailer_tester.rb +36 -36
  167. data/lib/glib/test_helpers.rb +40 -40
  168. data/lib/glib/value.rb +7 -7
  169. data/lib/glib/version.rb +5 -5
  170. data/lib/tasks/db.rake +95 -95
  171. metadata +2 -3
@@ -1,55 +1,55 @@
1
- module Glib
2
- module DynamicImagesHelper
3
- # NOTE: The bucket should probably be set as a parameter for json_libs
4
- def glib_dynamic_image_url(blob_key, width: 100, height: 100, fit: 'clip', bucket: Rails.application.config.try(:aws_s3_bucket), signature_key: nil)
5
- return unless blob_key.present?
6
-
7
- full_params_hash = {
8
- bucket_name: bucket,
9
- blob_key: blob_key,
10
- w: width,
11
- h: height,
12
- fit: fit,
13
- # expires: 1.hours.from_now.to_i
14
- expires: 1.month.from_now.end_of_month.to_i
15
- }
16
-
17
- request_params_hash = full_params_hash.except(:bucket_name, :blob_key)
18
-
19
- if (private_key = signature_key)
20
- encryption_service = EncryptionService.new(bucket, private_key)
21
- # This produces different signature every time.
22
- # TODO: Use digest instead, because we really only need to verify. We don't need to be able to decrypt.
23
- signature = encryption_service.encrypt(full_params_hash)
24
- request_params_hash = request_params_hash.merge(signature: signature)
25
- end
26
-
27
- uri = URI::HTTPS.build(
28
- host: 'imageserver-demo.herokuapp.com',
29
- path: "/image/#{bucket}/#{blob_key}",
30
- query: request_params_hash.to_param
31
- )
32
-
33
- uri.to_s
34
- end
35
-
36
- EncryptionService = Struct.new(:salt, :private_key) do
37
- def encrypt(value)
38
- encryptor.encrypt_and_sign(value)
39
- end
40
-
41
- def decrypt(value)
42
- encryptor.decrypt_and_verify(value)
43
- end
44
-
45
- private
46
- def encryptor
47
- @encryptor ||= begin
48
- key_len = ActiveSupport::MessageEncryptor.key_len
49
- key = ActiveSupport::KeyGenerator.new(private_key).generate_key(salt, key_len)
50
- ActiveSupport::MessageEncryptor.new(key)
51
- end
52
- end
53
- end
54
- end
55
- end
1
+ module Glib
2
+ module DynamicImagesHelper
3
+ # NOTE: The bucket should probably be set as a parameter for json_libs
4
+ def glib_dynamic_image_url(blob_key, width: 100, height: 100, fit: 'clip', bucket: Rails.application.config.try(:aws_s3_bucket), signature_key: nil)
5
+ return unless blob_key.present?
6
+
7
+ full_params_hash = {
8
+ bucket_name: bucket,
9
+ blob_key: blob_key,
10
+ w: width,
11
+ h: height,
12
+ fit: fit,
13
+ # expires: 1.hours.from_now.to_i
14
+ expires: 1.month.from_now.end_of_month.to_i
15
+ }
16
+
17
+ request_params_hash = full_params_hash.except(:bucket_name, :blob_key)
18
+
19
+ if (private_key = signature_key)
20
+ encryption_service = EncryptionService.new(bucket, private_key)
21
+ # This produces different signature every time.
22
+ # TODO: Use digest instead, because we really only need to verify. We don't need to be able to decrypt.
23
+ signature = encryption_service.encrypt(full_params_hash)
24
+ request_params_hash = request_params_hash.merge(signature: signature)
25
+ end
26
+
27
+ uri = URI::HTTPS.build(
28
+ host: 'imageserver-demo.herokuapp.com',
29
+ path: "/image/#{bucket}/#{blob_key}",
30
+ query: request_params_hash.to_param
31
+ )
32
+
33
+ uri.to_s
34
+ end
35
+
36
+ EncryptionService = Struct.new(:salt, :private_key) do
37
+ def encrypt(value)
38
+ encryptor.encrypt_and_sign(value)
39
+ end
40
+
41
+ def decrypt(value)
42
+ encryptor.decrypt_and_verify(value)
43
+ end
44
+
45
+ private
46
+ def encryptor
47
+ @encryptor ||= begin
48
+ key_len = ActiveSupport::MessageEncryptor.key_len
49
+ key = ActiveSupport::KeyGenerator.new(private_key).generate_key(salt, key_len)
50
+ ActiveSupport::MessageEncryptor.new(key)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,42 +1,42 @@
1
- module Glib
2
- module DynamicTextsHelper
3
- def dt(key, default_value = '', **args)
4
- new_key = key
5
- options = {
6
- scope: args.fetch(:scope, 'itinerarybuilder'),
7
- lang: args.fetch(:lang, 'en')
8
- }
9
-
10
- if key.starts_with?('.')
11
- new_key = "#{controller_name}.#{action_name}#{key}"
12
- end
13
-
14
- content, text_object = Glib::Text.get_content(new_key, default_value, options: options)
15
- content = content.gsub(/\{\{(\w+)\}\}/) { args.fetch($1.to_sym, "{{#{$1}}}") }
16
-
17
- if text_object.images.attached?
18
- content = content.gsub(/\{\{image(\d)\}\}/) {
19
- if image = text_object.images[$1.to_i - 1]
20
- glib_dynamic_image_url(image.blob.key)
21
- else
22
- "{{image#{$1}}}"
23
- end
24
- }
25
- end
26
-
27
- content
28
- end
29
-
30
- def dt_json(key, default_value = '', **args)
31
- new_key = key
32
-
33
- if key.starts_with?('.')
34
- new_key = "#{controller_name}.#{action_name}#{key}"
35
- end
36
-
37
- {
38
- dt_key: new_key
39
- }.merge(args)
40
- end
41
- end
42
- end
1
+ module Glib
2
+ module DynamicTextsHelper
3
+ def dt(key, default_value = '', **args)
4
+ new_key = key
5
+ options = {
6
+ scope: args.fetch(:scope, 'itinerarybuilder'),
7
+ lang: args.fetch(:lang, 'en')
8
+ }
9
+
10
+ if key.starts_with?('.')
11
+ new_key = "#{controller_name}.#{action_name}#{key}"
12
+ end
13
+
14
+ content, text_object = Glib::Text.get_content(new_key, default_value, options: options)
15
+ content = content.gsub(/\{\{(\w+)\}\}/) { args.fetch($1.to_sym, "{{#{$1}}}") }
16
+
17
+ if text_object.images.attached?
18
+ content = content.gsub(/\{\{image(\d)\}\}/) {
19
+ if image = text_object.images[$1.to_i - 1]
20
+ glib_dynamic_image_url(image.blob.key)
21
+ else
22
+ "{{image#{$1}}}"
23
+ end
24
+ }
25
+ end
26
+
27
+ content
28
+ end
29
+
30
+ def dt_json(key, default_value = '', **args)
31
+ new_key = key
32
+
33
+ if key.starts_with?('.')
34
+ new_key = "#{controller_name}.#{action_name}#{key}"
35
+ end
36
+
37
+ {
38
+ dt_key: new_key
39
+ }.merge(args)
40
+ end
41
+ end
42
+ end
@@ -1,8 +1,8 @@
1
- module Glib
2
- module EnumHelper
3
- def glib_enum_options(clazz, enum_field, keys = nil)
4
- keys ||= clazz.send("#{enum_field}s").keys
5
- keys.map { |i| { text: clazz.glib_enum_humanize(enum_field, i), value: i } }
6
- end
7
- end
8
- end
1
+ module Glib
2
+ module EnumHelper
3
+ def glib_enum_options(clazz, enum_field, keys = nil)
4
+ keys ||= clazz.send("#{enum_field}s").keys
5
+ keys.map { |i| { text: clazz.glib_enum_humanize(enum_field, i), value: i } }
6
+ end
7
+ end
8
+ end
@@ -1,15 +1,15 @@
1
- module Glib
2
- module FormsHelper
3
- def glib_form_field_label(model_name, prop, args = {})
4
- I18n.t("dt_models.#{model_name}.#{prop}.label", args.merge(default: nil)) || I18n.t("activerecord.attributes.#{model_name}.#{prop}", args)
5
- end
6
-
7
- def glib_form_hint_label(model_name, prop, args = {})
8
- I18n.t("dt_models.#{model_name}.#{prop}.hint", args.merge(default: nil))
9
- end
10
-
11
- def glib_form_placeholder_label(model_name, prop, args = {})
12
- I18n.t("dt_models.#{model_name}.#{prop}.placeholder", args.merge(default: nil))
13
- end
14
- end
15
- end
1
+ module Glib
2
+ module FormsHelper
3
+ def glib_form_field_label(model_name, prop, args = {})
4
+ I18n.t("dt_models.#{model_name}.#{prop}.label", args.merge(default: nil)) || I18n.t("activerecord.attributes.#{model_name}.#{prop}", args)
5
+ end
6
+
7
+ def glib_form_hint_label(model_name, prop, args = {})
8
+ I18n.t("dt_models.#{model_name}.#{prop}.hint", args.merge(default: nil))
9
+ end
10
+
11
+ def glib_form_placeholder_label(model_name, prop, args = {})
12
+ I18n.t("dt_models.#{model_name}.#{prop}.placeholder", args.merge(default: nil))
13
+ end
14
+ end
15
+ end
@@ -1,294 +1,294 @@
1
- module Glib
2
- module JsonUi
3
- class AbstractBuilder
4
- attr_reader :json, :page
5
-
6
- def initialize(json, page)
7
- @json = json
8
- @page = page
9
- end
10
-
11
- private
12
- def capitalize_first_letter_and_leave_others_alone(str)
13
- str.slice(0, 1).capitalize + str.slice(1..-1)
14
- end
15
-
16
- def add_singleton_element(type, name, *args)
17
- name_components = name.to_s.split('_')
18
- json.set! type, "#{name_components.join('/')}" if type
19
- args = [yield] if block_given?
20
-
21
- # TODO: consider caching these instances
22
- "#{self.class.name}::#{name_components.map { |str| capitalize_first_letter_and_leave_others_alone(str) }.join('::')}".constantize.new(json, @page).props(*args)
23
- end
24
-
25
- def add_element_to_array(type, name, *args)
26
- json.child! do
27
- add_singleton_element type, name, *args
28
- end
29
- end
30
-
31
- # TODO: Consider removing this in favour of non 'v1' suffix
32
- def add_singleton_element_v1(type, name, *args)
33
- name_components = name.to_s.split('_')
34
- json.set! type, "#{name_components.join('/')}-v1" if type
35
- args = [yield] if block_given?
36
- "#{self.class.name}::#{name_components.map { |str| capitalize_first_letter_and_leave_others_alone(str) }.join('::')}".constantize.new(json, @page).props(*args)
37
- end
38
-
39
- # TODO: Consider removing this in favour of non 'v1' suffix
40
- def add_element_to_array_v1(type, name, *args)
41
- json.child! do
42
- add_singleton_element_v1 type, name, *args
43
- end
44
- end
45
-
46
- end
47
-
48
- class JsonUiElement
49
- attr_reader :json, :page
50
-
51
- def initialize(json, page)
52
- @json = json
53
- @page = page
54
- end
55
-
56
- def props(args = {})
57
- @args = args
58
-
59
- if args.is_a? Hash
60
- args.each do |k, v|
61
- send(k, v)
62
- end
63
- else
64
- raise "Invalid properties: #{args}"
65
- end
66
-
67
- created
68
- end
69
-
70
- private
71
- def self.any(propName)
72
- define_method(propName) do |value|
73
- json.set! propName, value
74
- end
75
- end
76
-
77
- def self.date(propName)
78
- define_method(propName) do |value|
79
- json.set! propName, value&.to_date
80
-
81
- # if (value = value&.to_s)
82
- # if !Rails.env.production?
83
- # raise "Invalid date for #{propName}: #{value}" unless value =~ /^\d{4}-\d{2}-\d{2}$/
84
- # end
85
-
86
- # json.set! propName, value
87
- # end
88
- end
89
- end
90
-
91
- def self.date_time(propName)
92
- define_method(propName) do |value|
93
- json.set! propName, value&.to_datetime
94
-
95
- # if (value = value&.to_s)
96
- # if !Rails.env.production?
97
- # try Date.parse(value) rescue raise "Invalid date: #{value}"
98
- # end
99
-
100
- # json.set! propName, value
101
- # end
102
- end
103
- end
104
-
105
- def self.color(propName)
106
- define_method(propName) do |value|
107
- if (value = value&.to_s)
108
- if !Rails.env.production?
109
- if !value.match /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/i
110
- raise "Invalid color: #{value}"
111
- end
112
- end
113
-
114
- json.set! propName, value
115
- end
116
- end
117
- end
118
-
119
- def self.length(propName)
120
- define_method(propName) do |value|
121
- if value
122
- if !Rails.env.production?
123
- case value
124
- when 'matchParent'
125
- when 'wrapContent'
126
- else
127
- if !value.is_a? Integer
128
- raise "Invalid length: #{value}"
129
- end
130
- end
131
- end
132
-
133
- json.set! propName, value
134
- end
135
- end
136
- end
137
-
138
- def self.string(propName, options = {})
139
- define_method(propName) do |value|
140
- str = value&.to_s
141
- instance_variable_set("@#{propName}", str) if options[:cache]
142
- json.set! propName, str
143
- end
144
- end
145
-
146
- # Support either string or dynamic_text hash
147
- def self.text(propName, options = {})
148
- define_method(propName) do |value|
149
- if value.is_a?(Hash)
150
- json.set! propName, value
151
- else
152
- json.set! propName, value&.to_s
153
- end
154
- end
155
- end
156
-
157
- def self.int(propName)
158
- define_method(propName) do |value|
159
- json.set! propName, value&.to_i
160
- end
161
- end
162
-
163
- def self.float(propName)
164
- define_method(propName) do |value|
165
- json.set! propName, value&.to_f
166
- end
167
- end
168
-
169
- def self.bool(propName, options = {})
170
- define_method(propName) do |value|
171
- bool = value == true
172
- instance_variable_set("@#{propName}", bool) if options[:cache]
173
- json.set! propName, bool
174
- end
175
- end
176
-
177
- def self.icon(propName, options = {})
178
- define_method(propName) do |value|
179
-
180
- if value.is_a?(Hash)
181
- data = value
182
- name = data[:name]
183
- else
184
- data = {}
185
- name = value
186
- # data = { material: { name: value } }
187
-
188
- # name = value
189
-
190
- # TODO: deprecated
191
- # json.set!(propName) do
192
- # json.name name
193
- # end
194
- end
195
-
196
- json.set!(propName) do
197
- if name
198
- data[:material] ||= {}
199
- data[:material][:name] = name
200
- end
201
-
202
- if (material = data[:material])
203
- json.material do
204
- json.name material[:name]
205
- json.size material[:size] if material[:size]
206
- end
207
- end
208
-
209
- if (fa = data[:fa])
210
- json.fa do
211
- json.name fa[:name]
212
- json.size fa[:size] if fa[:size]
213
- end
214
- end
215
-
216
- if (custom = data[:custom])
217
- json.custom do
218
- json.name custom[:name]
219
- json.size custom[:size] if custom[:size]
220
- end
221
- end
222
-
223
- if (badge = data[:badge])
224
- if badge.is_a?(Hash)
225
- json.badge badge
226
- else
227
- json.badge do
228
- json.text badge
229
- end
230
- end
231
- end
232
-
233
- end
234
-
235
- # raise "Invalid properties: #{options.keys}" if options.size > 0
236
-
237
- # instance_variable_set("@#{propName}", name) if options[:cache]
238
-
239
- end
240
- end
241
-
242
- def self.action(propName)
243
- define_method(propName) do |value|
244
- json.set!(propName) { value.call(page.action_builder) }
245
- end
246
- end
247
-
248
- def self.views(propName)
249
- define_method(propName) do |value|
250
- json.set!(propName) { value.call(page.view_builder) }
251
- end
252
- end
253
-
254
- def self.array(propName)
255
- define_method(propName) do |value|
256
- json.set! propName, value&.to_a
257
- end
258
- end
259
-
260
- def self.hash(propName)
261
- define_method(propName) do |value|
262
- json.set! propName, value
263
- end
264
- end
265
-
266
- def self.menu(propName)
267
- define_method(propName) do |value|
268
- json.set! propName do
269
- value.call(page.menu_builder)
270
- end
271
- end
272
- end
273
-
274
- def self.singleton_array(singletonName, arrayName)
275
- array arrayName
276
-
277
- define_method(singletonName) do |value|
278
- json.set! arrayName, [value]
279
- end
280
- end
281
-
282
- def self.panels_builder(propName, *panelNames)
283
- define_method(propName) do |value|
284
- value.call(page.content_builder(panelNames))
285
- end
286
- end
287
-
288
- def created
289
- # To be overridden
290
- end
291
-
292
- end
293
- end
294
- end
1
+ module Glib
2
+ module JsonUi
3
+ class AbstractBuilder
4
+ attr_reader :json, :page
5
+
6
+ def initialize(json, page)
7
+ @json = json
8
+ @page = page
9
+ end
10
+
11
+ private
12
+ def capitalize_first_letter_and_leave_others_alone(str)
13
+ str.slice(0, 1).capitalize + str.slice(1..-1)
14
+ end
15
+
16
+ def add_singleton_element(type, name, *args)
17
+ name_components = name.to_s.split('_')
18
+ json.set! type, "#{name_components.join('/')}" if type
19
+ args = [yield] if block_given?
20
+
21
+ # TODO: consider caching these instances
22
+ "#{self.class.name}::#{name_components.map { |str| capitalize_first_letter_and_leave_others_alone(str) }.join('::')}".constantize.new(json, @page).props(*args)
23
+ end
24
+
25
+ def add_element_to_array(type, name, *args)
26
+ json.child! do
27
+ add_singleton_element type, name, *args
28
+ end
29
+ end
30
+
31
+ # TODO: Consider removing this in favour of non 'v1' suffix
32
+ def add_singleton_element_v1(type, name, *args)
33
+ name_components = name.to_s.split('_')
34
+ json.set! type, "#{name_components.join('/')}-v1" if type
35
+ args = [yield] if block_given?
36
+ "#{self.class.name}::#{name_components.map { |str| capitalize_first_letter_and_leave_others_alone(str) }.join('::')}".constantize.new(json, @page).props(*args)
37
+ end
38
+
39
+ # TODO: Consider removing this in favour of non 'v1' suffix
40
+ def add_element_to_array_v1(type, name, *args)
41
+ json.child! do
42
+ add_singleton_element_v1 type, name, *args
43
+ end
44
+ end
45
+
46
+ end
47
+
48
+ class JsonUiElement
49
+ attr_reader :json, :page
50
+
51
+ def initialize(json, page)
52
+ @json = json
53
+ @page = page
54
+ end
55
+
56
+ def props(args = {})
57
+ @args = args
58
+
59
+ if args.is_a? Hash
60
+ args.each do |k, v|
61
+ send(k, v)
62
+ end
63
+ else
64
+ raise "Invalid properties: #{args}"
65
+ end
66
+
67
+ created
68
+ end
69
+
70
+ private
71
+ def self.any(propName)
72
+ define_method(propName) do |value|
73
+ json.set! propName, value
74
+ end
75
+ end
76
+
77
+ def self.date(propName)
78
+ define_method(propName) do |value|
79
+ json.set! propName, value&.to_date
80
+
81
+ # if (value = value&.to_s)
82
+ # if !Rails.env.production?
83
+ # raise "Invalid date for #{propName}: #{value}" unless value =~ /^\d{4}-\d{2}-\d{2}$/
84
+ # end
85
+
86
+ # json.set! propName, value
87
+ # end
88
+ end
89
+ end
90
+
91
+ def self.date_time(propName)
92
+ define_method(propName) do |value|
93
+ json.set! propName, value&.to_datetime
94
+
95
+ # if (value = value&.to_s)
96
+ # if !Rails.env.production?
97
+ # try Date.parse(value) rescue raise "Invalid date: #{value}"
98
+ # end
99
+
100
+ # json.set! propName, value
101
+ # end
102
+ end
103
+ end
104
+
105
+ def self.color(propName)
106
+ define_method(propName) do |value|
107
+ if (value = value&.to_s)
108
+ if !Rails.env.production?
109
+ if !value.match /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/i
110
+ raise "Invalid color: #{value}"
111
+ end
112
+ end
113
+
114
+ json.set! propName, value
115
+ end
116
+ end
117
+ end
118
+
119
+ def self.length(propName)
120
+ define_method(propName) do |value|
121
+ if value
122
+ if !Rails.env.production?
123
+ case value
124
+ when 'matchParent'
125
+ when 'wrapContent'
126
+ else
127
+ if !value.is_a? Integer
128
+ raise "Invalid length: #{value}"
129
+ end
130
+ end
131
+ end
132
+
133
+ json.set! propName, value
134
+ end
135
+ end
136
+ end
137
+
138
+ def self.string(propName, options = {})
139
+ define_method(propName) do |value|
140
+ str = value&.to_s
141
+ instance_variable_set("@#{propName}", str) if options[:cache]
142
+ json.set! propName, str
143
+ end
144
+ end
145
+
146
+ # Support either string or dynamic_text hash
147
+ def self.text(propName, options = {})
148
+ define_method(propName) do |value|
149
+ if value.is_a?(Hash)
150
+ json.set! propName, value
151
+ else
152
+ json.set! propName, value&.to_s
153
+ end
154
+ end
155
+ end
156
+
157
+ def self.int(propName)
158
+ define_method(propName) do |value|
159
+ json.set! propName, value&.to_i
160
+ end
161
+ end
162
+
163
+ def self.float(propName)
164
+ define_method(propName) do |value|
165
+ json.set! propName, value&.to_f
166
+ end
167
+ end
168
+
169
+ def self.bool(propName, options = {})
170
+ define_method(propName) do |value|
171
+ bool = value == true
172
+ instance_variable_set("@#{propName}", bool) if options[:cache]
173
+ json.set! propName, bool
174
+ end
175
+ end
176
+
177
+ def self.icon(propName, options = {})
178
+ define_method(propName) do |value|
179
+
180
+ if value.is_a?(Hash)
181
+ data = value
182
+ name = data[:name]
183
+ else
184
+ data = {}
185
+ name = value
186
+ # data = { material: { name: value } }
187
+
188
+ # name = value
189
+
190
+ # TODO: deprecated
191
+ # json.set!(propName) do
192
+ # json.name name
193
+ # end
194
+ end
195
+
196
+ json.set!(propName) do
197
+ if name
198
+ data[:material] ||= {}
199
+ data[:material][:name] = name
200
+ end
201
+
202
+ if (material = data[:material])
203
+ json.material do
204
+ json.name material[:name]
205
+ json.size material[:size] if material[:size]
206
+ end
207
+ end
208
+
209
+ if (fa = data[:fa])
210
+ json.fa do
211
+ json.name fa[:name]
212
+ json.size fa[:size] if fa[:size]
213
+ end
214
+ end
215
+
216
+ if (custom = data[:custom])
217
+ json.custom do
218
+ json.name custom[:name]
219
+ json.size custom[:size] if custom[:size]
220
+ end
221
+ end
222
+
223
+ if (badge = data[:badge])
224
+ if badge.is_a?(Hash)
225
+ json.badge badge
226
+ else
227
+ json.badge do
228
+ json.text badge
229
+ end
230
+ end
231
+ end
232
+
233
+ end
234
+
235
+ # raise "Invalid properties: #{options.keys}" if options.size > 0
236
+
237
+ # instance_variable_set("@#{propName}", name) if options[:cache]
238
+
239
+ end
240
+ end
241
+
242
+ def self.action(propName)
243
+ define_method(propName) do |value|
244
+ json.set!(propName) { value.call(page.action_builder) }
245
+ end
246
+ end
247
+
248
+ def self.views(propName)
249
+ define_method(propName) do |value|
250
+ json.set!(propName) { value.call(page.view_builder) }
251
+ end
252
+ end
253
+
254
+ def self.array(propName)
255
+ define_method(propName) do |value|
256
+ json.set! propName, value&.to_a
257
+ end
258
+ end
259
+
260
+ def self.hash(propName)
261
+ define_method(propName) do |value|
262
+ json.set! propName, value
263
+ end
264
+ end
265
+
266
+ def self.menu(propName)
267
+ define_method(propName) do |value|
268
+ json.set! propName do
269
+ value.call(page.menu_builder)
270
+ end
271
+ end
272
+ end
273
+
274
+ def self.singleton_array(singletonName, arrayName)
275
+ array arrayName
276
+
277
+ define_method(singletonName) do |value|
278
+ json.set! arrayName, [value]
279
+ end
280
+ end
281
+
282
+ def self.panels_builder(propName, *panelNames)
283
+ define_method(propName) do |value|
284
+ value.call(page.content_builder(panelNames))
285
+ end
286
+ end
287
+
288
+ def created
289
+ # To be overridden
290
+ end
291
+
292
+ end
293
+ end
294
+ end