avo 3.0.0.beta1 → 3.0.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of avo might be problematic. Click here for more details.

Files changed (215) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +5 -5
  3. data/Gemfile.lock +81 -92
  4. data/{public/avo-assets/avo.css → app/assets/builds/avo.base.css} +686 -728
  5. data/app/assets/builds/avo.base.js +93804 -0
  6. data/app/assets/builds/avo.base.js.map +7 -0
  7. data/app/assets/stylesheets/avo.base.css +2 -1
  8. data/app/assets/svgs/failed_to_load.svg +1 -0
  9. data/app/assets/svgs/grid-empty-state.svg +1 -0
  10. data/app/assets/svgs/table-empty-state.svg +1 -0
  11. data/app/assets/svgs/triangle-up.svg +1 -1
  12. data/app/components/avo/actions_component.html.erb +1 -1
  13. data/app/components/avo/actions_component.rb +16 -42
  14. data/app/components/avo/alert_component.html.erb +1 -1
  15. data/app/components/avo/base_component.rb +7 -7
  16. data/app/components/avo/field_wrapper_component.html.erb +4 -4
  17. data/app/components/avo/field_wrapper_component.rb +1 -1
  18. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +5 -5
  19. data/app/components/avo/fields/belongs_to_field/edit_component.rb +4 -8
  20. data/app/components/avo/fields/boolean_field/edit_component.html.erb +0 -1
  21. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +1 -1
  22. data/app/components/avo/fields/code_field/edit_component.html.erb +0 -1
  23. data/app/components/avo/fields/common/files_list_viewer_component.html.erb +5 -0
  24. data/app/components/avo/fields/common/files_list_viewer_component.rb +8 -0
  25. data/app/components/avo/fields/common/heading_component.html.erb +1 -1
  26. data/app/components/avo/fields/common/single_file_viewer_component.html.erb +56 -0
  27. data/app/components/avo/fields/common/single_file_viewer_component.rb +55 -0
  28. data/app/components/avo/fields/country_field/edit_component.html.erb +1 -3
  29. data/app/components/avo/fields/file_field/edit_component.html.erb +2 -4
  30. data/app/components/avo/fields/file_field/edit_component.rb +0 -1
  31. data/app/components/avo/fields/file_field/index_component.rb +2 -2
  32. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  33. data/app/components/avo/fields/files_field/edit_component.html.erb +2 -4
  34. data/app/components/avo/fields/files_field/edit_component.rb +0 -1
  35. data/app/components/avo/fields/files_field/show_component.html.erb +1 -1
  36. data/app/components/avo/fields/has_many_field/show_component.html.erb +1 -1
  37. data/app/components/avo/fields/has_one_field/show_component.html.erb +4 -5
  38. data/app/components/avo/fields/has_one_field/show_component.rb +2 -6
  39. data/app/components/avo/fields/index_component.rb +0 -1
  40. data/app/components/avo/fields/markdown_field/edit_component.html.erb +3 -4
  41. data/app/components/avo/fields/markdown_field/show_component.html.erb +3 -3
  42. data/app/components/avo/fields/number_field/edit_component.html.erb +1 -3
  43. data/app/components/avo/fields/password_field/edit_component.html.erb +1 -3
  44. data/app/components/avo/fields/progress_bar_field/edit_component.html.erb +0 -1
  45. data/app/components/avo/fields/select_field/edit_component.html.erb +1 -2
  46. data/app/components/avo/fields/status_field/edit_component.html.erb +1 -1
  47. data/app/components/avo/fields/text_field/edit_component.html.erb +2 -3
  48. data/app/components/avo/fields/textarea_field/edit_component.html.erb +0 -1
  49. data/app/components/avo/fields/trix_field/edit_component.html.erb +1 -2
  50. data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
  51. data/app/components/avo/index/field_wrapper_component.html.erb +1 -1
  52. data/app/components/avo/index/field_wrapper_component.rb +12 -0
  53. data/app/components/avo/index/grid_item_component.html.erb +35 -9
  54. data/app/components/avo/index/grid_item_component.rb +10 -36
  55. data/app/components/avo/index/resource_controls_component.rb +11 -8
  56. data/app/components/avo/index/resource_table_component.rb +1 -1
  57. data/app/components/avo/item_switcher_component.html.erb +5 -10
  58. data/app/components/avo/item_switcher_component.rb +1 -2
  59. data/app/components/avo/modal_component.html.erb +1 -1
  60. data/app/components/avo/panel_component.html.erb +1 -6
  61. data/app/components/avo/panel_component.rb +0 -1
  62. data/app/components/avo/profile_item_component.html.erb +2 -17
  63. data/app/components/avo/profile_item_component.rb +1 -13
  64. data/app/components/avo/referrer_params_component.html.erb +0 -2
  65. data/app/components/avo/resource_component.rb +6 -69
  66. data/app/components/avo/resource_sidebar_component.rb +1 -1
  67. data/app/components/avo/sidebar/link_component.html.erb +0 -2
  68. data/app/components/avo/sidebar/link_component.rb +3 -5
  69. data/app/components/avo/sidebar_component.html.erb +3 -3
  70. data/app/components/avo/sidebar_component.rb +4 -4
  71. data/app/components/avo/sidebar_profile_component.html.erb +27 -27
  72. data/app/components/avo/views/resource_edit_component.html.erb +5 -5
  73. data/app/components/avo/views/resource_edit_component.rb +1 -1
  74. data/app/components/avo/views/resource_index_component.html.erb +10 -19
  75. data/app/components/avo/views/resource_index_component.rb +16 -22
  76. data/app/components/avo/views/resource_show_component.html.erb +4 -4
  77. data/app/controllers/avo/actions_controller.rb +20 -20
  78. data/app/controllers/avo/application_controller.rb +67 -90
  79. data/app/controllers/avo/associations_controller.rb +7 -5
  80. data/app/controllers/avo/attachments_controller.rb +7 -22
  81. data/app/controllers/avo/base_controller.rb +35 -47
  82. data/app/controllers/avo/home_controller.rb +1 -1
  83. data/app/controllers/avo/search_controller.rb +16 -20
  84. data/app/controllers/concerns/avo/initializes_avo.rb +8 -3
  85. data/app/helpers/avo/application_helper.rb +6 -13
  86. data/app/javascript/js/application.js +0 -2
  87. data/app/javascript/js/controllers/fields/{easy_mde_controller.js → simple_mde_controller.js} +3 -4
  88. data/app/javascript/js/controllers/search_controller.js +1 -3
  89. data/app/javascript/js/controllers.js +2 -2
  90. data/app/views/avo/actions/show.html.erb +3 -5
  91. data/app/views/avo/associations/new.html.erb +3 -3
  92. data/app/views/avo/debug/status.html.erb +5 -6
  93. data/app/views/avo/home/index.html.erb +1 -1
  94. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  95. data/app/views/avo/partials/_footer.html.erb +1 -1
  96. data/app/views/avo/partials/_javascript.html.erb +1 -1
  97. data/app/views/avo/partials/_navbar.html.erb +1 -1
  98. data/app/views/avo/partials/_table_header.html.erb +8 -0
  99. data/app/views/avo/partials/_view_toggle_button.html.erb +0 -9
  100. data/app/views/avo/private/design.html.erb +2 -2
  101. data/app/views/layouts/avo/application.html.erb +3 -2
  102. data/avo.gemspec +1 -2
  103. data/config/initializers/pagy.rb +10 -12
  104. data/config/routes.rb +5 -5
  105. data/db/factories.rb +0 -17
  106. data/lib/avo/app.rb +165 -0
  107. data/lib/avo/base_action.rb +18 -31
  108. data/lib/avo/base_resource.rb +213 -238
  109. data/lib/avo/concerns/breadcrumbs.rb +2 -2
  110. data/lib/avo/concerns/can_replace_items.rb +7 -3
  111. data/lib/avo/concerns/filters_session_handler.rb +4 -5
  112. data/lib/avo/concerns/has_item_type.rb +0 -4
  113. data/lib/avo/concerns/has_items.rb +115 -93
  114. data/lib/avo/concerns/is_visible.rb +1 -1
  115. data/lib/avo/concerns/model_class_constantized.rb +2 -0
  116. data/lib/avo/configuration.rb +8 -9
  117. data/lib/avo/current.rb +1 -35
  118. data/lib/avo/dsl/field_parser.rb +1 -1
  119. data/lib/avo/dynamic_router.rb +2 -13
  120. data/lib/avo/engine.rb +13 -11
  121. data/lib/avo/execution_context.rb +2 -4
  122. data/lib/avo/fields/base_field.rb +14 -51
  123. data/lib/avo/fields/belongs_to_field.rb +13 -20
  124. data/lib/avo/fields/concerns/is_searchable.rb +1 -1
  125. data/lib/avo/fields/concerns/use_resource.rb +1 -1
  126. data/lib/avo/fields/date_field.rb +3 -16
  127. data/lib/avo/fields/field_manager.rb +3 -13
  128. data/lib/avo/fields/file_field.rb +0 -2
  129. data/lib/avo/fields/files_field.rb +0 -6
  130. data/lib/avo/fields/has_base_field.rb +5 -5
  131. data/lib/avo/fields/has_one_field.rb +1 -2
  132. data/lib/avo/fields/id_field.rb +1 -2
  133. data/lib/avo/filters/base_filter.rb +0 -9
  134. data/lib/avo/grid_collector.rb +40 -0
  135. data/lib/avo/html/builder.rb +1 -3
  136. data/lib/avo/licensing/h_q.rb +6 -11
  137. data/lib/avo/licensing/license.rb +1 -1
  138. data/lib/avo/licensing/license_manager.rb +1 -1
  139. data/lib/avo/licensing/{nil_license.rb → null_license.rb} +1 -1
  140. data/lib/avo/loaders/fields_loader.rb +1 -7
  141. data/lib/avo/plugin.rb +0 -10
  142. data/lib/avo/plugin_manager.rb +4 -2
  143. data/lib/avo/reloader.rb +1 -1
  144. data/lib/avo/resources/controls/actions_list.rb +1 -2
  145. data/lib/avo/resources/controls/create_button.rb +1 -1
  146. data/lib/avo/resources/controls/delete_button.rb +1 -1
  147. data/lib/avo/resources/controls/detach_button.rb +1 -1
  148. data/lib/avo/resources/controls/edit_button.rb +1 -1
  149. data/lib/avo/resources/controls/show_button.rb +1 -1
  150. data/lib/avo/resources/items/holder.rb +5 -13
  151. data/lib/avo/resources/items/item_group.rb +0 -1
  152. data/lib/avo/resources/resource_manager.rb +18 -11
  153. data/lib/avo/services/debug_service.rb +5 -6
  154. data/lib/avo/services/telemetry_service.rb +2 -3
  155. data/lib/avo/version.rb +1 -1
  156. data/lib/avo.rb +25 -109
  157. data/lib/generators/avo/action_generator.rb +8 -8
  158. data/lib/generators/avo/card/chartkick_generator.rb +18 -0
  159. data/lib/generators/avo/card/metric_generator.rb +18 -0
  160. data/lib/generators/avo/card/partial_generator.rb +19 -0
  161. data/lib/generators/avo/eject_generator.rb +0 -1
  162. data/lib/generators/avo/filter_generator.rb +8 -8
  163. data/lib/generators/avo/install_generator.rb +1 -11
  164. data/lib/generators/avo/resource_generator.rb +4 -22
  165. data/lib/generators/avo/tailwindcss/install_generator.rb +1 -4
  166. data/lib/generators/avo/templates/action.tt +5 -7
  167. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  168. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  169. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  170. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  171. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  172. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  173. data/lib/generators/avo/templates/dashboards/dashboard.tt +3 -5
  174. data/lib/generators/avo/templates/initializer/avo.tt +2 -4
  175. data/lib/generators/avo/templates/resource/resource.tt +6 -6
  176. data/lib/generators/avo/templates/scope.tt +1 -1
  177. data/lib/generators/avo/templates/standalone_action.tt +8 -0
  178. data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
  179. data/lib/tasks/avo_tasks.rake +0 -5
  180. metadata +19 -56
  181. data/app/assets/svgs/map-empty-state.svg +0 -35
  182. data/app/assets/svgs/map-view-type.svg +0 -3
  183. data/app/components/avo/fields/area_field/edit_component.html.erb +0 -7
  184. data/app/components/avo/fields/area_field/edit_component.rb +0 -4
  185. data/app/components/avo/fields/area_field/show_component.html.erb +0 -8
  186. data/app/components/avo/fields/area_field/show_component.rb +0 -4
  187. data/app/components/avo/fields/common/files/controls_component.html.erb +0 -29
  188. data/app/components/avo/fields/common/files/controls_component.rb +0 -19
  189. data/app/components/avo/fields/common/files/list_viewer_component.html.erb +0 -20
  190. data/app/components/avo/fields/common/files/list_viewer_component.rb +0 -41
  191. data/app/components/avo/fields/common/files/view_type/grid_component.html.erb +0 -27
  192. data/app/components/avo/fields/common/files/view_type/grid_component.rb +0 -51
  193. data/app/components/avo/fields/common/files/view_type/list_component.html.erb +0 -22
  194. data/app/components/avo/fields/common/files/view_type/list_component.rb +0 -15
  195. data/app/components/avo/fields/location_field/edit_component.html.erb +0 -22
  196. data/app/components/avo/fields/location_field/edit_component.rb +0 -4
  197. data/app/components/avo/fields/location_field/show_component.html.erb +0 -7
  198. data/app/components/avo/fields/location_field/show_component.rb +0 -4
  199. data/app/components/avo/index/resource_map_component.html.erb +0 -16
  200. data/app/components/avo/index/resource_map_component.rb +0 -109
  201. data/app/components/avo/row_component.html.erb +0 -3
  202. data/app/components/avo/row_component.rb +0 -12
  203. data/app/views/avo/attachments/destroy.turbo_stream.erb +0 -7
  204. data/app/views/avo/partials/_profile_menu_extra.html.erb +0 -2
  205. data/lib/avo/concerns/has_description.rb +0 -23
  206. data/lib/avo/fields/area_field.rb +0 -39
  207. data/lib/avo/fields/concerns/file_authorization.rb +0 -31
  208. data/lib/avo/fields/location_field.rb +0 -86
  209. data/lib/avo/resources/items/row.rb +0 -54
  210. data/lib/generators/avo/card_generator.rb +0 -27
  211. data/public/avo-assets/avo.base.css +0 -10542
  212. data/public/avo-assets/avo.base.js +0 -949
  213. data/public/avo-assets/avo.base.js.map +0 -7
  214. data/public/avo-assets/avo.js +0 -513
  215. data/public/avo-assets/avo.js.map +0 -7
