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,107 @@
1
+ module Habarico
2
+ class FieldDescriptorGenerator < AbstractGenerator
3
+
4
+ def generate(model, field_reference, context, force_params = {})
5
+ # Fallback to a simple FieldReference object if a string or a symbol is provided
6
+ field_reference = Habarico::FieldReference.new(name: field_reference.to_s) if field_reference.is_a?(String) || field_reference.is_a?(Symbol)
7
+
8
+ # Validate argument
9
+ raise Eluvia::Errors::StandardError.new('Argument `field_reference` must be a Habarico::FieldReference') unless field_reference.is_a?(Habarico::FieldReference)
10
+
11
+ # Force parameters
12
+ field_reference.assign(force_params)
13
+
14
+ # Create model
15
+ Habarico::FieldDescriptor.new(
16
+ type: 'field',
17
+ name: generate_name(model, field_reference, context),
18
+ label: generate_label(model, field_reference, context),
19
+ short_label: generate_short_label(model, field_reference, context),
20
+ help_text: generate_help_text(model, field_reference, context),
21
+ sortable: generate_sortable(model, field_reference, context),
22
+ sort_by: generate_sort_by(model, field_reference, context),
23
+ read_only: generate_read_only(model, field_reference, context),
24
+ write_only: generate_write_only(model, field_reference, context),
25
+ default_value: generate_default_value(model, field_reference, context),
26
+ action: generate_action(model, field_reference, context),
27
+ wrapper: generate_wrapper(model, field_reference, context),
28
+ options: generate_options(model, field_reference, context)
29
+ )
30
+ end
31
+
32
+ protected
33
+
34
+ def field_options_generator
35
+ @field_options_generator ||= definition.field_options_generator.new(definition, resource_path)
36
+ end
37
+
38
+ def action_descriptor_generator
39
+ @action_descriptor_generator ||= definition.action_descriptor_generator.new(definition, resource_path)
40
+ end
41
+
42
+ # ***********************************************************************
43
+ # Attribute generators
44
+ # ***********************************************************************
45
+
46
+ def generate_name(_model, field_reference, _context)
47
+ field_reference.name
48
+ end
49
+
50
+ def generate_label(model, field_reference, _context)
51
+ return field_reference.label if field_reference.label.present?
52
+ Habarico::AttributesHelper.generate_attr_variants(model, field_reference.name).each do |attr_name_variant|
53
+ label = I18n.t("#{model.i18n_scope}.attributes.#{model.model_name.i18n_key}.#{attr_name_variant}", default: nil)
54
+ return label if label.present?
55
+ end
56
+ nil # In this case do not define label and use the default one from field schema
57
+ end
58
+
59
+ def generate_short_label(_model, field_reference, _context)
60
+ field_reference.short_label
61
+ end
62
+
63
+ def generate_help_text(_model, field_reference, _context)
64
+ field_reference.help_text
65
+ end
66
+
67
+ def generate_sortable(model, field_reference, context)
68
+ if generate_sort_by(model, field_reference, context).present?
69
+ return true
70
+ end
71
+
72
+ field_reference.sortable
73
+ end
74
+
75
+ def generate_sort_by(model, field_reference, _context)
76
+ Habarico::SortingHelper.descriptor_sort_by(model, field_reference)
77
+ end
78
+
79
+ def generate_read_only(_model, field_reference, _context)
80
+ field_reference.read_only
81
+ end
82
+
83
+ def generate_write_only(_model, field_reference, _context)
84
+ field_reference.write_only
85
+ end
86
+
87
+ def generate_default_value(_model, field_reference, _context)
88
+ field_reference.default_value
89
+ end
90
+
91
+ def generate_action(_model, field_reference, context)
92
+ return nil unless field_reference.action.present?
93
+ action_descriptor_generator.generate(field_reference.action, context)
94
+ end
95
+
96
+ def generate_wrapper(_model, field_reference, _context)
97
+ return nil unless field_reference.wrapper.present?
98
+ raise Eluvia::Errors::StandardError.new('`wrapper` must be a Habarico::FieldWrapperProperties') unless field_reference.wrapper.is_a?(Habarico::FieldWrapperProperties)
99
+ field_reference.wrapper
100
+ end
101
+
102
+ def generate_options(model, field_reference, _context)
103
+ field_options_generator.generate(model, nil, field_reference)
104
+ end
105
+
106
+ end
107
+ end
@@ -0,0 +1,75 @@
1
+ module Habarico
2
+ class FilterDescriptorGenerator < AbstractGenerator
3
+
4
+ def generate(model, filter_reference, context, force_params = {})
5
+ # Fallback to a simple FilterReference object if a string or a symbol is provided
6
+ filter_reference = Habarico::FilterReference.new(name: filter_reference.to_s) if filter_reference.is_a?(String) || filter_reference.is_a?(Symbol)
7
+
8
+ # Validate argument
9
+ raise Eluvia::Errors::StandardError.new('Argument `filter_reference` must be a Habarico::FilterReference') unless filter_reference.is_a?(Habarico::FilterReference)
10
+
11
+ # Force parameters
12
+ filter_reference.assign(force_params)
13
+
14
+ # Create model
15
+ Habarico::FilterDescriptor.new(
16
+ name: generate_name(model, filter_reference, context),
17
+ label: generate_label(model, filter_reference, context),
18
+ help_text: generate_help_text(model, filter_reference, context),
19
+ is_always_on: generate_is_always_on(model, filter_reference, context),
20
+ default_value: generate_default_value(model, filter_reference, context),
21
+ )
22
+ end
23
+
24
+ protected
25
+
26
+ # ***********************************************************************
27
+ # Attribute generators
28
+ # ***********************************************************************
29
+
30
+ def generate_name(_model, field_reference, _context)
31
+ field_reference.name
32
+ end
33
+
34
+ def generate_label(model, field_reference, _context)
35
+ return field_reference.label if field_reference.label.present?
36
+
37
+ return nil unless model.respond_to?(:filter_params)
38
+ filter_param = model.filter_params[field_reference.name.to_sym]
39
+ return nil unless filter_param # In this case do not define label and use the default one from filter schema
40
+
41
+ attr_name = filter_param[:attr_name]
42
+ filters_model_class = filter_param[:model] # this is not the same as `model` argument!
43
+ i18n_model_class = resolve_i18n_model_class(filters_model_class)
44
+
45
+ Habarico::AttributesHelper.generate_attr_variants(filters_model_class, attr_name).each do |attr_name_variant|
46
+ label = I18n.t("#{i18n_model_class.i18n_scope}.attributes.#{i18n_model_class.model_name.i18n_key}.#{attr_name_variant}", default: nil)
47
+ return label if label.present?
48
+ end
49
+ nil # In this case do not define label and use the default one from filter schema
50
+ end
51
+
52
+ # `filters_model_class` (`filter_param[:model]`) is usually a nested `Eluvia::ActiveRecord::FiltersModel`
53
+ # proxy class (e.g. `Employee::Filters`), not the real AR model — its own i18n_scope/model_name don't match
54
+ # where attribute translations actually live. Resolve back to the real model the same way generate_reference
55
+ # does for class names (strip the `::Filters` suffix), falling back to the proxy class itself if that fails.
56
+ def resolve_i18n_model_class(filters_model_class)
57
+ filters_model_class.name.to_s.delete_suffix('::Filters').constantize
58
+ rescue StandardError
59
+ filters_model_class
60
+ end
61
+
62
+ def generate_help_text(_model, field_reference, _context)
63
+ field_reference.help_text
64
+ end
65
+
66
+ def generate_is_always_on(_model, field_reference, _context)
67
+ field_reference.is_always_on
68
+ end
69
+
70
+ def generate_default_value(_model, field_reference, _context)
71
+ field_reference.default_value
72
+ end
73
+
74
+ end
75
+ end
@@ -0,0 +1,71 @@
1
+ module Habarico
2
+ class GalleryBoxParametersGenerator < AbstractGenerator
3
+
4
+ def generate(box, context)
5
+ raise Eluvia::Errors::StandardError.new('Argument `box` must be a Habarico::GalleryBox') unless box.is_a?(Habarico::GalleryBox)
6
+
7
+ Habarico::GalleryBoxParameters.new(
8
+ reference: generate_reference(box, context),
9
+ target: generate_target(box, context),
10
+ extra_filters: generate_extra_filters(box, context),
11
+ filters: generate_filters(box, context),
12
+ label: generate_label(box, context),
13
+ image_field: generate_image_field(box, context),
14
+ default_sorting: generate_default_sorting(box, context),
15
+ schema_params: generate_schema_params(box, context),
16
+ )
17
+ end
18
+
19
+ protected
20
+
21
+ def filter_descriptor_generator
22
+ @filter_descriptor_generator ||= definition.filter_descriptor_generator.new(definition, resource_path)
23
+ end
24
+
25
+ def sort_descriptor_generator
26
+ @sort_descriptor_generator ||= definition.sort_descriptor_generator.new(definition, resource_path)
27
+ end
28
+
29
+ # ***********************************************************************
30
+ # Attribute generators
31
+ # ***********************************************************************
32
+
33
+ def generate_reference(box, _context)
34
+ box.reference
35
+ end
36
+
37
+ def generate_target(box, _context)
38
+ box.target
39
+ end
40
+
41
+ def generate_label(box, _context)
42
+ box.label
43
+ end
44
+
45
+ def generate_image_field(box, _context)
46
+ box.image_field
47
+ end
48
+
49
+ def generate_schema_params(box, _context)
50
+ box.schema_params
51
+ end
52
+
53
+ def generate_extra_filters(box, context)
54
+ Habarico::CallableHelper.resolve(box.extra_filters, context)
55
+ end
56
+
57
+ def generate_filters(box, context)
58
+ referenced_model = Habarico::BoxHelper.get_referenced_model(box) || definition.model
59
+
60
+ filters = box.filters || []
61
+ filters.map do |filter|
62
+ filter_descriptor_generator.generate(referenced_model, filter, context)
63
+ end
64
+ end
65
+
66
+ def generate_default_sorting(box, context)
67
+ sort_descriptor_generator.generate(box.default_sorting || Habarico::BoxHelper.get_referenced_definition(box)&.default_sorting, context)
68
+ end
69
+
70
+ end
71
+ end
@@ -0,0 +1,59 @@
1
+ module Habarico
2
+ class GlobalViewSchemaGenerator < AbstractGenerator
3
+
4
+ def generate(view)
5
+ # Fallback to a simple View object if a string or symbol is provided
6
+ if view.is_a?(String) || view.is_a?(Symbol)
7
+ view = case view.to_sym
8
+ when :list then Habarico::ListView.new
9
+ when :show then Habarico::ShowView.new
10
+ when :edit then Habarico::EditView.new
11
+ when :create then Habarico::CreateView.new
12
+ end
13
+ end
14
+
15
+ # Validate arguments
16
+ raise Eluvia::Errors::StandardError.new('Argument `view` must be a Habarico::View') unless view.is_a?(Habarico::View)
17
+
18
+ # Create model
19
+ Habarico::GlobalViewSchema.new(
20
+ type: generate_type(view),
21
+ name: generate_name(view),
22
+ is_detail: generate_is_detail(view),
23
+ mode: generate_mode(view),
24
+ endpoint: generate_endpoint(view)
25
+ )
26
+ end
27
+
28
+ protected
29
+
30
+ def view_endpoint_parameters_generator
31
+ @view_endpoint_parameters_generator ||= definition.view_endpoint_parameters_generator.new(definition, resource_path)
32
+ end
33
+
34
+ # ***********************************************************************
35
+ # Attribute generators
36
+ # ***********************************************************************
37
+
38
+ def generate_type(view)
39
+ view.type
40
+ end
41
+
42
+ def generate_name(view)
43
+ view.name
44
+ end
45
+
46
+ def generate_is_detail(view)
47
+ view.is_detail.nil? ? view.type.to_sym != :list : view.is_detail
48
+ end
49
+
50
+ def generate_mode(view)
51
+ view.view_mode
52
+ end
53
+
54
+ def generate_endpoint(view)
55
+ view_endpoint_parameters_generator.generate(view, Habarico::Context.new)
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,44 @@
1
+ module Habarico
2
+ class GridItemBoxParametersGenerator < AbstractGenerator
3
+
4
+ def generate(box, context)
5
+ # Validate arguments
6
+ raise Eluvia::Errors::StandardError.new('Argument `box` must be a Habarico::GridItemBox') unless box.is_a?(Habarico::GridItemBox)
7
+
8
+ # Create model
9
+ Habarico::GridItemBoxParameters.new(
10
+ xs: generate_xs(box, context),
11
+ sm: generate_sm(box, context),
12
+ md: generate_md(box, context),
13
+ lg: generate_lg(box, context),
14
+ xl: generate_xl(box, context),
15
+ )
16
+ end
17
+
18
+ protected
19
+
20
+ # ***********************************************************************
21
+ # Attribute generators
22
+ # ***********************************************************************
23
+
24
+ def generate_xs(box, _context)
25
+ box.xs
26
+ end
27
+
28
+ def generate_sm(box, _context)
29
+ box.sm
30
+ end
31
+
32
+ def generate_md(box, _context)
33
+ box.md
34
+ end
35
+
36
+ def generate_lg(box, _context)
37
+ box.lg
38
+ end
39
+
40
+ def generate_xl(box, _context)
41
+ box.xl
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,124 @@
1
+ module Habarico
2
+ class ListBoxParametersGenerator < AbstractGenerator
3
+
4
+ def generate(box, context)
5
+ # Validate arguments
6
+ raise Eluvia::Errors::StandardError.new('Argument `box` must be a Habarico::ListBox') unless box.is_a?(Habarico::ListBox)
7
+ raise Eluvia::Errors::StandardError.new('Attributes `reference` of the `box` argument must be set') if box.reference.blank?
8
+ raise Eluvia::Errors::StandardError.new('Attributes `target` or `extra_filters` of the `box` argument must be set') if box.target.blank? && box.extra_filters.blank?
9
+
10
+ # Create model
11
+ Habarico::ListBoxParameters.new(
12
+ reference: generate_reference(box, context),
13
+ target: generate_target(box, context),
14
+ extra_filters: generate_extra_filters(box, context),
15
+ filters: generate_filters(box, context),
16
+ row_actions: generate_row_actions(box, context),
17
+ toolbar_actions: generate_toolbar_actions(box, context),
18
+ list_actions: generate_list_actions(box, context),
19
+ default_sorting: generate_default_sorting(box, context),
20
+ sortable: generate_sortable(box, context),
21
+ schema_params: generate_schema_params(box, context),
22
+ single_click_action: generate_single_click_action(box, context),
23
+ double_click_action: generate_double_click_action(box, context),
24
+ )
25
+ end
26
+
27
+ protected
28
+
29
+ def filter_descriptor_generator
30
+ @filter_descriptor_generator ||= definition.filter_descriptor_generator.new(definition, resource_path)
31
+ end
32
+
33
+ def sort_descriptor_generator
34
+ @sort_descriptor_generator ||= definition.sort_descriptor_generator.new(definition, resource_path)
35
+ end
36
+
37
+ def action_descriptor_generator
38
+ @action_descriptor_generator ||= definition.action_descriptor_generator.new(definition, resource_path)
39
+ end
40
+
41
+ # ***********************************************************************
42
+ # Attribute generators
43
+ # ***********************************************************************
44
+
45
+ def generate_reference(box, _context)
46
+ box.reference
47
+ end
48
+
49
+ def generate_target(box, _context)
50
+ box.target
51
+ end
52
+
53
+ def generate_extra_filters(box, context)
54
+ Habarico::CallableHelper.resolve(box.extra_filters, context)
55
+ end
56
+
57
+ def generate_filters(box, context)
58
+ referenced_model = Habarico::BoxHelper.get_referenced_model(box) || definition.model
59
+
60
+ # Generate filter descriptors
61
+ filters = box.filters || []
62
+ filters.map do |filter|
63
+ filter_descriptor_generator.generate(referenced_model, filter, context)
64
+ end
65
+ end
66
+
67
+ def generate_row_actions(box, context)
68
+ unless box.row_actions.nil?
69
+ return box.row_actions.map do |action|
70
+ action_descriptor_generator.generate(action, context)
71
+ end.compact
72
+ end
73
+ nil
74
+ end
75
+
76
+ # Table's own toolbar (top of the resource list, e.g. create). Fed by the ListBox's `list_toolbar_actions`,
77
+ # separate from the box-level `toolbar_actions` which is emitted at the box root.
78
+ def generate_toolbar_actions(box, context)
79
+ unless box.list_toolbar_actions.nil?
80
+ return box.list_toolbar_actions.map do |action|
81
+ action_descriptor_generator.generate(action, context)
82
+ end.compact
83
+ end
84
+ nil
85
+ end
86
+
87
+ # Utility actions of the table (export, print, ...) rendered next to the filter bar.
88
+ def generate_list_actions(box, context)
89
+ unless box.list_actions.nil?
90
+ return box.list_actions.map do |action|
91
+ action_descriptor_generator.generate(action, context)
92
+ end.compact
93
+ end
94
+ nil
95
+ end
96
+
97
+ def generate_default_sorting(box, context)
98
+ sort_descriptor_generator.generate(box.default_sorting || Habarico::BoxHelper.get_referenced_definition(box)&.default_sorting, context)
99
+ end
100
+
101
+ def generate_sortable(box, _context)
102
+ return nil unless box.sortable_field_name.present?
103
+ Habarico::SortableParameters.new(
104
+ field_name: box.sortable_field_name,
105
+ sort_for_filters: box.sortable_sort_for_filters,
106
+ )
107
+ end
108
+
109
+ def generate_schema_params(box, _context)
110
+ box.schema_params
111
+ end
112
+
113
+ def generate_single_click_action(box, context)
114
+ return nil if box.single_click_action.nil?
115
+ action_descriptor_generator.generate(box.single_click_action, context)
116
+ end
117
+
118
+ def generate_double_click_action(box, context)
119
+ return nil if box.double_click_action.nil?
120
+ action_descriptor_generator.generate(box.double_click_action, context)
121
+ end
122
+
123
+ end
124
+ end
@@ -0,0 +1,120 @@
1
+ module Habarico
2
+ class ListViewParametersGenerator < AbstractGenerator
3
+
4
+ def generate(view, context)
5
+ # Validate arguments
6
+ raise Eluvia::Errors::StandardError.new('Argument `view` must be a Habarico::View') unless view.is_a?(Habarico::View)
7
+
8
+ # Create model
9
+ Habarico::ListViewParameters.new(
10
+ boxes: generate_boxes(view, context),
11
+ filters: generate_filters(view, context),
12
+ row_actions: generate_row_actions(view, context),
13
+ toolbar_actions: generate_toolbar_actions(view, context),
14
+ list_actions: generate_list_actions(view, context),
15
+ default_sorting: generate_default_sorting(view, context),
16
+ single_click_action: generate_single_click_action(view, context),
17
+ double_click_action: generate_double_click_action(view, context),
18
+ )
19
+ end
20
+
21
+ protected
22
+
23
+ def field_descriptor_generator
24
+ @field_descriptor_generator ||= definition.field_descriptor_generator.new(definition, resource_path)
25
+ end
26
+
27
+ def filter_descriptor_generator
28
+ @filter_descriptor_generator ||= definition.filter_descriptor_generator.new(definition, resource_path)
29
+ end
30
+
31
+ def sort_descriptor_generator
32
+ @sort_descriptor_generator ||= definition.sort_descriptor_generator.new(definition, resource_path)
33
+ end
34
+
35
+ def action_descriptor_generator
36
+ @action_descriptor_generator ||= definition.action_descriptor_generator.new(definition, resource_path)
37
+ end
38
+
39
+ # ***********************************************************************
40
+ # Attribute generators
41
+ # ***********************************************************************
42
+
43
+ def generate_boxes(view, context)
44
+ boxes = view.boxes
45
+ return nil if boxes.nil? || boxes.empty?
46
+ boxes.map do |field|
47
+ field_descriptor_generator.generate(definition.model, field, context)
48
+ end
49
+ end
50
+
51
+ def generate_filters(view, context)
52
+ # Toolbar filters (always-on). These take precedence: any standard filter with the
53
+ # same name is dropped below so a filter is never rendered twice.
54
+ toolbar_filters = (view.respond_to?(:toolbar_filters) ? view.toolbar_filters : nil) || []
55
+ toolbar_names = toolbar_filters.map { |filter| filter_reference_name(filter) }
56
+
57
+ # Standard (drawer) filters, falling back to the definition-level filter set. Exclude
58
+ # anything already promoted to the toolbar to avoid duplicates.
59
+ standard_filters = (view.respond_to?(:filters) ? view.filters : nil) || definition.filters || []
60
+ standard_filters = standard_filters.reject { |filter| toolbar_names.include?(filter_reference_name(filter)) }
61
+
62
+ toolbar_descriptors = toolbar_filters.map do |filter|
63
+ filter_descriptor_generator.generate(definition.model, filter, context, is_always_on: true)
64
+ end
65
+ standard_descriptors = standard_filters.map do |filter|
66
+ filter_descriptor_generator.generate(definition.model, filter, context)
67
+ end
68
+
69
+ toolbar_descriptors + standard_descriptors
70
+ end
71
+
72
+ # Normalize a filter entry (Symbol, String or FilterReference) to its name for comparison.
73
+ def filter_reference_name(filter)
74
+ filter.is_a?(Habarico::FilterReference) ? filter.name.to_s : filter.to_s
75
+ end
76
+
77
+ def generate_row_actions(view, context)
78
+ unless view.row_actions.nil?
79
+ return view.row_actions.map do |action|
80
+ action_descriptor_generator.generate(action, context)
81
+ end.compact
82
+ end
83
+ nil
84
+ end
85
+
86
+ def generate_toolbar_actions(view, context)
87
+ unless view.toolbar_actions.nil?
88
+ return view.toolbar_actions.map do |action|
89
+ action_descriptor_generator.generate(action, context)
90
+ end.compact
91
+ end
92
+ nil
93
+ end
94
+
95
+ # Utility actions of the table (export, print, ...) rendered next to the filter bar.
96
+ def generate_list_actions(view, context)
97
+ unless view.list_actions.nil?
98
+ return view.list_actions.map do |action|
99
+ action_descriptor_generator.generate(action, context)
100
+ end.compact
101
+ end
102
+ nil
103
+ end
104
+
105
+ def generate_default_sorting(view, context)
106
+ sort_descriptor_generator.generate(view.default_sorting || definition.default_sorting, context)
107
+ end
108
+
109
+ def generate_single_click_action(view, context)
110
+ return nil if view.single_click_action.nil?
111
+ action_descriptor_generator.generate(view.single_click_action, context)
112
+ end
113
+
114
+ def generate_double_click_action(view, context)
115
+ return nil if view.double_click_action.nil?
116
+ action_descriptor_generator.generate(view.double_click_action, context)
117
+ end
118
+
119
+ end
120
+ end
@@ -0,0 +1,26 @@
1
+ module Habarico
2
+ class ObjectBoxParametersGenerator < AbstractGenerator
3
+
4
+ def generate(box, context)
5
+ # Validate arguments
6
+ raise Eluvia::Errors::StandardError.new('Argument `box` must be a Habarico::ObjectBox') unless box.is_a?(Habarico::ObjectBox)
7
+ raise Eluvia::Errors::StandardError.new('Attribute `target` of the `box` argument must be set') if box.target.blank?
8
+
9
+ # Create model
10
+ Habarico::ObjectBoxParameters.new(
11
+ target: generate_target(box, context)
12
+ )
13
+ end
14
+
15
+ protected
16
+
17
+ # ***********************************************************************
18
+ # Attribute generators
19
+ # ***********************************************************************
20
+
21
+ def generate_target(box, _context)
22
+ box.target
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,30 @@
1
+ module Habarico
2
+ class SortDescriptorGenerator < AbstractGenerator
3
+
4
+ def generate(sort_descriptor, context)
5
+ # Nothing declared, nothing published - the frontend then sorts by the primary key, which is
6
+ # what the backend orders by too (HAB-915).
7
+ return nil if sort_descriptor.blank?
8
+
9
+ Habarico::SortDescriptor.new(
10
+ field_name: generate_field_name(sort_descriptor, context),
11
+ direction: generate_direction(sort_descriptor, context),
12
+ )
13
+ end
14
+
15
+ protected
16
+
17
+ # ***********************************************************************
18
+ # Attribute generators
19
+ # ***********************************************************************
20
+
21
+ def generate_field_name(sort_descriptor, _context)
22
+ Habarico::OrderByHelper.field_name(sort_descriptor)
23
+ end
24
+
25
+ def generate_direction(sort_descriptor, _context)
26
+ Habarico::OrderByHelper.direction(sort_descriptor)
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,26 @@
1
+ module Habarico
2
+ class TabBoxParametersGenerator < AbstractGenerator
3
+
4
+ def generate(box, context)
5
+ # Validate arguments
6
+ raise Eluvia::Errors::StandardError.new('Argument `box` must be a Habarico::TabBox') unless box.is_a?(Habarico::TabBox)
7
+
8
+ # Create model
9
+ Habarico::TabBoxParameters.new(
10
+ show_toolbar_navigation: generate_show_toolbar_navigation(box, context),
11
+ )
12
+ end
13
+
14
+ protected
15
+
16
+ # ***********************************************************************
17
+ # Attribute generators
18
+ # ***********************************************************************
19
+
20
+ # Defaults to false for tab boxes.
21
+ def generate_show_toolbar_navigation(box, _context)
22
+ box.show_toolbar_navigation.nil? ? false : !!box.show_toolbar_navigation
23
+ end
24
+
25
+ end
26
+ end