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,45 @@
1
+ module Habarico
2
+ class NumberFieldOptionsGenerator < AbstractGenerator
3
+
4
+ def generate(model, attr_name)
5
+ Habarico::NumberFieldOptions.new(
6
+ style: generate_style(model, attr_name),
7
+ currency: generate_currency(model, attr_name),
8
+ unit: generate_unit(model, attr_name),
9
+ minimum_fraction_digits: generate_minimum_fraction_digits(model, attr_name),
10
+ maximum_fraction_digits: generate_maximum_fraction_digits(model, attr_name),
11
+ )
12
+ end
13
+
14
+ protected
15
+
16
+ # ***********************************************************************
17
+ # Attribute generators
18
+ # ***********************************************************************
19
+
20
+ def generate_style(model, attr_name)
21
+ return 'currency' if Habarico::AttributesHelper.is_amount_major_attr?(model, attr_name)
22
+ nil
23
+ end
24
+
25
+ def generate_currency(model, attr_name)
26
+ return Habarico::Config.currency if Habarico::AttributesHelper.is_amount_major_attr?(model, attr_name)
27
+ nil
28
+ end
29
+
30
+ def generate_unit(_model, _attr_name)
31
+ # not implemented
32
+ end
33
+
34
+ def generate_minimum_fraction_digits(model, attr_name)
35
+ return 2 if Habarico::AttributesHelper.is_amount_major_attr?(model, attr_name)
36
+ nil
37
+ end
38
+
39
+ def generate_maximum_fraction_digits(model, attr_name)
40
+ return 2 if Habarico::AttributesHelper.is_amount_major_attr?(model, attr_name)
41
+ nil
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,29 @@
1
+ module Habarico
2
+ class PhoneFieldOptionsGenerator < AbstractGenerator
3
+
4
+ def generate(model, field_reference)
5
+ phone = field_reference.phone
6
+ return nil if phone.blank?
7
+
8
+ Habarico::PhoneFieldOptions.new(
9
+ default_region: generate_default_region(model, phone),
10
+ allowed_regions: generate_allowed_regions(model, phone),
11
+ )
12
+ end
13
+
14
+ protected
15
+
16
+ # ***********************************************************************
17
+ # Attribute generators
18
+ # ***********************************************************************
19
+
20
+ def generate_default_region(_model, phone)
21
+ phone[:default_region]
22
+ end
23
+
24
+ def generate_allowed_regions(_model, phone)
25
+ phone[:allowed_regions]
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,90 @@
1
+ module Habarico
2
+ class RelationFieldOptionsGenerator < AbstractGenerator
3
+
4
+ def generate(model, field_reference)
5
+ relation = field_reference.relation
6
+ parent = field_reference.parent
7
+
8
+ return nil if relation.present? && !relation.is_a?(Hash)
9
+ return nil if relation.blank? && parent.blank?
10
+
11
+ hash = relation.is_a?(Hash) ? relation : {}
12
+
13
+ Habarico::RelationFieldOptions.new(
14
+ show_link: generate_show_link(model, hash),
15
+ link_mode: generate_link_mode(model, hash),
16
+ dialog_width: generate_dialog_width(model, hash),
17
+ keep_linked_parent: generate_keep_linked_parent(model, hash),
18
+ show_edit_button: generate_show_edit_button(model, hash),
19
+ show_create_button: generate_show_create_button(model, hash),
20
+ preserve_order: generate_preserve_order(model, hash),
21
+ filters: generate_filters(model, hash),
22
+ sort: generate_sort(model, hash),
23
+ parent: generate_parent(model, hash, parent),
24
+ )
25
+ end
26
+
27
+ protected
28
+
29
+ # ***********************************************************************
30
+ # Attribute generators
31
+ # ***********************************************************************
32
+
33
+ def generate_show_link(_model, hash)
34
+ hash[:show_link]
35
+ end
36
+
37
+ def generate_link_mode(_model, hash)
38
+ hash[:link_mode]
39
+ end
40
+
41
+ def generate_dialog_width(_model, hash)
42
+ hash[:dialog_width]
43
+ end
44
+
45
+ def generate_keep_linked_parent(_model, hash)
46
+ hash[:keep_linked_parent]
47
+ end
48
+
49
+ def generate_show_edit_button(_model, hash)
50
+ hash[:show_edit_button]
51
+ end
52
+
53
+ def generate_show_create_button(_model, hash)
54
+ hash[:show_create_button]
55
+ end
56
+
57
+ def generate_preserve_order(_model, hash)
58
+ hash[:preserve_order]
59
+ end
60
+
61
+ def generate_filters(_model, hash)
62
+ Array(hash[:filters]).map do |f|
63
+ next f if f.is_a?(Habarico::KeyValue)
64
+ Habarico::KeyValue.new(key: f[:key] || f['key'], value: f[:value] || f['value'])
65
+ end.presence
66
+ end
67
+
68
+ def generate_sort(_model, hash)
69
+ sort = hash[:sort]
70
+ if sort.is_a?(String)
71
+ # Support 'field_name:direction' format (e.g. 'email:asc', 'created_at:desc')
72
+ parts = sort.split(':')
73
+ Habarico::SortDescriptor.new(
74
+ field_name: parts[0],
75
+ direction: parts[1] == 'desc' ? 'desc' : 'asc'
76
+ )
77
+ elsif sort.is_a?(Hash)
78
+ Habarico::SortDescriptor.new(
79
+ field_name: sort[:field_name] || sort['field_name'],
80
+ direction: sort[:direction] || sort['direction']
81
+ )
82
+ end
83
+ end
84
+
85
+ def generate_parent(_model, hash, field_reference_parent)
86
+ hash[:parent] || field_reference_parent
87
+ end
88
+
89
+ end
90
+ end
@@ -0,0 +1,44 @@
1
+ module Habarico
2
+ class SearchFilterSchemaGenerator < AbstractGenerator
3
+
4
+ def generate(model)
5
+ Habarico::FilterSchema.new(
6
+ name: generate_name(model),
7
+ type: generate_type(model),
8
+ format: generate_format(model),
9
+ label: generate_label(model),
10
+ help_text: generate_help_text(model),
11
+ )
12
+ end
13
+
14
+ protected
15
+
16
+ # ***********************************************************************
17
+ # Attribute generators
18
+ # ***********************************************************************
19
+
20
+ def generate_name(_model)
21
+ 'search'
22
+ end
23
+
24
+ def generate_type(_model)
25
+ 'string'
26
+ end
27
+
28
+ def generate_format(_model)
29
+ 'search'
30
+ end
31
+
32
+ def generate_label(model)
33
+ # Per-model override first (e.g. "Search by VS or counter-account"), then Habarico's
34
+ # generic translated label, and finally the literal 'search' as a last resort.
35
+ I18n.t("#{model.i18n_scope}.attributes.#{model.model_name.i18n_key}.search",
36
+ default: I18n.t('filters.common.search', default: 'search'))
37
+ end
38
+
39
+ def generate_help_text(model)
40
+ generate_label(model)
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,63 @@
1
+ module Habarico
2
+ class MenuGroupSchemaGenerator < AbstractGenerator
3
+
4
+ def generate(menu_path)
5
+ # Validate arguments
6
+ raise Eluvia::Errors::StandardError.new('Argument `menu_path` must be an array of Habarico::MenuItem objects') unless menu_path.is_a?(::Array) && menu_path.all? { |b| b.is_a?(Habarico::MenuItem) }
7
+
8
+ # Pop last breadcrumb as current menu item
9
+ menu_path_2 = menu_path.dup
10
+ menu_item = menu_path_2.pop
11
+ return nil if menu_item.nil?
12
+
13
+ # Create model
14
+ Habarico::MenuGroupSchema.new(
15
+ name: generate_name(menu_item),
16
+ label: generate_label(menu_item),
17
+ icon: generate_icon(menu_item),
18
+ color: generate_color(menu_item),
19
+ priority: generate_priority(menu_item),
20
+ parent: generate_parent(menu_path_2),
21
+ )
22
+ end
23
+
24
+ protected
25
+
26
+ def menu_group_schema_generator
27
+ @menu_group_schema_generator ||= definition.menu_group_schema_generator.new(definition, resource_path)
28
+ end
29
+
30
+ # ***********************************************************************
31
+ # Attribute generators
32
+ # ***********************************************************************
33
+
34
+ def generate_name(menu_item)
35
+ menu_item.name
36
+ end
37
+
38
+ def generate_label(menu_item)
39
+ menu_item.label
40
+ end
41
+
42
+ def generate_icon(menu_item)
43
+ menu_item.icon
44
+ end
45
+
46
+ def generate_color(menu_item)
47
+ menu_item.color
48
+ end
49
+
50
+ def generate_priority(menu_item)
51
+ menu_item.priority
52
+ end
53
+
54
+ def generate_parent(menu_path)
55
+ if menu_path.empty?
56
+ nil
57
+ else
58
+ menu_group_schema_generator.generate(menu_path)
59
+ end
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,31 @@
1
+ module Habarico
2
+ class MenuLinkParametersGenerator < AbstractGenerator
3
+
4
+ def generate(menu_item)
5
+ # Validate arguments
6
+ raise Eluvia::Errors::StandardError.new('Argument `menu_item` must be a Habarico::MenuItem') unless menu_item.is_a?(Habarico::MenuItem)
7
+ raise Eluvia::Errors::StandardError.new('Argument `menu_item` must be of :link type') unless menu_item.type.to_sym == :link
8
+
9
+ # Create model
10
+ Habarico::LinkActionParameters.new(
11
+ url: generate_url(menu_item),
12
+ target: generate_target(menu_item)
13
+ )
14
+ end
15
+
16
+ protected
17
+
18
+ # ***********************************************************************
19
+ # Attribute generators
20
+ # ***********************************************************************
21
+
22
+ def generate_url(menu_item)
23
+ menu_item.link_url
24
+ end
25
+
26
+ def generate_target(menu_item)
27
+ menu_item.link_target
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,105 @@
1
+ module Habarico
2
+ class MenuSchemaGenerator < AbstractGenerator
3
+
4
+ def generate(menu_item, menu_path)
5
+ # Validate arguments
6
+ raise Eluvia::Errors::StandardError.new('Definition `menu_item` must be a Habarico::MenuItem object') unless menu_item.is_a?(Habarico::MenuItem)
7
+
8
+ # Create model
9
+ Habarico::MenuSchema.new(
10
+ name: generate_name(menu_item),
11
+ label: generate_label(menu_item),
12
+ icon: generate_icon(menu_item),
13
+ color: generate_color(menu_item),
14
+ priority: generate_priority(menu_item),
15
+ type: generate_type(menu_item),
16
+ view: generate_view(menu_item),
17
+ link: generate_link(menu_item),
18
+ parent: generate_parent(menu_path)
19
+ )
20
+ end
21
+
22
+ protected
23
+
24
+ def menu_group_schema_generator
25
+ @menu_group_schema_generator ||= definition.menu_group_schema_generator.new(definition, resource_path)
26
+ end
27
+
28
+ def menu_view_parameters_generator
29
+ @menu_view_parameters_generator ||= definition.menu_view_parameters_generator.new(definition, resource_path)
30
+ end
31
+
32
+ def menu_link_parameters_generator
33
+ @menu_link_parameters_generator ||= definition.menu_link_parameters_generator.new(definition, resource_path)
34
+ end
35
+
36
+ # ***********************************************************************
37
+ # Attribute generators
38
+ # ***********************************************************************
39
+
40
+ def generate_name(menu_item)
41
+ return menu_item.name if menu_item.name
42
+
43
+ # Compute prefix from this or referenced resource
44
+ prefix = nil
45
+ if menu_item.reference.present?
46
+ prefix = Habarico::ResourceService.instance.find_resource_name_by_model_class_or_instance(menu_item.reference)
47
+ end
48
+ if prefix.nil?
49
+ prefix = resource_path.last
50
+ end
51
+
52
+ # Compute suffix from view name or link url
53
+ suffix = if menu_item.type.to_sym == :view && menu_item.view_name
54
+ menu_item.view_name
55
+ elsif menu_item.type.to_sym == :link && menu_item.link_url
56
+ menu_item.link_url.gsub(/[^a-zA-Z0-9]/, '_')
57
+ else
58
+ 'item'
59
+ end
60
+
61
+ "#{prefix}-#{suffix}"
62
+ end
63
+
64
+ def generate_label(menu_item)
65
+ menu_item.label || definition.label || I18n.t("resources.#{resource_path.join('.')}", default: generate_name(menu_item).to_s.humanize)
66
+ end
67
+
68
+ def generate_icon(menu_item)
69
+ menu_item.icon || definition.icon
70
+ end
71
+
72
+ def generate_color(menu_item)
73
+ menu_item.color
74
+ end
75
+
76
+ def generate_priority(menu_item)
77
+ menu_item.priority
78
+ end
79
+
80
+ def generate_type(menu_item)
81
+ menu_item.type
82
+ end
83
+
84
+ def generate_view(menu_item)
85
+ if menu_item.type.to_sym == :view
86
+ menu_view_parameters_generator.generate(menu_item)
87
+ end
88
+ end
89
+
90
+ def generate_link(menu_item)
91
+ if menu_item.type.to_sym == :link
92
+ menu_link_parameters_generator.generate(menu_item)
93
+ end
94
+ end
95
+
96
+ def generate_parent(menu_path)
97
+ if menu_path.blank? || menu_path.empty?
98
+ nil
99
+ else
100
+ menu_group_schema_generator.generate(menu_path)
101
+ end
102
+ end
103
+
104
+ end
105
+ end
@@ -0,0 +1,44 @@
1
+ module Habarico
2
+ class MenuViewEndpointParametersGenerator < AbstractGenerator
3
+
4
+ def generate(menu_item)
5
+ # Validate arguments
6
+ raise Eluvia::Errors::StandardError.new('Argument `menu_item` must be a Habarico::MenuItem') unless menu_item.is_a?(Habarico::MenuItem)
7
+ raise Eluvia::Errors::StandardError.new('Argument `menu_item` must be of :view type') unless menu_item.type.to_sym == :view
8
+
9
+ # Create model
10
+ Habarico::ViewActionEndpointParameters.new(
11
+ reference: generate_reference(menu_item),
12
+ action_name: generate_action_name(menu_item),
13
+ record_pk: generate_record_pk(menu_item)
14
+ )
15
+ end
16
+
17
+ protected
18
+
19
+ # ***********************************************************************
20
+ # Attribute generators
21
+ # ***********************************************************************
22
+
23
+ def generate_reference(menu_item)
24
+ if menu_item.reference.present?
25
+ return Habarico::ResourceService.instance.find_resource_name_by_model_class_or_instance(menu_item.reference)
26
+ end
27
+ nil
28
+ end
29
+
30
+ def generate_action_name(menu_item)
31
+ menu_item.reference_action_name
32
+ end
33
+
34
+ def generate_record_pk(menu_item)
35
+ if menu_item.reference.present?
36
+ if Habarico::ReflectionHelper.is_active_record_instance?(menu_item.reference)
37
+ return menu_item.reference.id
38
+ end
39
+ end
40
+ nil
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,50 @@
1
+ module Habarico
2
+ class MenuViewParametersGenerator < AbstractGenerator
3
+
4
+ def generate(menu_item)
5
+ # Validate arguments
6
+ raise Eluvia::Errors::StandardError.new('Argument `menu_item` must be a Habarico::MenuItem') unless menu_item.is_a?(Habarico::MenuItem)
7
+ raise Eluvia::Errors::StandardError.new('Argument `menu_item` must be of :view type') unless menu_item.type.to_sym == :view
8
+
9
+ # Create model
10
+ Habarico::ViewActionParameters.new(
11
+ name: generate_name(menu_item),
12
+ mode: generate_mode(menu_item),
13
+ dialog_width: generate_dialog_width(menu_item),
14
+ endpoint: generate_endpoint(menu_item),
15
+ keep_linked_parent: generate_keep_linked_parent(menu_item)
16
+ )
17
+ end
18
+
19
+ protected
20
+
21
+ def menu_view_endpoint_parameters_generator
22
+ @menu_view_endpoint_parameters_generator ||= definition.menu_view_endpoint_parameters_generator.new(definition, resource_path)
23
+ end
24
+
25
+ # ***********************************************************************
26
+ # Attribute generators
27
+ # ***********************************************************************
28
+
29
+ def generate_name(menu_item)
30
+ menu_item.view_name
31
+ end
32
+
33
+ def generate_mode(menu_item)
34
+ menu_item.view_mode
35
+ end
36
+
37
+ def generate_dialog_width(menu_item)
38
+ menu_item.dialog_width
39
+ end
40
+
41
+ def generate_endpoint(menu_item)
42
+ menu_view_endpoint_parameters_generator.generate(menu_item)
43
+ end
44
+
45
+ def generate_keep_linked_parent(menu_item)
46
+ menu_item.view_keep_linked_parent
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,84 @@
1
+ module Habarico
2
+ class ActionResourceSchemaGenerator < ResourceSchemaGenerator
3
+
4
+ def generate(action_name, context)
5
+ view = definition.normalized_views.find { |view| view.endpoint_action_name == action_name }
6
+ action = definition.normalized_actions.find { |action| action.is_a?(Habarico::ResourceAction) && action.endpoint_action_name == action_name }
7
+ if view
8
+ generate_view_action(action_name, view, context)
9
+ elsif action
10
+ generate_resource_action(action_name, action, context)
11
+ else
12
+ Habarico::LocalResourceSchema.new(
13
+ name: generate_name,
14
+ label: generate_label,
15
+ pk_field_name: generate_pk_field_name
16
+ )
17
+ end
18
+ end
19
+
20
+ protected
21
+
22
+ def resource_action_schema_generator
23
+ @resource_action_schema_generator ||= definition.resource_action_schema_generator.new(definition, resource_path)
24
+ end
25
+
26
+ def view_schema_generator
27
+ @view_schema_generator ||= definition.view_schema_generator.new(definition, resource_path)
28
+ end
29
+
30
+ def endpoints_schema_generator
31
+ @endpoints_schema_generator ||= definition.endpoints_schema_generator.new(definition, resource_path)
32
+ end
33
+
34
+ # ***********************************************************************
35
+ # Attribute generators
36
+ # ***********************************************************************
37
+
38
+ def generate_actions(_action_name, _context)
39
+ []
40
+ end
41
+
42
+ def generate_view_action(action_name, view, context)
43
+ # Generate view schema
44
+ view_schema = view_schema_generator.generate(view, context)
45
+
46
+ # Generate endpoint schema
47
+ model = view.model || definition.model
48
+ read_fields = write_fields = view.boxes
49
+ endpoints_schema = endpoints_schema_generator.generate(model, read_fields, write_fields, [], [view_schema.endpoint.method.to_sym])
50
+
51
+ # Create model
52
+ Habarico::LocalResourceSchema.new(
53
+ name: generate_name,
54
+ label: generate_label,
55
+ pk_field_name: generate_pk_field_name,
56
+ actions: generate_actions(action_name, context),
57
+ views: [view_schema],
58
+ endpoints: endpoints_schema
59
+ )
60
+ end
61
+
62
+ def generate_resource_action(action_name, action, context)
63
+ # Generate resource action schema
64
+ resource_action_schema = resource_action_schema_generator.generate(action, context)
65
+ raise Eluvia::Errors::StandardError.new("Action `#{action_name}` must be a resource action") unless resource_action_schema.resource&.endpoint
66
+
67
+ # Generate endpoint schema
68
+ endpoints_schema = endpoints_schema_generator.generate(definition.model,
69
+ [], [], [],
70
+ [resource_action_schema.resource.endpoint.method.to_sym])
71
+
72
+ # Create model
73
+ Habarico::LocalResourceSchema.new(
74
+ name: generate_name,
75
+ label: generate_label,
76
+ pk_field_name: generate_pk_field_name,
77
+ actions: generate_actions(action_name, context),
78
+ views: [],
79
+ endpoints: endpoints_schema
80
+ )
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,70 @@
1
+ module Habarico
2
+ class GlobalResourceSchemaGenerator < ResourceSchemaGenerator
3
+
4
+ def generate(context)
5
+ Habarico::GlobalResourceSchema.new(
6
+ name: generate_name,
7
+ label: generate_label,
8
+ pk_field_name: generate_pk_field_name,
9
+ actions: generate_actions(context),
10
+ views: generate_views(context),
11
+ menu: generate_menu(context),
12
+ )
13
+ end
14
+
15
+ protected
16
+
17
+ def global_resource_action_schema_generator
18
+ @global_resource_action_schema_generator ||= definition.global_resource_action_schema_generator.new(definition, resource_path)
19
+ end
20
+
21
+ def global_view_schema_generator
22
+ @global_view_schema_generator ||= definition.global_view_schema_generator.new(definition, resource_path)
23
+ end
24
+
25
+ def menu_schema_generator
26
+ @menu_schema_generator ||= definition.menu_schema_generator.new(definition, resource_path)
27
+ end
28
+
29
+ # ***********************************************************************
30
+ # Attribute generators
31
+ # ***********************************************************************
32
+
33
+ def generate_actions(context)
34
+ # Generate and filter actions based on permissions
35
+ definition.normalized_actions.select do |action|
36
+
37
+ # Action must be allowed by permissions
38
+ context.can?(action.permission)
39
+
40
+ end.map do |action|
41
+
42
+ # Generate action schema
43
+ global_resource_action_schema_generator.generate(action)
44
+
45
+ end
46
+ end
47
+
48
+ def generate_views(context)
49
+ # Generate and filter views based on permissions
50
+ definition.normalized_views.select do |view|
51
+
52
+ # View must be allowed by permissions
53
+ context.can?(view.permission)
54
+
55
+ end.map do |view|
56
+
57
+ # Generate view schema
58
+ global_view_schema_generator.generate(view)
59
+
60
+ end
61
+ end
62
+
63
+ def generate_menu(context)
64
+ return nil unless context.can?(:read)
65
+ return nil if definition.menu_item == false
66
+ menu_schema_generator.generate(definition.menu_item || Habarico::ViewMenuItem.new(view_name: 'list'), definition.menu_path)
67
+ end
68
+
69
+ end
70
+ end