@@ -1,3 +1,4 @@
1
+
1
2
  module Avo
2
3
  module Concerns
3
4
  module FiltersSessionHandler
@@ -33,11 +34,9 @@ module Avo
33
34
  end
34
35
 
35
36
  def cache_resource_filters?
36
- Avo::ExecutionContext.new(
37
- target: Avo.configuration.cache_resource_filters,
38
- current_user: current_user,
39
- resource: @resource
40
- ).handle
37
+ return Avo.configuration.cache_resource_filters unless Avo.configuration.cache_resource_filters.is_a?(Proc)
38
+
39
+ Avo.configuration.cache_resource_filters.call(current_user: current_user, resource: @resource)
41
40
  end
42
41
  end
43
42
  end
@@ -33,10 +33,6 @@ module Avo
33
33
  def is_sidebar?
34
34
  self.class.ancestors.include?(Avo::Resources::Items::Sidebar)
35
35
  end
36
-
37
- def is_row?
38
- self.class.respond_to?(:item_type) && self.class.item_type == :row
39
- end
40
36
  end
41
37
  end
42
38
  end
@@ -3,117 +3,154 @@ module Avo
3
3
  module HasItems
4
4
  extend ActiveSupport::Concern
5
5
 
6
- class_methods do
7
- def deprecated_dsl_api(name, method)
8
- message = "This API was deprecated. Please use the `#{name}` method inside the `#{method}` method."
9
- raise DeprecatedAPIError.new message
10
- end
6
+ included do
7
+ class_attribute :items_holder
8
+ end
11
9
 
