avo 3.0.0.pre12 → 3.0.0.pre15

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 (143) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/Gemfile.lock +2 -1
  4. data/app/assets/stylesheets/avo.base.css +1 -1
  5. data/app/components/avo/actions_component.html.erb +1 -1
  6. data/app/components/avo/actions_component.rb +40 -16
  7. data/app/components/avo/alert_component.html.erb +1 -1
  8. data/app/components/avo/base_component.rb +7 -7
  9. data/app/components/avo/field_wrapper_component.html.erb +2 -2
  10. data/app/components/avo/field_wrapper_component.rb +1 -1
  11. data/app/components/avo/fields/area_field/edit_component.html.erb +1 -1
  12. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +5 -5
  13. data/app/components/avo/fields/belongs_to_field/edit_component.rb +4 -4
  14. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -0
  15. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +1 -1
  16. data/app/components/avo/fields/code_field/edit_component.html.erb +1 -0
  17. data/app/components/avo/fields/common/heading_component.html.erb +1 -1
  18. data/app/components/avo/fields/country_field/edit_component.html.erb +1 -0
  19. data/app/components/avo/fields/file_field/index_component.rb +2 -2
  20. data/app/components/avo/fields/has_one_field/show_component.html.erb +1 -0
  21. data/app/components/avo/fields/index_component.rb +1 -0
  22. data/app/components/avo/fields/location_field/show_component.html.erb +1 -1
  23. data/app/components/avo/fields/markdown_field/edit_component.html.erb +4 -3
  24. data/app/components/avo/fields/markdown_field/show_component.html.erb +3 -3
  25. data/app/components/avo/fields/number_field/edit_component.html.erb +1 -0
  26. data/app/components/avo/fields/password_field/edit_component.html.erb +1 -0
  27. data/app/components/avo/fields/progress_bar_field/edit_component.html.erb +1 -0
  28. data/app/components/avo/fields/status_field/edit_component.html.erb +1 -1
  29. data/app/components/avo/fields/text_field/edit_component.html.erb +1 -1
  30. data/app/components/avo/fields/textarea_field/edit_component.html.erb +1 -0
  31. data/app/components/avo/fields/trix_field/edit_component.html.erb +2 -1
  32. data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
  33. data/app/components/avo/index/field_wrapper_component.html.erb +1 -1
  34. data/app/components/avo/index/grid_item_component.html.erb +9 -35
  35. data/app/components/avo/index/grid_item_component.rb +36 -10
  36. data/app/components/avo/index/resource_controls_component.rb +6 -6
  37. data/app/components/avo/index/resource_table_component.rb +1 -1
  38. data/app/components/avo/item_switcher_component.html.erb +9 -4
  39. data/app/components/avo/item_switcher_component.rb +2 -1
  40. data/app/components/avo/panel_component.html.erb +1 -1
  41. data/app/components/avo/profile_item_component.html.erb +17 -2
  42. data/app/components/avo/profile_item_component.rb +13 -1
  43. data/app/components/avo/resource_component.rb +6 -3
  44. data/app/components/avo/resource_sidebar_component.rb +1 -1
  45. data/app/components/avo/row_component.html.erb +3 -0
  46. data/app/components/avo/row_component.rb +12 -0
  47. data/app/components/avo/sidebar/link_component.html.erb +2 -0
  48. data/app/components/avo/sidebar/link_component.rb +5 -3
  49. data/app/components/avo/sidebar_component.html.erb +3 -3
  50. data/app/components/avo/sidebar_component.rb +4 -4
  51. data/app/components/avo/sidebar_profile_component.html.erb +27 -27
  52. data/app/components/avo/views/resource_edit_component.rb +1 -1
  53. data/app/components/avo/views/resource_index_component.html.erb +1 -1
  54. data/app/components/avo/views/resource_index_component.rb +8 -8
  55. data/app/controllers/avo/actions_controller.rb +16 -8
  56. data/app/controllers/avo/application_controller.rb +71 -66
  57. data/app/controllers/avo/associations_controller.rb +4 -6
  58. data/app/controllers/avo/attachments_controller.rb +1 -1
  59. data/app/controllers/avo/base_controller.rb +39 -27
  60. data/app/controllers/avo/home_controller.rb +1 -1
  61. data/app/controllers/avo/search_controller.rb +18 -20
  62. data/app/controllers/concerns/avo/initializes_avo.rb +3 -6
  63. data/app/javascript/js/controllers/fields/{simple_mde_controller.js → easy_mde_controller.js} +4 -3
  64. data/app/javascript/js/controllers/search_controller.js +3 -1
  65. data/app/javascript/js/controllers.js +2 -2
  66. data/app/views/avo/actions/show.html.erb +2 -1
  67. data/app/views/avo/associations/new.html.erb +1 -1
  68. data/app/views/avo/debug/status.html.erb +1 -1
  69. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  70. data/app/views/avo/partials/_footer.html.erb +1 -1
  71. data/app/views/avo/partials/_javascript.html.erb +1 -1
  72. data/app/views/avo/partials/_navbar.html.erb +1 -1
  73. data/app/views/avo/partials/_profile_menu_extra.html.erb +2 -0
  74. data/app/views/layouts/avo/application.html.erb +2 -2
  75. data/avo.gemspec +1 -0
  76. data/config/initializers/pagy.rb +12 -10
  77. data/config/routes.rb +3 -3
  78. data/db/factories.rb +2 -1
  79. data/lib/avo/base_action.rb +12 -3
  80. data/lib/avo/base_resource.rb +183 -181
  81. data/lib/avo/concerns/filters_session_handler.rb +0 -1
  82. data/lib/avo/concerns/has_item_type.rb +4 -0
  83. data/lib/avo/concerns/has_items.rb +28 -23
  84. data/lib/avo/concerns/model_class_constantized.rb +0 -2
  85. data/lib/avo/configuration.rb +6 -2
  86. data/lib/avo/current.rb +29 -2
  87. data/lib/avo/dsl/field_parser.rb +1 -1
  88. data/lib/avo/dynamic_router.rb +12 -1
  89. data/lib/avo/engine.rb +8 -6
  90. data/lib/avo/execution_context.rb +1 -1
  91. data/lib/avo/fields/base_field.rb +25 -7
  92. data/lib/avo/fields/belongs_to_field.rb +20 -13
  93. data/lib/avo/fields/concerns/is_searchable.rb +1 -1
  94. data/lib/avo/fields/concerns/use_resource.rb +1 -1
  95. data/lib/avo/fields/field_manager.rb +13 -3
  96. data/lib/avo/fields/has_base_field.rb +5 -5
  97. data/lib/avo/fields/has_one_field.rb +1 -1
  98. data/lib/avo/fields/location_field.rb +18 -1
  99. data/lib/avo/filters/base_filter.rb +3 -1
  100. data/lib/avo/html/builder.rb +3 -1
  101. data/lib/avo/licensing/h_q.rb +11 -6
  102. data/lib/avo/licensing/license.rb +1 -1
  103. data/lib/avo/licensing/license_manager.rb +1 -1
  104. data/lib/avo/licensing/{null_license.rb → nil_license.rb} +1 -1
  105. data/lib/avo/loaders/fields_loader.rb +7 -1
  106. data/lib/avo/plugin_manager.rb +2 -4
  107. data/lib/avo/reloader.rb +1 -1
  108. data/lib/avo/resources/controls/actions_list.rb +2 -1
  109. data/lib/avo/resources/items/holder.rb +5 -1
  110. data/lib/avo/resources/items/item_group.rb +1 -0
  111. data/lib/avo/resources/items/row.rb +54 -0
  112. data/lib/avo/resources/resource_manager.rb +4 -7
  113. data/lib/avo/services/debug_service.rb +6 -6
  114. data/lib/avo/services/telemetry_service.rb +3 -3
  115. data/lib/avo/version.rb +1 -1
  116. data/lib/avo.rb +107 -25
  117. data/lib/generators/avo/action_generator.rb +8 -8
  118. data/lib/generators/avo/card_generator.rb +27 -0
  119. data/lib/generators/avo/eject_generator.rb +1 -0
  120. data/lib/generators/avo/filter_generator.rb +8 -8
  121. data/lib/generators/avo/install_generator.rb +0 -1
  122. data/lib/generators/avo/resource_generator.rb +4 -1
  123. data/lib/generators/avo/templates/action.tt +3 -3
  124. data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
  125. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
  126. data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
  127. data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
  128. data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
  129. data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
  130. data/lib/generators/avo/templates/dashboards/dashboard.tt +1 -1
  131. data/lib/generators/avo/templates/resource/resource.tt +3 -4
  132. data/lib/generators/avo/templates/scope.tt +1 -1
  133. data/lib/tasks/avo_tasks.rake +1 -1
  134. data/public/avo-assets/avo.base.css +295 -165
  135. data/public/avo-assets/avo.base.js +307 -278
  136. data/public/avo-assets/avo.base.js.map +3 -3
  137. metadata +23 -10
  138. data/lib/avo/app.rb +0 -170
  139. data/lib/avo/grid_collector.rb +0 -40
  140. data/lib/generators/avo/card/chartkick_generator.rb +0 -18
  141. data/lib/generators/avo/card/metric_generator.rb +0 -18
  142. data/lib/generators/avo/card/partial_generator.rb +0 -19
  143. data/lib/generators/avo/templates/standalone_action.tt +0 -15
