habarico 7.2.0.pre.beta.5

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 (221) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +82 -0
  4. data/Rakefile +15 -0
  5. data/VERSION +1 -0
  6. data/app/controllers/habarico/action_schema_controller.rb +41 -0
  7. data/app/controllers/habarico/application_controller.rb +15 -0
  8. data/app/controllers/habarico/contrib/preferences/user_preferences_controller.rb +105 -0
  9. data/app/controllers/habarico/global_schema_controller.rb +11 -0
  10. data/app/controllers/habarico/local_schema_controller.rb +35 -0
  11. data/app/helpers/habarico/application_helper.rb +4 -0
  12. data/app/models/habarico/application_record.rb +5 -0
  13. data/app/views/layouts/habarico/application.html.erb +17 -0
  14. data/config/locales/cs.yml +39 -0
  15. data/config/locales/de.yml +39 -0
  16. data/config/locales/en.yml +39 -0
  17. data/config/locales/es.yml +39 -0
  18. data/config/locales/fr.yml +39 -0
  19. data/config/locales/it.yml +39 -0
  20. data/config/locales/ja.yml +39 -0
  21. data/config/locales/nl.yml +39 -0
  22. data/config/locales/pl.yml +39 -0
  23. data/config/locales/pt.yml +39 -0
  24. data/config/locales/ro.yml +39 -0
  25. data/config/locales/sk.yml +39 -0
  26. data/config/locales/uk.yml +39 -0
  27. data/config/routes.rb +1 -0
  28. data/lib/generators/habarico/preferences/install_generator.rb +27 -0
  29. data/lib/generators/habarico/preferences/templates/create_habarico_user_preferences.rb.tt +15 -0
  30. data/lib/habarico/active_model/references.rb +68 -0
  31. data/lib/habarico/authenticatable.rb +31 -0
  32. data/lib/habarico/config.rb +71 -0
  33. data/lib/habarico/context.rb +126 -0
  34. data/lib/habarico/contrib/preferences/base_preferences.rb +40 -0
  35. data/lib/habarico/contrib/preferences/config.rb +31 -0
  36. data/lib/habarico/contrib/preferences/errors.rb +79 -0
  37. data/lib/habarico/contrib/preferences/locales/cs.yml +8 -0
  38. data/lib/habarico/contrib/preferences/locales/de.yml +8 -0
  39. data/lib/habarico/contrib/preferences/locales/en.yml +8 -0
  40. data/lib/habarico/contrib/preferences/locales/es.yml +8 -0
  41. data/lib/habarico/contrib/preferences/locales/fr.yml +8 -0
  42. data/lib/habarico/contrib/preferences/locales/it.yml +8 -0
  43. data/lib/habarico/contrib/preferences/locales/ja.yml +8 -0
  44. data/lib/habarico/contrib/preferences/locales/nl.yml +8 -0
  45. data/lib/habarico/contrib/preferences/locales/pl.yml +8 -0
  46. data/lib/habarico/contrib/preferences/locales/pt.yml +8 -0
  47. data/lib/habarico/contrib/preferences/locales/ro.yml +8 -0
  48. data/lib/habarico/contrib/preferences/locales/sk.yml +8 -0
  49. data/lib/habarico/contrib/preferences/locales/uk.yml +8 -0
  50. data/lib/habarico/contrib/preferences/registry.rb +293 -0
  51. data/lib/habarico/contrib/preferences/routes.rb +17 -0
  52. data/lib/habarico/contrib/preferences/schemas.rb +129 -0
  53. data/lib/habarico/contrib/preferences/serializer.rb +19 -0
  54. data/lib/habarico/contrib/preferences/user_preference.rb +16 -0
  55. data/lib/habarico/contrib/preferences.rb +32 -0
  56. data/lib/habarico/controller.rb +584 -0
  57. data/lib/habarico/definition/action_reference.rb +18 -0
  58. data/lib/habarico/definition/actions/action.rb +14 -0
  59. data/lib/habarico/definition/actions/create_action.rb +18 -0
  60. data/lib/habarico/definition/actions/delete_action.rb +20 -0
  61. data/lib/habarico/definition/actions/edit_action.rb +18 -0
  62. data/lib/habarico/definition/actions/link_action.rb +11 -0
  63. data/lib/habarico/definition/actions/resource_action.rb +12 -0
  64. data/lib/habarico/definition/actions/save_action.rb +14 -0
  65. data/lib/habarico/definition/actions/show_action.rb +18 -0
  66. data/lib/habarico/definition/actions/upload_images_action.rb +11 -0
  67. data/lib/habarico/definition/actions/view_action.rb +11 -0
  68. data/lib/habarico/definition/boxes/array_box.rb +10 -0
  69. data/lib/habarico/definition/boxes/box.rb +32 -0
  70. data/lib/habarico/definition/boxes/gallery_box.rb +10 -0
  71. data/lib/habarico/definition/boxes/grid_box.rb +10 -0
  72. data/lib/habarico/definition/boxes/grid_item_box.rb +10 -0
  73. data/lib/habarico/definition/boxes/list_box.rb +10 -0
  74. data/lib/habarico/definition/boxes/object_box.rb +10 -0
  75. data/lib/habarico/definition/boxes/tab_box.rb +10 -0
  76. data/lib/habarico/definition/boxes/tab_item_box.rb +10 -0
  77. data/lib/habarico/definition/boxes/wizard_box.rb +10 -0
  78. data/lib/habarico/definition/concerns/definition_model.rb +38 -0
  79. data/lib/habarico/definition/definition.rb +206 -0
  80. data/lib/habarico/definition/field_reference.rb +9 -0
  81. data/lib/habarico/definition/filter_reference.rb +7 -0
  82. data/lib/habarico/definition/menu/link_menu_item.rb +12 -0
  83. data/lib/habarico/definition/menu/menu_item.rb +9 -0
  84. data/lib/habarico/definition/menu/text_menu_item.rb +12 -0
  85. data/lib/habarico/definition/menu/view_menu_item.rb +13 -0
  86. data/lib/habarico/definition/response.rb +13 -0
  87. data/lib/habarico/definition/views/action_view.rb +11 -0
  88. data/lib/habarico/definition/views/create_view.rb +15 -0
  89. data/lib/habarico/definition/views/edit_view.rb +15 -0
  90. data/lib/habarico/definition/views/list_view.rb +17 -0
  91. data/lib/habarico/definition/views/show_view.rb +15 -0
  92. data/lib/habarico/definition/views/view.rb +10 -0
  93. data/lib/habarico/engine.rb +6 -0
  94. data/lib/habarico/file_validations.rb +119 -0
  95. data/lib/habarico/generators/abstract_generator.rb +21 -0
  96. data/lib/habarico/generators/action/action_schema_generator.rb +111 -0
  97. data/lib/habarico/generators/action/confirm_dialog_properties_generator.rb +30 -0
  98. data/lib/habarico/generators/action/global_resource_action_schema_generator.rb +46 -0
  99. data/lib/habarico/generators/action/link_action_parameters_generator.rb +31 -0
  100. data/lib/habarico/generators/action/resource_action_endpoint_parameters_generator.rb +70 -0
  101. data/lib/habarico/generators/action/resource_action_parameters_generator.rb +40 -0
  102. data/lib/habarico/generators/action/resource_action_schema_generator.rb +51 -0
  103. data/lib/habarico/generators/action/save_action_parameters_generator.rb +26 -0
  104. data/lib/habarico/generators/action/upload_images_action_parameters_generator.rb +41 -0
  105. data/lib/habarico/generators/action/view_action_endpoint_parameters_generator.rb +37 -0
  106. data/lib/habarico/generators/action/view_action_parameters_generator.rb +56 -0
  107. data/lib/habarico/generators/endpoint/dynamic_render_options_generator.rb +26 -0
  108. data/lib/habarico/generators/endpoint/endpoints_schema_generator.rb +61 -0
  109. data/lib/habarico/generators/endpoint/enum_type_generator.rb +45 -0
  110. data/lib/habarico/generators/endpoint/field_options_generator.rb +179 -0
  111. data/lib/habarico/generators/endpoint/field_schema_generator.rb +381 -0
  112. data/lib/habarico/generators/endpoint/fields_schema_generator.rb +35 -0
  113. data/lib/habarico/generators/endpoint/filter_schema_generator.rb +201 -0
  114. data/lib/habarico/generators/endpoint/filters_schema_generator.rb +25 -0
  115. data/lib/habarico/generators/endpoint/method_schema_generator.rb +34 -0
  116. data/lib/habarico/generators/endpoint/number_field_options_generator.rb +45 -0
  117. data/lib/habarico/generators/endpoint/phone_field_options_generator.rb +29 -0
  118. data/lib/habarico/generators/endpoint/relation_field_options_generator.rb +90 -0
  119. data/lib/habarico/generators/endpoint/search_filter_schema_generator.rb +44 -0
  120. data/lib/habarico/generators/menu/menu_group_schema_generator.rb +63 -0
  121. data/lib/habarico/generators/menu/menu_link_parameters_generator.rb +31 -0
  122. data/lib/habarico/generators/menu/menu_schema_generator.rb +105 -0
  123. data/lib/habarico/generators/menu/menu_view_endpoint_parameters_generator.rb +44 -0
  124. data/lib/habarico/generators/menu/menu_view_parameters_generator.rb +50 -0
  125. data/lib/habarico/generators/resource/action_resource_schema_generator.rb +84 -0
  126. data/lib/habarico/generators/resource/global_resource_schema_generator.rb +70 -0
  127. data/lib/habarico/generators/resource/local_resource_schema_generator.rb +111 -0
  128. data/lib/habarico/generators/resource/object_resource_schema_generator.rb +49 -0
  129. data/lib/habarico/generators/resource/resource_schema_generator.rb +31 -0
  130. data/lib/habarico/generators/view/action_descriptor_generator.rb +88 -0
  131. data/lib/habarico/generators/view/array_box_parameters_generator.rb +34 -0
  132. data/lib/habarico/generators/view/box_options_generator.rb +23 -0
  133. data/lib/habarico/generators/view/box_schema_generator.rb +194 -0
  134. data/lib/habarico/generators/view/detail_view_parameters_generator.rb +57 -0
  135. data/lib/habarico/generators/view/field_descriptor_generator.rb +107 -0
  136. data/lib/habarico/generators/view/filter_descriptor_generator.rb +75 -0
  137. data/lib/habarico/generators/view/gallery_box_parameters_generator.rb +71 -0
  138. data/lib/habarico/generators/view/global_view_schema_generator.rb +59 -0
  139. data/lib/habarico/generators/view/grid_item_box_parameters_generator.rb +44 -0
  140. data/lib/habarico/generators/view/list_box_parameters_generator.rb +124 -0
  141. data/lib/habarico/generators/view/list_view_parameters_generator.rb +120 -0
  142. data/lib/habarico/generators/view/object_box_parameters_generator.rb +26 -0
  143. data/lib/habarico/generators/view/sort_descriptor_generator.rb +30 -0
  144. data/lib/habarico/generators/view/tab_box_parameters_generator.rb +26 -0
  145. data/lib/habarico/generators/view/view_endpoint_parameters_generator.rb +71 -0
  146. data/lib/habarico/generators/view/view_schema_generator.rb +87 -0
  147. data/lib/habarico/generators/view/wizard_box_parameters_generator.rb +32 -0
  148. data/lib/habarico/helpers/action_helper.rb +9 -0
  149. data/lib/habarico/helpers/attributes_helper.rb +67 -0
  150. data/lib/habarico/helpers/box_helper.rb +19 -0
  151. data/lib/habarico/helpers/callable_helper.rb +15 -0
  152. data/lib/habarico/helpers/filter_params_helper.rb +49 -0
  153. data/lib/habarico/helpers/order_by_helper.rb +56 -0
  154. data/lib/habarico/helpers/reflection_helper.rb +61 -0
  155. data/lib/habarico/helpers/sorting_helper.rb +136 -0
  156. data/lib/habarico/schema/action/action_schema.rb +46 -0
  157. data/lib/habarico/schema/action/confirm_dialog_properties.rb +13 -0
  158. data/lib/habarico/schema/action/global_resource_action_schema.rb +29 -0
  159. data/lib/habarico/schema/action/link_action_parameters.rb +15 -0
  160. data/lib/habarico/schema/action/resource_action_endpoint_parameters.rb +24 -0
  161. data/lib/habarico/schema/action/resource_action_parameters.rb +17 -0
  162. data/lib/habarico/schema/action/resource_action_schema.rb +14 -0
  163. data/lib/habarico/schema/action/save_action_parameters.rb +10 -0
  164. data/lib/habarico/schema/action/upload_images_action_parameters.rb +23 -0
  165. data/lib/habarico/schema/action/view_action_endpoint_parameters.rb +16 -0
  166. data/lib/habarico/schema/action/view_action_parameters.rb +27 -0
  167. data/lib/habarico/schema/endpoint/ai_field_options.rb +10 -0
  168. data/lib/habarico/schema/endpoint/box_options.rb +10 -0
  169. data/lib/habarico/schema/endpoint/choices_field_options.rb +10 -0
  170. data/lib/habarico/schema/endpoint/dynamic_render_options.rb +14 -0
  171. data/lib/habarico/schema/endpoint/endpoints_schema.rb +22 -0
  172. data/lib/habarico/schema/endpoint/enum_type.rb +21 -0
  173. data/lib/habarico/schema/endpoint/field_options.rb +56 -0
  174. data/lib/habarico/schema/endpoint/field_schema.rb +65 -0
  175. data/lib/habarico/schema/endpoint/filter_schema.rb +44 -0
  176. data/lib/habarico/schema/endpoint/image_field_options.rb +13 -0
  177. data/lib/habarico/schema/endpoint/key_value.rb +13 -0
  178. data/lib/habarico/schema/endpoint/method_schema.rb +13 -0
  179. data/lib/habarico/schema/endpoint/number_field_options.rb +24 -0
  180. data/lib/habarico/schema/endpoint/phone_field_options.rb +13 -0
  181. data/lib/habarico/schema/endpoint/relation_field_options.rb +39 -0
  182. data/lib/habarico/schema/extensible_enum.rb +20 -0
  183. data/lib/habarico/schema/menu/action_view_choice.rb +13 -0
  184. data/lib/habarico/schema/menu/menu_group_schema.rb +26 -0
  185. data/lib/habarico/schema/menu/menu_schema.rb +36 -0
  186. data/lib/habarico/schema/resource/global_resource_schema.rb +14 -0
  187. data/lib/habarico/schema/resource/local_resource_schema.rb +14 -0
  188. data/lib/habarico/schema/resource/object_resource_schema.rb +8 -0
  189. data/lib/habarico/schema/resource/resource_schema.rb +16 -0
  190. data/lib/habarico/schema/types.rb +102 -0
  191. data/lib/habarico/schema/view/action_descriptor.rb +30 -0
  192. data/lib/habarico/schema/view/array_box_parameters.rb +13 -0
  193. data/lib/habarico/schema/view/box_schema.rb +67 -0
  194. data/lib/habarico/schema/view/detail_view_parameters.rb +16 -0
  195. data/lib/habarico/schema/view/field_descriptor.rb +50 -0
  196. data/lib/habarico/schema/view/field_wrapper_properties.rb +13 -0
  197. data/lib/habarico/schema/view/filter_descriptor.rb +24 -0
  198. data/lib/habarico/schema/view/gallery_box_parameters.rb +31 -0
  199. data/lib/habarico/schema/view/global_view_schema.rb +25 -0
  200. data/lib/habarico/schema/view/grid_item_box_parameters.rb +13 -0
  201. data/lib/habarico/schema/view/list_box_parameters.rb +44 -0
  202. data/lib/habarico/schema/view/list_view_parameters.rb +31 -0
  203. data/lib/habarico/schema/view/object_box_parameters.rb +10 -0
  204. data/lib/habarico/schema/view/sort_descriptor.rb +15 -0
  205. data/lib/habarico/schema/view/sortable_parameters.rb +13 -0
  206. data/lib/habarico/schema/view/tab_box_parameters.rb +10 -0
  207. data/lib/habarico/schema/view/view_action_descriptor_parameters.rb +21 -0
  208. data/lib/habarico/schema/view/view_endpoint_parameters.rb +22 -0
  209. data/lib/habarico/schema/view/view_schema.rb +33 -0
  210. data/lib/habarico/schema/view/wizard_box_parameters.rb +13 -0
  211. data/lib/habarico/search/field_resolver.rb +138 -0
  212. data/lib/habarico/search/search_matcher.rb +152 -0
  213. data/lib/habarico/serializers/meta_serializer.rb +42 -0
  214. data/lib/habarico/serializers/record_serializer.rb +33 -0
  215. data/lib/habarico/serializers/serializer.rb +61 -0
  216. data/lib/habarico/services/resource_service.rb +69 -0
  217. data/lib/habarico/services/routing_service.rb +160 -0
  218. data/lib/habarico/services/schema_service.rb +72 -0
  219. data/lib/habarico/version.rb +5 -0
  220. data/lib/habarico.rb +262 -0
  221. metadata +324 -0