10
+ class_methods do
12
11
  # DSL methods
13
12
  def field(name, as: :text, **args, &block)
14
- deprecated_dsl_api __method__, "fields"
13
+ ensure_items_holder_initialized
14
+
15
+ items_holder.field name, as: as, **args, &block
15
16
  end
16
17
 
17
18
  def panel(name = nil, **args, &block)
18
- deprecated_dsl_api __method__, "fields"
19
- end
19
+ ensure_items_holder_initialized
20
20
 
21
- def row(**args, &block)
22
- deprecated_dsl_api __method__, "fields"
21
+ items_holder.panel name, **args, &block
23
22
  end
24
23
 
25
24
  def tabs(**args, &block)
26
- deprecated_dsl_api __method__, "fields"
25
+ ensure_items_holder_initialized
26
+
27
+ items_holder.tabs Avo::Resources::Items::TabGroup::Builder.parse_block(**args, &block)
27
28
  end
28
29
 
29
30
  def tool(klass, **args)
30
- deprecated_dsl_api __method__, "fields"
31
+ ensure_items_holder_initialized
32
+
33
+ items_holder.tool klass, **args
31
34
  end
32
35
 
33
36
  def heading(body, **args)
34
- deprecated_dsl_api __method__, "fields"
37
+ ensure_items_holder_initialized
38
+
39
+ items_holder.heading body, **args
35
40
  end