@@ -33,6 +33,10 @@ 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
36
40
  end
37
41
  end
38
42
  end
@@ -4,34 +4,38 @@ module Avo
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  class_methods do
7
- def deprecated_dsl_api(name = nil)
8
- message = "This API was deprecated. Please use the `#{name}` method inside the `fields` method."
7
+ def deprecated_dsl_api(name, method)
8
+ message = "This API was deprecated. Please use the `#{name}` method inside the `#{method}` method."
9
9
  raise DeprecatedAPIError.new message
10
10
  end
11
11
 
12
12
  # DSL methods
13
13
  def field(name, as: :text, **args, &block)
14
- deprecated_dsl_api "field"
14
+ deprecated_dsl_api __method__, "fields"
15
15
  end
16
16
 
17
17
  def panel(name = nil, **args, &block)
18
- deprecated_dsl_api "panel"
18
+ deprecated_dsl_api __method__, "fields"
19
+ end
20
+
21
+ def row(**args, &block)
22
+ deprecated_dsl_api __method__, "fields"
19
23
  end
20
24
 
21
25
  def tabs(**args, &block)
22
- deprecated_dsl_api "tabs"
26
+ deprecated_dsl_api __method__, "fields"
23
27
  end
24
28
 
25
29
  def tool(klass, **args)