@@ -0,0 +1,56 @@
1
+ module Habarico
2
+ class ViewActionParametersGenerator < AbstractGenerator
3
+
4
+ def generate(action, context)
5
+ # Validate arguments
6
+ raise Eluvia::Errors::StandardError.new('Argument `action` must be a Habarico::Action') unless action.is_a?(Habarico::Action)
7
+ raise Eluvia::Errors::StandardError.new('Argument `action` must be of :view type') unless action.type.to_sym == :view
8
+
9
+ # Create model
10
+ Habarico::ViewActionParameters.new(
11
+ name: generate_name(action, context),
12
+ mode: generate_mode(action, context),
13
+ dialog_width: generate_dialog_width(action, context),
14
+ parameters: generate_parameters(action, context),
15
+ endpoint: generate_endpoint(action, context),
16
+ keep_linked_parent: generate_keep_linked_parent(action, context)
17
+ )
18
+ end
19
+
20
+ protected
21
+
22
+ def view_action_endpoint_parameters_generator
23
+ @view_action_endpoint_parameters_generator ||= definition.view_action_endpoint_parameters_generator.new(definition, resource_path)
24
+ end
25
+
26
+ # ***********************************************************************
27
+ # Attribute generators
28
+ # ***********************************************************************
29
+
30
+ def generate_name(action, _context)
31
+ action.view_name
32
+ end
33
+
34
+ def generate_mode(action, _context)
35
+ action.view_mode
36
+ end
37
+
38
+ def generate_dialog_width(action, _context)
39
+ action.dialog_width
40
+ end
41
+
42
+ def generate_parameters(action, context)
43
+ Habarico::CallableHelper.resolve(action.view_parameters, context)
44
+ end
45
+
46
+ def generate_endpoint(action, context)
47
+ return nil if Habarico::ActionHelper.is_standard_action?(action)
48
+ view_action_endpoint_parameters_generator.generate(action, context)
49
+ end
50
+
51
+ def generate_keep_linked_parent(action, _context)
52
+ action.view_keep_linked_parent
53
+ end
54
+
55
+ end
56
+ end
@@ -0,0 +1,26 @@
1
+ module Habarico
2
+ class DynamicRenderOptionsGenerator < AbstractGenerator
3
+
4
+ def generate(model, box_or_field_reference)
5
+ Habarico::DynamicRenderOptions.new(
6
+ show_query: generate_show_query(model, box_or_field_reference),
7
+ required_query: generate_required_query(model, box_or_field_reference),
8
+ )
9
+ end
10
+
11
+ protected
12
+
13
+ # ***********************************************************************
14
+ # Attribute generators
15
+ # ***********************************************************************
16
+
17
+ def generate_show_query(_model, box_or_field_reference)
18
+ box_or_field_reference.show_query
19
+ end
20
+
21
+ def generate_required_query(_model, box_or_field_reference)
22
+ box_or_field_reference.required_query
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,61 @@
1
+ module Habarico
2
+ class EndpointsSchemaGenerator < AbstractGenerator
3
+
4
+ def generate(model, read_fields, write_fields, filters, methods)
5
+ # Validate arguments
6
+ validate_fields_argument!('read_fields', read_fields)
7
+ validate_fields_argument!('write_fields', write_fields)
8
+ raise Eluvia::Errors::StandardError.new('Argument `filters` must be an Array of String or Symbol instances') unless filters.is_a?(::Array) && filters.all? { |f| f.is_a?(::String) || f.is_a?(::Symbol) }
9
+ raise Eluvia::Errors::StandardError.new('Argument `methods` must be an array of String or Symbol instances') unless methods.is_a?(::Array) && methods.all? { |m| m.is_a?(::String) || m.is_a?(::Symbol) }
10
+
11
+ # Create model
12
+ Habarico::EndpointsSchema.new(
13
+ get: methods.include?(:get) || methods.include?('get') ? generate_get(model, read_fields, write_fields, filters) : nil,
14
+ post: methods.include?(:post) || methods.include?('post') ? generate_post(model, read_fields, write_fields, filters) : nil,
15
+ put: methods.include?(:put) || methods.include?('put') ? generate_put(model, read_fields, write_fields, filters) : nil,
16
+ patch: methods.include?(:patch) || methods.include?('patch') ? generate_patch(model, read_fields, write_fields, filters) : nil,
17
+ delete: methods.include?(:delete) || methods.include?('delete') ? generate_delete(model, read_fields, write_fields, filters) : nil
18
+ )
19
+ end
20
+
21
+ protected
22
+
23
+ def validate_fields_argument!(name, fields)
24
+ valid = fields.is_a?(::Array) && fields.all? do |f|
25
+ f.is_a?(::String) || f.is_a?(::Symbol) || f.is_a?(::Hash) || f.is_a?(Habarico::FieldReference)
26
+ end
27
+ return if valid
28
+
29
+ raise Eluvia::Errors::StandardError.new("Argument `#{name}` must be an Array of String, Symbol, Hash or Habarico::FieldReference instances")
30
+ end
31
+
32
+ def method_schema_generator
33
+ @method_schema_generator ||= definition.method_schema_generator.new(definition, resource_path)
34
+ end
35
+
36
+ # ***********************************************************************
37
+ # Attribute generators
38
+ # ***********************************************************************
39
+
40
+ def generate_get(model, read_fields, _write_fields, filters)
41
+ method_schema_generator.generate(model, read_fields, filters)
42
+ end
43
+
44
+ def generate_post(model, _read_fields, write_fields, _filters)
45
+ method_schema_generator.generate(model, write_fields, [])
46
+ end
47
+
48
+ def generate_put(model, _read_fields, write_fields, _filters)
49
+ method_schema_generator.generate(model, write_fields, [])
50
+ end
51
+
52
+ def generate_patch(model, _read_fields, write_fields, _filters)
53
+ method_schema_generator.generate(model, write_fields, [])
54
+ end
55
+
56
+ def generate_delete(model, _read_fields, _write_fields, _filters)
57
+ method_schema_generator.generate(model, [], [])
58
+ end
59
+
60
+ end
61
+ end
@@ -0,0 +1,45 @@
1
+ module Habarico
2
+ class EnumTypeGenerator < AbstractGenerator
3
+
4
+ def generate(model, attr_name, value)
5
+ # Validate arguments
6
+ raise Eluvia::Errors::StandardError.new("Model `#{model.model_name}` does not have enum attribute `#{attr_name}`") unless model.has_enum_attr?(attr_name)
7
+ raise Eluvia::Errors::StandardError.new("Enum attribute `#{attr_name}` of model `#{model.model_name}` does not have a choice with value `#{value}`") unless model.find_enum_attr(attr_name).fetch(value.to_s, nil)
8
+
9
+ # Create model
10
+ Habarico::EnumType.new(
11
+ value: generate_value(model, attr_name, value),
12
+ label: generate_label(model, attr_name, value),
13
+ color: generate_color(model, attr_name, value),
14
+ icon: generate_icon(model, attr_name, value)
15
+ )
16
+ end
17
+
18
+ protected
19
+
20
+ # ***********************************************************************
21
+ # Attribute generators
22
+ # ***********************************************************************
23
+
24
+ def generate_value(model, attr_name, value)
25
+ choice = model.find_enum_attr(attr_name).fetch(value.to_s, nil)
26
+ choice[:value].to_s
27
+ end
28
+
29
+ def generate_label(model, attr_name, value)
30
+ choice = model.find_enum_attr(attr_name).fetch(value.to_s, nil)
31
+ choice[:label].to_s
32
+ end
33
+
34
+ def generate_color(model, attr_name, value)
35
+ choice = model.find_enum_attr(attr_name).fetch(value.to_s, nil)
36
+ choice[:color].to_s
37
+ end
38
+
39
+ def generate_icon(model, attr_name, value)
40
+ choice = model.find_enum_attr(attr_name).fetch(value.to_s, nil)
41
+ choice[:icon]
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,179 @@
1
+ module Habarico
2
+ class FieldOptionsGenerator < AbstractGenerator
3
+
4
+ def generate(model, attr_name, field_reference)
5
+ if field_reference.present?
6
+ return Habarico::FieldOptions.new(
7
+ prefix: generate_prefix_fr(model, field_reference),
8
+ postfix: generate_postfix_fr(model, field_reference),
9
+ text_align: generate_text_align_fr(model, field_reference),
10
+ target: generate_target_fr(model, field_reference),
11
+ number: generate_number_fr(model, field_reference),
12
+ dynamic_render: generate_dynamic_render_fr(model, field_reference),
13
+ relation: generate_relation_fr(model, field_reference),
14
+ phone: generate_phone_fr(model, field_reference),
15
+ choices: generate_choices_fr(model, field_reference),
16
+ image: generate_image_fr(model, field_reference),
17
+ ai: generate_ai_fr(model, field_reference),
18
+ max_size: generate_max_size_fr(model, field_reference),
19
+ accept: generate_accept_fr(model, field_reference),
20
+ )
21
+ end
22
+ if attr_name.present?
23
+ return Habarico::FieldOptions.new(
24
+ prefix: generate_prefix_at(model, attr_name),
25
+ postfix: generate_postfix_at(model, attr_name),
26
+ text_align: generate_text_align_at(model, attr_name),
27
+ target: generate_target_at(model, attr_name),
28
+ number: generate_number_at(model, attr_name),
29
+ dynamic_render: generate_dynamic_render_at(model, attr_name),
30
+ max_size: generate_max_size_at(model, attr_name),
31
+ accept: generate_accept_at(model, attr_name),
32
+ )
33
+ end
34
+ nil
35
+ end
36
+
37
+ protected
38
+
39
+ # ***********************************************************************
40
+ # Schema generators
41
+ # ***********************************************************************
42
+
43
+ def number_field_options_generator
44
+ @number_field_options_generator ||= definition.number_field_options_generator.new(definition, resource_path)
45
+ end
46
+
47
+ def dynamic_render_options_generator
48
+ @dynamic_render_options_generator ||= definition.dynamic_render_options_generator.new(definition, resource_path)
49
+ end
50
+
51
+ def relation_field_options_generator
52
+ @relation_field_options_generator ||= definition.relation_field_options_generator.new(definition, resource_path)
53
+ end
54
+
55
+ # Memoized per `(model, attr_name)` so `generate_max_size_*` and `generate_accept_*` - two
56
+ # independent generator methods, called separately for the same field - derive it only once
57
+ # instead of each re-running `model.validators_on(attachment)` and the Marcel content-type
58
+ # guess for the half of the result the other one does not need.
59
+ def file_validation_rules(model, attr_name)
60
+ @file_validation_rules ||= {}
61
+ @file_validation_rules[[model, attr_name]] ||= Habarico::FileValidations.for_model(model, attr_name)
62
+ end
63
+
64
+ def phone_field_options_generator
65
+ @phone_field_options_generator ||= definition.phone_field_options_generator.new(definition, resource_path)
66
+ end
67
+
68
+ # ***********************************************************************
69
+ # Attribute generators
70
+ # ***********************************************************************
71
+
72
+ def generate_prefix_at(_model, _attr_name)
73
+ # not implemented yet
74
+ end
75
+
76
+ def generate_postfix_at(_model, _attr_name)
77
+ # not implemented yet
78
+ end
79
+
80
+ def generate_text_align_at(model, attr_name)
81
+ return 'right' if Habarico::AttributesHelper.is_amount_major_attr?(model, attr_name)
82
+ nil
83
+ end
84
+
85
+ def generate_target_at(_model, _attr_name)
86
+ # not implemented yet
87
+ end
88
+
89
+ def generate_number_at(model, attr_name)
90
+ number_field_options_generator.generate(model, attr_name)
91
+ end
92
+
93
+ def generate_dynamic_render_at(_model, _attr_name)
94
+ nil # not possible to generate dynamic render without FieldReference
95
+ end
96
+
97
+ # Largest file (bytes) this `file_attr` accepts, derived from its own
98
+ # `active_storage_validations` size declaration (HAB-966). `habarico_enterprise.uploads`, when
99
+ # installed, additionally folds in the project-wide upload size ceiling for a field a
100
+ # chunked-upload provider serves - see `Habarico::FileValidations.for_model`.
101
+ #
102
+ # A bare symbol declaration has no `FieldReference` to set an explicit override on - see
103
+ # `generate_max_size_fr` for that.
104
+ def generate_max_size_at(model, attr_name)
105
+ file_validation_rules(model, attr_name).max_size
106
+ end
107
+
108
+ # File types this `file_attr` accepts, derived from its own `active_storage_validations`
109
+ # content-type declaration (HAB-966).
110
+ def generate_accept_at(model, attr_name)
111
+ Habarico::FileValidations.accept_for(file_validation_rules(model, attr_name).allowed_content_types)
112
+ end
113
+
114
+ def generate_prefix_fr(_model, _field_reference)
115
+ # not implemented yet
116
+ end
117
+
118
+ def generate_postfix_fr(_model, _field_reference)
119
+ # not implemented yet
120
+ end
121
+
122
+ def generate_text_align_fr(_model, field_reference)
123
+ field_reference.text_align
124
+ end
125
+
126
+ def generate_target_fr(_model, field_reference)
127
+ field_reference.target
128
+ end
129
+
130
+ def generate_number_fr(_model, _field_reference)
131
+ # not implemented yet
132
+ end
133
+
134
+ def generate_dynamic_render_fr(model, field_reference)
135
+ dynamic_render_options_generator.generate(model, field_reference)
136
+ end
137
+
138
+ def generate_relation_fr(model, field_reference)
139
+ relation_field_options_generator.generate(model, field_reference)
140
+ end
141
+
142
+ def generate_phone_fr(model, field_reference)
143
+ phone_field_options_generator.generate(model, field_reference)
144
+ end
145
+
146
+ def generate_choices_fr(_model, field_reference)
147
+ icons_key = field_reference.icons_key
148
+ return nil if icons_key.blank?
149
+ Habarico::ChoicesFieldOptions.new(icons_key: icons_key)
150
+ end
151
+
152
+ def generate_image_fr(_model, field_reference)
153
+ resize_width = field_reference.resize_width
154
+ crop_aspect_ratio = field_reference.crop_aspect_ratio
155
+ return nil if resize_width.blank? && crop_aspect_ratio.blank?
156
+ Habarico::ImageFieldOptions.new(resize_width: resize_width, crop_aspect_ratio: crop_aspect_ratio)
157
+ end
158
+
159
+ def generate_ai_fr(_model, field_reference)
160
+ source_fields = field_reference.ai_source_fields
161
+ return nil if source_fields.blank?
162
+ Habarico::AiFieldOptions.new(source_fields: source_fields)
163
+ end
164
+
165
+ # `field_reference.max_size` is a deliberate override, the same way `resize_width` /
166
+ # `icons_key` above are - set by hand it always wins over what the attachment's own validators
167
+ # imply.
168
+ def generate_max_size_fr(model, field_reference)
169
+ return field_reference.max_size if field_reference.max_size.present?
170
+ file_validation_rules(model, field_reference.name).max_size
171
+ end
172
+
173
+ def generate_accept_fr(model, field_reference)
174
+ return field_reference.accept if field_reference.accept.present?
175
+ Habarico::FileValidations.accept_for(file_validation_rules(model, field_reference.name).allowed_content_types)
176
+ end
177
+
178
+ end
179
+ end