36
41
 
37
42
  def sidebar(**args, &block)
38
- deprecated_dsl_api __method__, "fields"
43
+ ensure_items_holder_initialized
44
+
45
+ items_holder.sidebar Avo::Resources::Items::Sidebar::Builder.parse_block(**args, &block)
39
46
  end
40
47
  # END DSL methods
41
- end
42
-
43
- attr_writer :items_holder
44
48
 
45
- delegate :invalid_fields, to: :items_holder
49
+ def items
50
+ if items_holder.present?
51
+ items_holder.items
52
+ else
53
+ []
54
+ end
55
+ end
46
56
 
47
- delegate :field, to: :items_holder
48
- delegate :panel, to: :items_holder
49
- delegate :row, to: :items_holder
50
- delegate :tabs, to: :items_holder
51
- delegate :tool, to: :items_holder
52
- delegate :heading, to: :items_holder
53
- delegate :sidebar, to: :items_holder
57
+ # Dives deep into panels and tabs to fetch all the fields for a resource.
58
+ def fields(only_root: false)
59
+ fields = []
54
60
 
55
- def items_holder
56
- @items_holder || Avo::Resources::Items::Holder.new
57
- end
61
+ items.each do |item|
62
+ next if item.nil?
58
63
 
59
- # def items
60
- # items_holder.items
61
- # end
64
+ unless only_root
65
+ # Dive into panels to fetch their fields
66
+ if item.is_panel?
67
+ fields << extract_fields_from_items(item)
68
+ end
62
69
 