26
- deprecated_dsl_api "tool"
30
+ deprecated_dsl_api __method__, "fields"
27
31
  end
28
32
 
29
33
  def heading(body, **args)
30
- deprecated_dsl_api "heading"
34
+ deprecated_dsl_api __method__, "fields"
31
35
  end
32
36
 
33
37
  def sidebar(**args, &block)
34
- deprecated_dsl_api "sidebar"
38
+ deprecated_dsl_api __method__, "fields"
35
39
  end
36
40
  # END DSL methods
37
41
  end
@@ -42,6 +46,7 @@ module Avo
42
46
 
43
47
  delegate :field, to: :items_holder
44
48
  delegate :panel, to: :items_holder
49
+ delegate :row, to: :items_holder
45
50
  delegate :tabs, to: :items_holder
46
51
  delegate :tool, to: :items_holder
47
52
  delegate :heading, to: :items_holder
@@ -96,6 +101,10 @@ module Avo
96
101
  if item.is_field?
97
102
  fields << item
98
103
  end
104
+
105
+ if item.is_row?
106
+ fields << extract_fields_from_items(tab)
107
+ end
99
108
  end
100
109
 
101
110
  fields.flatten
@@ -213,8 +222,10 @@ module Avo
213
222
  panelfull_items.grep(Avo::Resources::Items::TabGroup).each do |tab_group|
