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.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Gemfile.lock +2 -1
- data/app/assets/stylesheets/avo.base.css +1 -1
- data/app/components/avo/actions_component.html.erb +1 -1
- data/app/components/avo/actions_component.rb +40 -16
- data/app/components/avo/alert_component.html.erb +1 -1
- data/app/components/avo/base_component.rb +7 -7
- data/app/components/avo/field_wrapper_component.html.erb +2 -2
- data/app/components/avo/field_wrapper_component.rb +1 -1
- data/app/components/avo/fields/area_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +5 -5
- data/app/components/avo/fields/belongs_to_field/edit_component.rb +4 -4
- data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -0
- data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/code_field/edit_component.html.erb +1 -0
- data/app/components/avo/fields/common/heading_component.html.erb +1 -1
- data/app/components/avo/fields/country_field/edit_component.html.erb +1 -0
- data/app/components/avo/fields/file_field/index_component.rb +2 -2
- data/app/components/avo/fields/has_one_field/show_component.html.erb +1 -0
- data/app/components/avo/fields/index_component.rb +1 -0
- data/app/components/avo/fields/location_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/markdown_field/edit_component.html.erb +4 -3
- data/app/components/avo/fields/markdown_field/show_component.html.erb +3 -3
- data/app/components/avo/fields/number_field/edit_component.html.erb +1 -0
- data/app/components/avo/fields/password_field/edit_component.html.erb +1 -0
- data/app/components/avo/fields/progress_bar_field/edit_component.html.erb +1 -0
- data/app/components/avo/fields/status_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/text_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/textarea_field/edit_component.html.erb +1 -0
- data/app/components/avo/fields/trix_field/edit_component.html.erb +2 -1
- data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
- data/app/components/avo/index/field_wrapper_component.html.erb +1 -1
- data/app/components/avo/index/grid_item_component.html.erb +9 -35
- data/app/components/avo/index/grid_item_component.rb +36 -10
- data/app/components/avo/index/resource_controls_component.rb +6 -6
- data/app/components/avo/index/resource_table_component.rb +1 -1
- data/app/components/avo/item_switcher_component.html.erb +9 -4
- data/app/components/avo/item_switcher_component.rb +2 -1
- data/app/components/avo/panel_component.html.erb +1 -1
- data/app/components/avo/profile_item_component.html.erb +17 -2
- data/app/components/avo/profile_item_component.rb +13 -1
- data/app/components/avo/resource_component.rb +6 -3
- data/app/components/avo/resource_sidebar_component.rb +1 -1
- data/app/components/avo/row_component.html.erb +3 -0
- data/app/components/avo/row_component.rb +12 -0
- data/app/components/avo/sidebar/link_component.html.erb +2 -0
- data/app/components/avo/sidebar/link_component.rb +5 -3
- data/app/components/avo/sidebar_component.html.erb +3 -3
- data/app/components/avo/sidebar_component.rb +4 -4
- data/app/components/avo/sidebar_profile_component.html.erb +27 -27
- data/app/components/avo/views/resource_edit_component.rb +1 -1
- data/app/components/avo/views/resource_index_component.html.erb +1 -1
- data/app/components/avo/views/resource_index_component.rb +8 -8
- data/app/controllers/avo/actions_controller.rb +16 -8
- data/app/controllers/avo/application_controller.rb +71 -66
- data/app/controllers/avo/associations_controller.rb +4 -6
- data/app/controllers/avo/attachments_controller.rb +1 -1
- data/app/controllers/avo/base_controller.rb +39 -27
- data/app/controllers/avo/home_controller.rb +1 -1
- data/app/controllers/avo/search_controller.rb +18 -20
- data/app/controllers/concerns/avo/initializes_avo.rb +3 -6
- data/app/javascript/js/controllers/fields/{simple_mde_controller.js → easy_mde_controller.js} +4 -3
- data/app/javascript/js/controllers/search_controller.js +3 -1
- data/app/javascript/js/controllers.js +2 -2
- data/app/views/avo/actions/show.html.erb +2 -1
- data/app/views/avo/associations/new.html.erb +1 -1
- data/app/views/avo/debug/status.html.erb +1 -1
- data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
- data/app/views/avo/partials/_footer.html.erb +1 -1
- data/app/views/avo/partials/_javascript.html.erb +1 -1
- data/app/views/avo/partials/_navbar.html.erb +1 -1
- data/app/views/avo/partials/_profile_menu_extra.html.erb +2 -0
- data/app/views/layouts/avo/application.html.erb +2 -2
- data/avo.gemspec +1 -0
- data/config/initializers/pagy.rb +12 -10
- data/config/routes.rb +3 -3
- data/db/factories.rb +2 -1
- data/lib/avo/base_action.rb +12 -3
- data/lib/avo/base_resource.rb +183 -181
- data/lib/avo/concerns/filters_session_handler.rb +0 -1
- data/lib/avo/concerns/has_item_type.rb +4 -0
- data/lib/avo/concerns/has_items.rb +28 -23
- data/lib/avo/concerns/model_class_constantized.rb +0 -2
- data/lib/avo/configuration.rb +6 -2
- data/lib/avo/current.rb +29 -2
- data/lib/avo/dsl/field_parser.rb +1 -1
- data/lib/avo/dynamic_router.rb +12 -1
- data/lib/avo/engine.rb +8 -6
- data/lib/avo/execution_context.rb +1 -1
- data/lib/avo/fields/base_field.rb +25 -7
- data/lib/avo/fields/belongs_to_field.rb +20 -13
- data/lib/avo/fields/concerns/is_searchable.rb +1 -1
- data/lib/avo/fields/concerns/use_resource.rb +1 -1
- data/lib/avo/fields/field_manager.rb +13 -3
- data/lib/avo/fields/has_base_field.rb +5 -5
- data/lib/avo/fields/has_one_field.rb +1 -1
- data/lib/avo/fields/location_field.rb +18 -1
- data/lib/avo/filters/base_filter.rb +3 -1
- data/lib/avo/html/builder.rb +3 -1
- data/lib/avo/licensing/h_q.rb +11 -6
- data/lib/avo/licensing/license.rb +1 -1
- data/lib/avo/licensing/license_manager.rb +1 -1
- data/lib/avo/licensing/{null_license.rb → nil_license.rb} +1 -1
- data/lib/avo/loaders/fields_loader.rb +7 -1
- data/lib/avo/plugin_manager.rb +2 -4
- data/lib/avo/reloader.rb +1 -1
- data/lib/avo/resources/controls/actions_list.rb +2 -1
- data/lib/avo/resources/items/holder.rb +5 -1
- data/lib/avo/resources/items/item_group.rb +1 -0
- data/lib/avo/resources/items/row.rb +54 -0
- data/lib/avo/resources/resource_manager.rb +4 -7
- data/lib/avo/services/debug_service.rb +6 -6
- data/lib/avo/services/telemetry_service.rb +3 -3
- data/lib/avo/version.rb +1 -1
- data/lib/avo.rb +107 -25
- data/lib/generators/avo/action_generator.rb +8 -8
- data/lib/generators/avo/card_generator.rb +27 -0
- data/lib/generators/avo/eject_generator.rb +1 -0
- data/lib/generators/avo/filter_generator.rb +8 -8
- data/lib/generators/avo/install_generator.rb +0 -1
- data/lib/generators/avo/resource_generator.rb +4 -1
- data/lib/generators/avo/templates/action.tt +3 -3
- data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
- data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
- data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
- data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
- data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
- data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
- data/lib/generators/avo/templates/dashboards/dashboard.tt +1 -1
- data/lib/generators/avo/templates/resource/resource.tt +3 -4
- data/lib/generators/avo/templates/scope.tt +1 -1
- data/lib/tasks/avo_tasks.rake +1 -1
- data/public/avo-assets/avo.base.css +295 -165
- data/public/avo-assets/avo.base.js +307 -278
- data/public/avo-assets/avo.base.js.map +3 -3
- metadata +23 -10
- data/lib/avo/app.rb +0 -170
- data/lib/avo/grid_collector.rb +0 -40
- data/lib/generators/avo/card/chartkick_generator.rb +0 -18
- data/lib/generators/avo/card/metric_generator.rb +0 -18
- data/lib/generators/avo/card/partial_generator.rb +0 -19
- data/lib/generators/avo/templates/standalone_action.tt +0 -15
@@ -4,34 +4,38 @@ module Avo
|
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
6
|
class_methods do
|
7
|
-
def deprecated_dsl_api(name
|
8
|
-
message = "This API was deprecated. Please use the `#{name}` method inside the `
|
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 "
|
14
|
+
deprecated_dsl_api __method__, "fields"
|
15
15
|
end
|
16
16
|
|
17
17
|
def panel(name = nil, **args, &block)
|
18
|
-
deprecated_dsl_api "
|
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 "
|
26
|
+
deprecated_dsl_api __method__, "fields"
|
23
27
|
end
|
24
28
|
|
25
29
|
def tool(klass, **args)
|
26
|
-
deprecated_dsl_api "
|
30
|
+
deprecated_dsl_api __method__, "fields"
|
27
31
|
end
|
28
32
|
|
29
33
|
def heading(body, **args)
|
30
|
-
deprecated_dsl_api "
|
34
|
+
deprecated_dsl_api __method__, "fields"
|
31
35
|
end
|
32
36
|
|
33
37
|
def sidebar(**args, &block)
|
34
|
-
deprecated_dsl_api "
|
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)
|
217
|
-
|
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
|
-
|
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
|
-
|
294
|
-
super(**args)
|
302
|
+
private
|
295
303
|
|
296
|
-
|
297
|
-
|
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
|
data/lib/avo/configuration.rb
CHANGED
@@ -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, :
|
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
|
data/lib/avo/dsl/field_parser.rb
CHANGED
data/lib/avo/dynamic_router.rb
CHANGED
@@ -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::
|
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
|
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
|
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.
|
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:
|
178
|
-
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
|
-
|
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
|
-
|
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
|
116
|
+
resource = Avo.resource_manager.get_resource_by_model_class model if model.present?
|
119
117
|
|
120
|
-
query = resource.
|
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 |
|
127
|
-
[
|
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
|
-
|
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
|
-
|
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
|
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
|
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
|
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
|
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?(
|
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
|
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
|
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
|
-
|
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
|
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
|
62
|
+
Avo.resource_manager.get_resource_by_model_class @record._reflections[id.to_s].options[:class_name]
|
63
63
|
else
|
64
|
-
Avo
|
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
|
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
|
-
|
18
|
+
def curent_user
|
19
|
+
Avo::Current.user
|
20
|
+
end
|
19
21
|
|
20
22
|
class << self
|
21
23
|
def decode_filters(filter_params)
|
data/lib/avo/html/builder.rb
CHANGED
@@ -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
|
-
|
25
|
+
def curent_user
|
26
|
+
Avo::Current.user
|
27
|
+
end
|
26
28
|
|
27
29
|
def initialize(record: nil, resource: nil)
|
28
30
|
@wrapper_stack = {}
|