63
- def invalid_fields
64
- items_holder.invalid_fields
65
- end
70
+ # Dive into tabs to fetch their fields
71
+ if item.is_tab_group?
72
+ item.items.map do |tab|
73
+ fields << extract_fields_from_items(tab)
74
+ end
75
+ end
66
76
 
67
- def fields(**args)
68
- self.class.fields(**args)
69
- end
77
+ # Dive into sidebar to fetch their fields
78
+ if item.is_sidebar?
79
+ fields << extract_fields_from_items(item)
80
+ end
81
+ end
70
82
 
71
- def tab_groups
72
- self.class.tab_groups
73
- end
83
+ if item.is_field?
84
+ fields << item
85
+ end
86
+ end
74
87
 
75
- # Dives deep into panels and tabs to fetch all the fields for a resource.
76
- def only_fields(only_root: false)
77
- fields = []
88
+ fields.flatten
89
+ end
78
90
 
79
- items.each do |item|
80
- next if item.nil?
91
+ def tab_groups
92
+ items.select do |item|
93
+ item.is_tab_group?
94
+ end
95
+ end
81
96
 
82
- unless only_root
83
- # Dive into panels to fetch their fields
84
- if item.is_panel?
85
- fields << extract_fields_from_items(item)
86
- end
97
+ private
87
98
 
88
- # Dive into tabs to fetch their fields
89
- if item.is_tab_group?
90
- item.items.map do |tab|
91
- fields << extract_fields_from_items(tab)
92
- end
93
- end
99
+ def extract_fields_from_items(thing)
100
+ fields = []
94
101
 
95
- # Dive into sidebar to fetch their fields
96
- if item.is_sidebar?
102
+ thing.items.each do |item|
103
+ if item.is_field?
104
+ fields << item
105
+ elsif item.is_panel?
97
106
  fields << extract_fields_from_items(item)
98
107
  end
99
108
  end
100
109
 
101
- if item.is_field?
102
- fields << item
103
- end
110
+ fields
111
+ end
104
112
 
105
- if item.is_row?
106
- fields << extract_fields_from_items(tab)
107
- end
113
+ def ensure_items_holder_initialized
114
+ self.items_holder ||= Avo::Resources::Items::Holder.new
108
115
  end
116
+ end
117
+
118
+ attr_accessor :items_holder
109
119
 