214
223
  tab_group.items.grep(Avo::Resources::Items::Tab).each do |tab|
215
224
  tab.items.grep(Avo::Resources::Items::Panel).each do |panel|
216
- panel.items.grep(Avo::Fields::BelongsToField).each do |field|
217
- field.target = :_top
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)
218
229
  end
219
230
  end
220
231
  end
@@ -250,9 +261,6 @@ module Avo
250
261
 
251
262
  item
252
263
  end
253
- .select do |item|
254
- item.visible_in_view?(view: view)
255
- end
256
264
  .select do |item|
257
265
  item.visible?
258
266
  end
@@ -264,7 +272,8 @@ module Avo
264
272
  end
265
273
  end
266
274
  .select do |item|
267
- if !item.is_heading? && view.in?([:edit, :update, :new, :create])
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])
268
277
  if item.respond_to?(:id)
269
278
  item.resource.record.respond_to?("#{item.id}=")
270
279
  else
@@ -290,25 +299,21 @@ module Avo
290
299
  visible_items.blank?
291
300
  end
292
301
 
293
- def hydrate(**args)
294
- super(**args)
302
+ private
295
303
 
296
- items_holder.items.each do |item|
297
- item.hydrate(**args)
304
+ def set_target_to_top(fields)
305
+ fields.each do |field|
306
+ field.target = :_top
298
307
  end
299
-
300
- self
301
308
  end
302
309
 
303
- private
304
-
305
310
  def extract_fields_from_items(thing)
306
311
  fields = []
307
312
 
308
313
  thing.items.each do |item|
309
314
  if item.is_field?
310
315
  fields << item
311
- elsif item.is_panel?
316
+ elsif item.is_panel? || item.is_row?
312
317
  fields << extract_fields_from_items(item)
313
318
  end
314
319
  end
@@ -4,8 +4,6 @@ module Avo
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  class_methods do
7
- attr_reader :model_class
8
-
9
7
  # Cast the model class to a constantized version and memoize it like that
10
8
  def model_class=(value)
11
9
  @model_class = case value
@@ -2,8 +2,9 @@ module Avo
2
2
  class Configuration
3
3
  include ResourceConfiguration
4
4
 
5
+ attr_writer :app_name
6
+ attr_writer :branding
5
7
  attr_writer :root_path
6
- attr_accessor :app_name
7
8
  attr_accessor :timezone
8
9
  attr_accessor :per_page
9
10
  attr_accessor :per_page_steps
@@ -42,7 +43,6 @@ module Avo
42
43
  attr_accessor :sign_out_path_name
43
44
  attr_accessor :resources
44
45
  attr_accessor :prefix_path
45
- attr_writer :branding
46
46
 
47
47
  def initialize
48
48
  @root_path = "/avo"
@@ -136,6 +136,10 @@ module Avo
136
136
  def branding
137
137
  Avo::Configuration::Branding.new(**@branding || {})
138
138
  end
139
+
140
+ def app_name
141
+ Avo::ExecutionContext.new(target: @app_name).handle
142
+ end
139
143
  end
140
144
 
141
145
  def self.configuration
data/lib/avo/current.rb CHANGED
@@ -1,12 +1,39 @@
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
+
2
20
  attribute :app
3
21
  attribute :license
4
- attribute :context, :current_user, :view_context
22
+ attribute :context, :user, :view_context
23
+ attribute :error_manager
24
+ attribute :resource_manager
25
+ attribute :tool_manager
26
+ attribute :plugin_manager
5
27
 
6
- delegate :request, to: :view_context
7
28
  delegate :params, to: :request
8
29
 
9
30
  def request
10
31
  view_context.request || ActionDispatch::Request.empty
11
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
12
39
  end
@@ -72,7 +72,7 @@ module Avo
72
72
  end
73
73
 
74
74
  def field_class_from_symbol(symbol)
75
- matched_field = Avo::App.fields.all.find do |field|
75
+ matched_field = Avo.field_manager.all.find do |field|
76
76
  field[:name].to_s == symbol.to_s
77
77
  end
78
78
 
@@ -1,12 +1,23 @@
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
+
3
14
  def self.routes
4
15
  Avo::Engine.routes.draw do
5
16
  scope "resources", as: "resources" do
6
17
  # Check if the user chose to manually register the resource files.
7
18
  # If so, eager_load the resources dir.
8
19
  if Avo.configuration.resources.nil?
9
- Avo::App.eager_load(:resources) unless Rails.application.config.eager_load
20
+ Avo::DynamicRouter.eager_load(:resources) unless Rails.application.config.eager_load
10
21
  end
11
22
 
12
23
  Avo::Resources::ResourceManager.fetch_resources
data/lib/avo/engine.rb CHANGED
@@ -3,6 +3,8 @@ 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"
6
8
  when "actionview"
7
9
  require "action_view/railtie"
8
10
  when "activestorage"
@@ -23,7 +25,7 @@ module Avo
23
25
  ::Avo.asset_manager.reset
24
26
 
25
27
  # Boot Avo
26
- ::Avo::App.boot
28
+ ::Avo.boot
27
29
 
28
30
  # After deploy we want to make sure the license response is being cleared.
29
31
  # We need a fresh license response.
@@ -40,7 +42,7 @@ module Avo
40
42
  # Ensure we reboot the app when something changes
41
43
  config.to_prepare do
42
44
  # Boot Avo
43
- ::Avo::App.boot
45
+ ::Avo.boot
44
46
  end
45
47
 
46
48
  initializer "avo.autoload" do |app|
@@ -55,10 +57,6 @@ module Avo
55
57
  end
56
58
  end
57
59
 
58
- initializer "avo.init_fields" do |app|
59
- ::Avo::App.init_fields
60
- end
61
-
62
60
  initializer "avo.reloader" do |app|
63
61
  Avo::Reloader.new.tap do |reloader|
64
62
  reloader.execute
@@ -91,5 +89,9 @@ module Avo
91
89
  Rails::Generators.configure! app.config.generators
92
90
  require_relative "../generators/model_generator"
93
91
  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
94
96
  end
95
97
  end
@@ -20,7 +20,7 @@ module Avo
20
20
 
21
21
  # Set defaults on not initialized accessors
22
22
  @context ||= Avo::Current.context
23
- @current_user ||= Avo::Current.current_user
23
+ @current_user ||= Avo::Current.user
24
24
  @params ||= Avo::Current.params
25
25
  @request ||= Avo::Current.request
26
26
  @view_context ||= Avo::Current.view_context
@@ -36,9 +36,7 @@ module Avo
36
36
  attr_reader :autocomplete
37
37
  attr_reader :help
38
38
  attr_reader :default
39
- attr_reader :as_label
40
39
  attr_reader :as_avatar
41
- attr_reader :as_description
42
40
  attr_reader :stacked
43
41
  attr_reader :for_presentation_only
44
42
 
@@ -67,14 +65,13 @@ module Avo
67
65
  @nullable = args[:nullable] || false
68
66
  @null_values = args[:null_values] || [nil, ""]
69
67
  @format_using = args[:format_using] || nil
68
+ @update_using = args[:update_using] || nil
70
69
  @placeholder = args[:placeholder]
71
70
  @autocomplete = args[:autocomplete] || nil