110
- fields.flatten
120
+ delegate :invalid_fields, to: :items_holder
121
+ delegate :items, to: :items_holder
122
+
123
+ def hydrate_fields
124
+ fields.map do |field|
125
+ field.hydrate(record: @record, view: @view, resource: self)
126
+ end
127
+ self
128
+ end
129
+
130
+ def fields(**args)
131
+ self.class.fields(**args)
132
+ end
133
+
134
+ def tab_groups
135
+ self.class.tab_groups
111
136
  end
112
137
 
113
138
  def get_field_definitions(only_root: false)
114
- only_fields(only_root: only_root).map do |field|
139
+ fields = self.fields(only_root: only_root)
140
+
141
+ return [] if fields.blank?
142
+
143
+ items = fields.map do |field|
115
144
  field.hydrate(resource: self, user: user, view: view)
116
145
  end
146
+
147
+ if Avo::App.license.lacks_with_trial(:advanced_fields)
148
+ items = items.reject do |field|
149
+ field.type == "tags"
150
+ end
151
+ end
152
+
153
+ items
117
154
  end
118
155
 
119
156
  def get_preview_fields
@@ -166,10 +203,7 @@ module Avo
166
203
  end
167
204
  end
168
205
 
169
- # hydrate_fields fields
170
- fields.each do |field|
171
- field.hydrate(record: @record, view: @view, resource: self)
172
- end
206
+ hydrate_fields
173
207
 
174
208
  fields
175
209
  end
@@ -222,10 +256,8 @@ module Avo
222
256
  panelfull_items.grep(Avo::Resources::Items::TabGroup).each do |tab_group|
223
257
  tab_group.items.grep(Avo::Resources::Items::Tab).each do |tab|
224
258
  tab.items.grep(Avo::Resources::Items::Panel).each do |panel|
225
- set_target_to_top panel.items.grep(Avo::Fields::BelongsToField)
226
-
227
- panel.items.grep(Avo::Resources::Items::Row).each do |row|
228
- set_target_to_top row.items.grep(Avo::Fields::BelongsToField)
259
+ panel.items.grep(Avo::Fields::BelongsToField).each do |field|
260
+ field.target = :_top
229
261
  end
230
262
  end
231
263
  end
@@ -261,6 +293,9 @@ module Avo
261
293
 
262
294
  item
263
295
  end
296
+ .select do |item|
297
+ item.visible_in_view?(view: view)
298
+ end
264
299
  .select do |item|
265
300
  item.visible?
266
301
  end
@@ -272,8 +307,7 @@ module Avo
272
307
  end
273
308
  end
274
309
  .select do |item|
275
- # On location field we can have field coordinates and setters with different names like latitude and longitude
276
- if !item.is_a?(Avo::Fields::LocationField) && !item.is_heading? && view.in?([:edit, :update, :new, :create])
310
+ if !item.is_heading? && view.in?([:edit, :update, :new, :create])
277
311
  if item.respond_to?(:id)
278
312
  item.resource.record.respond_to?("#{item.id}=")
279
313
  else
@@ -299,26 +333,14 @@ module Avo
299
333
  visible_items.blank?
300
334
  end
301
335
 
302
- private
336
+ def hydrate(**args)
337
+ super(**args)
303
338
 
304
- def set_target_to_top(fields)
305
- fields.each do |field|
306
- field.target = :_top
339
+ items_holder.items.each do |item|
340
+ item.hydrate(**args)
307
341
  end
308
- end
309
-
310
- def extract_fields_from_items(thing)
311
- fields = []
312
342
 
313
- thing.items.each do |item|
314
- if item.is_field?
315
- fields << item
316
- elsif item.is_panel? || item.is_row?
317
- fields << extract_fields_from_items(item)
318
- end
319
- end
320
-
321
- fields
343
+ self
322
344
  end
323
345
  end
324
346
  end
@@ -6,7 +6,7 @@ module Avo
6
6
 
7
7
  def visible?
8
8
  # Default to true
9
- return true if visible.nil?
9
+ return true unless visible.present?
10
10
 
11
11
  Avo::ExecutionContext.new(target: visible, resource: @resource).handle
12
12
  end
@@ -4,6 +4,8 @@ module Avo
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  class_methods do
7
+ attr_reader :model_class
8
+
7
9
  # Cast the model class to a constantized version and memoize it like that
8
10
  def model_class=(value)
9
11
  @model_class = case value