72
71
  @help = args[:help] || nil
73
72
  @default = args[:default] || nil
74
73
  @visible = args[:visible]
75
- @as_label = args[:as_label] || false
76
74
  @as_avatar = args[:as_avatar] || false
77
- @as_description = args[:as_description] || false
78
75
  @html = args[:html] || nil
79
76
  @view = args[:view] || nil
80
77
  @value = args[:value] || nil
@@ -174,8 +171,8 @@ module Avo
174
171
  target: format_using,
175
172
  value: final_value,
176
173
  record: record,
177
- resource: @resource,
178
- view: @view,
174
+ resource: resource,
175
+ view: view,
179
176
  field: self,
180
177
  include: self.class.included_modules
181
178
  ).handle
@@ -184,10 +181,22 @@ module Avo
184
181
  final_value
185
182
  end
186
183
 
184
+ # Fills the record with the received value on create and update actions.
187
185
  def fill_field(record, key, value, params)
188
186
  return record unless record.methods.include? key.to_sym
189
187
 
190
- record.send("#{key}=", value)
188
+ if @update_using.present?
189
+ value = Avo::ExecutionContext.new(
190
+ target: @update_using,
191
+ record: record,
192
+ key: key,
193
+ value: value,
194
+ resource: resource,
195
+ field: self
196
+ ).handle
197
+ end
198
+
199
+ record.public_send("#{key}=", value)
191
200
 
192
201
  record
193
202
  end
@@ -268,6 +277,15 @@ module Avo
268
277
  !is_disabled? && visible?
269
278
  end
270
279
 
280
+ # Used by Avo to fill the record with the default value on :new and :edit views
281
+ def assign_value(record:, value:)
282
+ id = type == "belongs_to" ? foreign_key : database_id
283
+
284
+ if record.send(id).nil?
285
+ record.send("#{id}=", value)
286
+ end
287
+ end
288
+
271
289
  private
272
290
 
273
291
  def model_or_class(model)
@@ -104,9 +104,7 @@ module Avo
104
104
 
105
105
  # What the user sees in the text field
106
106
  def field_label
107
- value.send(target_resource.class.title)
108
- rescue
109
- nil
107
+ label
110
108
  end
111
109
 
112
110
  def options
@@ -115,16 +113,16 @@ module Avo
115
113
 
116
114
  def values_for_type(model = nil)
117
115
  resource = target_resource
118
- resource = Avo::App.resources.get_resource_by_model_class model if model.present?
116
+ resource = Avo.resource_manager.get_resource_by_model_class model if model.present?
119
117
 
120
- query = resource.class.query_scope
118
+ query = resource.query_scope
121
119
 
122
120
  if attach_scope.present?
123
121
  query = Avo::ExecutionContext.new(target: attach_scope, query: query, parent: get_model).handle
124
122
  end
125
123
 
126
- query.all.map do |model|
127
- [model.send(resource.class.title), model.id]
124
+ query.all.map do |record|
125
+ [resource.new(record: record).record_title, record.id]
128
126
  end
129
127
  end
130
128
 
@@ -182,7 +180,8 @@ module Avo
182
180
  end
183
181
 
184
182
  def label
185
- value.send(target_resource.class.title)
183
+ return if target_resource.blank?
184
+ target_resource.new(record: value)&.record_title
186
185
  end
187
186
 
188
187
  def to_permitted_param
@@ -197,10 +196,12 @@ module Avo
197
196
  return model unless model.methods.include? key.to_sym
198
197
 
199
198
  if polymorphic_as.present?
200
- model.send("#{polymorphic_as}_type=", params["#{polymorphic_as}_type"])
199
+ valid_model_class = valid_polymorphic_class params["#{polymorphic_as}_type"]
200
+
201
+ model.send("#{polymorphic_as}_type=", valid_model_class)
201
202
 
202
203
  # If the type is blank, reset the id too.
203
- if params["#{polymorphic_as}_type"].blank?
204
+ if valid_model_class.blank?
204
205
  model.send("#{polymorphic_as}_id=", nil)
205
206
  else
206
207
  model.send("#{polymorphic_as}_id=", params["#{polymorphic_as}_id"])
@@ -212,6 +213,12 @@ module Avo
212
213
  model
213
214
  end
214
215
 
216
+ def valid_polymorphic_class(possible_class)
217
+ types.find do |type|
218
+ type.to_s == possible_class.to_s
219
+ end
220
+ end
221
+
215
222
  def database_id
216
223
  # If the field is a polymorphic value, return the polymorphic_type as key and pre-fill the _id in fill_field.
217
224
  return "#{polymorphic_as}_type" if polymorphic_as.present?
@@ -226,7 +233,7 @@ module Avo
226
233
 
227
234
  if is_polymorphic?
228
235
  if value.present?
229
- return Avo::App.resources.get_resource_by_model_class(value.class)
236
+ return Avo.resource_manager.get_resource_by_model_class(value.class)
230
237
  else
231
238
  return nil
232
239
  end
@@ -235,9 +242,9 @@ module Avo
235
242
  reflection_key = polymorphic_as || id
236
243
 
237
244
  if @record._reflections[reflection_key.to_s].klass.present?
238
- Avo::App.resources.get_resource_by_model_class @record._reflections[reflection_key.to_s].klass.to_s
245
+ Avo.resource_manager.get_resource_by_model_class @record._reflections[reflection_key.to_s].klass.to_s
239
246
  elsif @record._reflections[reflection_key.to_s].options[:class_name].present?
240
- Avo::App.resources.get_resource_by_model_class @record._reflections[reflection_key.to_s].options[:class_name]
247
+ Avo.resource_manager.get_resource_by_model_class @record._reflections[reflection_key.to_s].options[:class_name]
241
248
  else
242
249
  App.get_resource_by_name reflection_key.to_s
243
250
  end
@@ -5,7 +5,7 @@ module Avo
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  def is_searchable?
8
- defined?(AvoPro) && @searchable && ::Avo::App.license.has_with_trial(:searchable_associations)
8
+ defined?(Avo::Pro) && @searchable && Avo.license.has_with_trial(:searchable_associations)
9
9
  end
10
10
  end
11
11
  end
@@ -5,7 +5,7 @@ module Avo
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  def use_resource
8
- Avo::App.resources.get_resource @use_resource
8
+ Avo.resource_manager.get_resource @use_resource
9
9
  rescue
10
10
  # On boot we eager load the resources before the app is set.
11
11
  # Because of that, we don't have a resource manager.
@@ -11,12 +11,22 @@ module Avo
11
11
 
12
12
  attr_reader :fields
13
13
 
14
- alias_method :all, :fields
15
-
16
14
  def initialize
17
15
  @fields = []
18
16
  end
19
17
 
18
+ def all
19
+ fields
20
+ .map do |field|
21
+ field[:name] = field[:name].to_s
22
+
23
+ field
24
+ end
25
+ .uniq do |field|
26
+ field[:name]
27
+ end
28
+ end
29
+
20
30
  # This method will find all fields available in the Avo::Fields namespace and add them to the fields class_variable array
21
31
  # so later we can instantiate them on our resources.
22
32
  #
@@ -36,7 +46,7 @@ module Avo
36
46
 
37
47
  def load_field(method_name, klass)
38
48
  fields.push(
39
- name: method_name,
49
+ name: method_name.to_s,
40
50
  class: klass
41
51
  )
42
52
  end
@@ -27,7 +27,7 @@ module Avo
27
27
  end
28
28
 
29
29
  def field_resource
30
- resource || Avo::App.resources.get_resource_by_model_class(@record.class)
30
+ resource || Avo.resource_manager.get_resource_by_model_class(@record.class)
31
31
  end
32
32
 