@@ -2,9 +2,8 @@ module Avo
2
2
  class Configuration
3
3
  include ResourceConfiguration
4
4
 
5
- attr_writer :app_name
6
- attr_writer :branding
7
5
  attr_writer :root_path
6
+ attr_accessor :app_name
8
7
  attr_accessor :timezone
9
8
  attr_accessor :per_page
10
9
  attr_accessor :per_page_steps
@@ -42,7 +41,7 @@ module Avo
42
41
  attr_accessor :field_wrapper_layout
43
42
  attr_accessor :sign_out_path_name
44
43
  attr_accessor :resources
45
- attr_accessor :prefix_path
44
+ attr_writer :branding
46
45
 
47
46
  def initialize
48
47
  @root_path = "/avo"
@@ -116,8 +115,8 @@ module Avo
116
115
  end
117
116
 
118
117
  def namespace
119
- if Avo.configuration.root_path.present?
120
- Avo.configuration.root_path.delete "/"
118
+ if computed_root_path.present?
119
+ computed_root_path.delete "/"
121
120
  else
122
121
  root_path.delete "/"
123
122
  end
@@ -129,6 +128,10 @@ module Avo
129
128
  @root_path
130
129
  end
131
130
 
131
+ def computed_root_path
132
+ Avo.configuration.root_path
133
+ end
134
+
132
135
  def feature_enabled?(feature)
133
136
  !@disabled_features.map(&:to_sym).include?(feature.to_sym)
134
137
  end
@@ -136,10 +139,6 @@ module Avo
136
139
  def branding
137
140
  Avo::Configuration::Branding.new(**@branding || {})
138
141
  end
139
-
140
- def app_name
141
- Avo::ExecutionContext.new(target: @app_name).handle
142
- end
143
142
  end
144
143
 
145
144
  def self.configuration
data/lib/avo/current.rb CHANGED
@@ -1,39 +1,5 @@
1
1
  class Avo::Current < ActiveSupport::CurrentAttributes
2
- # if Rails.env.development?
3
- # singleton_class.attr_accessor :previous_attributes
4
- # before_reset {
5
- # puts ["before_reset->", self.previous_attributes].inspect
6
- # if attributes.present?
7
- # puts ["has attributes->"].inspect
8
- # self.previous_attributes = attributes
9
- # end
10
- # puts ["before_reset->", self.previous_attributes].inspect
11
- # }
12
-
13
- # attr_accessor :previous_attributes
14
-
15
- # def previous_attributes=(value)
16
- # @previous_attributes = value
17
- # end
18
- # end
19
-
20
2
  attribute :app
21
3
  attribute :license
22
- attribute :context, :user, :view_context
23
- attribute :error_manager
24
- attribute :resource_manager
25
- attribute :tool_manager
26
- attribute :plugin_manager
27
-
28
- delegate :params, to: :request
29
-
30
- def request
31
- view_context.request || ActionDispatch::Request.empty
32
- end
33
-
34
- def current_user
35
- Rails.logger.warn "DEPRECATION WARNING: Avo::Current.current_user become deprecated and will become obsolete on futhure versions. Please use Avo::Current.user instead."
36
-
37
- user
38
- end
4
+ attribute :params, :request, :context, :current_user, :view_context
39
5
  end
@@ -72,7 +72,7 @@ module Avo
72
72
  end
73
73
 
74
74
  def field_class_from_symbol(symbol)
75
- matched_field = Avo.field_manager.all.find do |field|
75
+ matched_field = Avo::App.fields.all.find do |field|
76
76
  field[:name].to_s == symbol.to_s
77
77
  end
78
78
 
@@ -1,23 +1,12 @@
1
1
  module Avo
2
2
  class DynamicRouter
3
- def self.eager_load(entity)
4
- paths = Avo::ENTITIES.fetch entity
5
-
6
- return unless paths.present?
7
-
8
- pathname = Rails.root.join(*paths)
9
- if pathname.directory?
10
- Rails.autoloaders.main.eager_load_dir(pathname.to_s)
11
- end
12
- end
13
-
14
3
  def self.routes
15
4
  Avo::Engine.routes.draw do
16
5
  scope "resources", as: "resources" do
17
6
  # Check if the user chose to manually register the resource files.
18
7
  # If so, eager_load the resources dir.
19
8
  if Avo.configuration.resources.nil?