33
33
  def turbo_frame
@@ -50,18 +50,18 @@ module Avo
50
50
 
51
51
  # What the user sees in the text field
52
52
  def field_label
53
- value.send(target_resource.class.title)
53
+ target_resource.hydrate(record: value).record_title
54
54
  rescue
55
55
  nil
56
56
  end
57
57
 
58
58
  def target_resource
59
59
  if @record._reflections[id.to_s].klass.present?
60
- Avo::App.resources.get_resource_by_model_class @record._reflections[id.to_s].klass.to_s
60
+ Avo.resource_manager.get_resource_by_model_class @record._reflections[id.to_s].klass.to_s
61
61
  elsif @record._reflections[id.to_s].options[:class_name].present?
62
- Avo::App.resources.get_resource_by_model_class @record._reflections[id.to_s].options[:class_name]
62
+ Avo.resource_manager.get_resource_by_model_class @record._reflections[id.to_s].options[:class_name]
63
63
  else
64
- Avo::App.resources.get_resource_by_name id.to_s
64
+ Avo.resource_manager.get_resource_by_name id.to_s
65
65
  end
66
66
  end
67
67
 
@@ -29,7 +29,7 @@ module Avo
29
29
  related_record = nil
30
30
  else
31
31
  related_class = model.class.reflections[name.to_s.downcase].class_name
32
- related_resource = Avo::App.resources.get_resource_by_model_class(related_class)
32
+ related_resource = Avo.resource_manager.get_resource_by_model_class(related_class)
33
33
  related_record = related_resource.find_record value
34
34
  end
35
35
 
@@ -3,13 +3,14 @@
3
3
  module Avo
4
4
  module Fields
5
5
  class LocationField < BaseField
6
- attr_reader :stored_as
6
+ attr_reader :stored_as, :zoom
7
7
 
8
8
  def initialize(id, **args, &block)
9
9
  hide_on :index
10
10
  super(id, **args, &block)
11
11
 
12
12
  @stored_as = args[:stored_as].present? ? args[:stored_as] : nil # You can pass it an array of db columns [:latitude, :longitude]
13
+ @zoom = args[:zoom].present? ? args[:zoom].to_i : 15
13
14
  end
14
15
 
15
16
  def value_as_array?
@@ -59,11 +60,27 @@ module Avo
59
60
  end
60
61
  end
61
62
 
63
+ def value
64
+ if value_as_array?
65
+ [@record.send(stored_as.first), @record.send(stored_as.last)]
66
+ else
67
+ super
68
+ end
69
+ end
70
+
62
71
  def value_present?
63
72
  return value.first.present? && value.second.present? if value.is_a?(Array) && value.count == 2
64
73
 
65
74
  value.present?
66
75
  end
76
+
77
+ def assign_value(record:, value:)
78
+ return super if stored_as.blank?
79
+
80
+ stored_as.each_with_index do |database_id, index|
81
+ record.send("#{database_id}=", value[index])
82
+ end
83
+ end
67
84
  end
68
85
  end
69
86
  end
@@ -15,7 +15,9 @@ module Avo
15
15
  delegate :params, to: Avo::Current
16
16
  delegate :request, to: Avo::Current
17
17
  delegate :view_context, to: Avo::Current
18
- delegate :current_user, to: Avo::Current
18
+ def curent_user
19
+ Avo::Current.user
20
+ end
19
21
 
20
22
  class << self
21
23
  def decode_filters(filter_params)
@@ -22,7 +22,9 @@ class Avo::HTML::Builder
22
22
  delegate :app, to: Avo::Current
23
23
  delegate :root_path, to: :app
24
24
  delegate :params, to: Avo::Current
25
- delegate :current_user, to: Avo::Current
25
+ def curent_user
26
+ Avo::Current.user
27
+ end
26
28
 
27
29
  def initialize(record: nil, resource: nil)
28
30
  @wrapper_stack = {}