20
- Avo::DynamicRouter.eager_load(:resources) unless Rails.application.config.eager_load
9
+ Avo::App.eager_load(:resources) unless Rails.application.config.eager_load
21
10
  end
22
11
 
23
12
  Avo::Resources::ResourceManager.fetch_resources
@@ -28,7 +17,7 @@ module Avo
28
17
  resource.is_a? Class
29
18
  end
30
19
  .map do |resource|
31
- resources resource.route_key do
20
+ resources resource.new.route_key do
32
21
  member do
33
22
  get :preview
34
23
  end
data/lib/avo/engine.rb CHANGED
@@ -3,19 +3,20 @@ Gem.loaded_specs["avo"].dependencies.each do |d|
3
3
  case d.name
4
4
  when "activerecord"
5
5
  require "active_record/railtie"
6
- when "activesupport"
7
- require "active_support/railtie"
8
6
  when "actionview"
9
7
  require "action_view/railtie"
10
8
  when "activestorage"
11
9
  require "active_storage/engine"
12
- when "actiontext"
13
- require "action_text/engine"
14
10
  else
15
11
  require d.name
16
12
  end
17
13
  end
18
14
 
15
+ # In development we should load the engine so we get the autoload for components
16
+ if ENV["RAILS_ENV"] === "development"
17
+ require "view_component/engine"
18
+ end
19
+
19
20
  module Avo
20
21
  class Engine < ::Rails::Engine
21
22
  isolate_namespace Avo
@@ -25,7 +26,8 @@ module Avo
25
26
  ::Avo.asset_manager.reset
26
27
 
27
28
  # Boot Avo
28
- ::Avo.boot
29
+ ::Avo::App.boot
30
+ ::Avo.plugin_manager.boot_plugins
29
31
 
30
32
  # After deploy we want to make sure the license response is being cleared.
31
33
  # We need a fresh license response.
@@ -42,7 +44,7 @@ module Avo
42
44
  # Ensure we reboot the app when something changes
43
45
  config.to_prepare do
44
46
  # Boot Avo
45
- ::Avo.boot
47
+ ::Avo::App.boot
46
48
  end
47
49
 
48
50
  initializer "avo.autoload" do |app|
@@ -57,6 +59,10 @@ module Avo
57
59
  end
58
60
  end
59
61
 
62
+ initializer "avo.init_fields" do |app|
63
+ ::Avo::App.init_fields
64
+ end
65
+
60
66
  initializer "avo.reloader" do |app|
61
67
  Avo::Reloader.new.tap do |reloader|
62
68
  reloader.execute
@@ -67,7 +73,7 @@ module Avo
67
73
 
68
74
  initializer "avo.test_buddy" do |app|
69
75
  if Avo::IN_DEVELOPMENT
70
- Rails.autoloaders.main.push_dir Avo::Engine.root.join("spec", "testing_helpers")
76
+ Rails.autoloaders.main.push_dir Avo::Engine.root.join("spec", "helpers")
71
77
  end
72
78
  end
73
79
 
@@ -89,9 +95,5 @@ module Avo
89
95
  Rails::Generators.configure! app.config.generators
90
96
  require_relative "../generators/model_generator"
91
97
  end
92
-
93
- initializer "avo.locales" do |app|
94
- I18n.load_path += Dir[Avo::Engine.root.join("lib", "generators", "avo", "templates", "locales", "*.{rb,yml}")]
95
- end
96
98
  end
97
99
  end
@@ -1,6 +1,6 @@
1
1
  module Avo
2
2
  class ExecutionContext
3
- attr_accessor :target, :context, :params, :view_context, :current_user, :request, :include, :main_app, :avo
3
+ attr_accessor :target, :context, :params, :view_context, :current_user, :request, :include
4
4
 
5
5
  def initialize(**args)
6
6
  # Extend the class with custom modules if required.
@@ -20,12 +20,10 @@ module Avo
20
20
 
21
21
  # Set defaults on not initialized accessors
22
22
  @context ||= Avo::Current.context
23
- @current_user ||= Avo::Current.user
23
+ @current_user ||= Avo::Current.current_user
24
24
  @params ||= Avo::Current.params
25
25
  @request ||= Avo::Current.request
26
26
  @view_context ||= Avo::Current.view_context
27
- @main_app ||= @view_context.main_app
28
- @avo ||= @view_context.avo
29
27
  end
30
28
 
31
29
  delegate :result, to: :card