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.
- checksums.yaml +4 -4
- data/Gemfile +5 -5
- data/Gemfile.lock +81 -92
- data/{public/avo-assets/avo.css → app/assets/builds/avo.base.css} +686 -728
- data/app/assets/builds/avo.base.js +93804 -0
- data/app/assets/builds/avo.base.js.map +7 -0
- data/app/assets/stylesheets/avo.base.css +2 -1
- data/app/assets/svgs/failed_to_load.svg +1 -0
- data/app/assets/svgs/grid-empty-state.svg +1 -0
- data/app/assets/svgs/table-empty-state.svg +1 -0
- data/app/assets/svgs/triangle-up.svg +1 -1
- data/app/components/avo/actions_component.html.erb +1 -1
- data/app/components/avo/actions_component.rb +16 -42
- 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 +4 -4
- data/app/components/avo/field_wrapper_component.rb +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 -8
- data/app/components/avo/fields/boolean_field/edit_component.html.erb +0 -1
- 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 +0 -1
- data/app/components/avo/fields/common/files_list_viewer_component.html.erb +5 -0
- data/app/components/avo/fields/common/files_list_viewer_component.rb +8 -0
- data/app/components/avo/fields/common/heading_component.html.erb +1 -1
- data/app/components/avo/fields/common/single_file_viewer_component.html.erb +56 -0
- data/app/components/avo/fields/common/single_file_viewer_component.rb +55 -0
- data/app/components/avo/fields/country_field/edit_component.html.erb +1 -3
- data/app/components/avo/fields/file_field/edit_component.html.erb +2 -4
- data/app/components/avo/fields/file_field/edit_component.rb +0 -1
- data/app/components/avo/fields/file_field/index_component.rb +2 -2
- data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/files_field/edit_component.html.erb +2 -4
- data/app/components/avo/fields/files_field/edit_component.rb +0 -1
- data/app/components/avo/fields/files_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/has_many_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/has_one_field/show_component.html.erb +4 -5
- data/app/components/avo/fields/has_one_field/show_component.rb +2 -6
- data/app/components/avo/fields/index_component.rb +0 -1
- data/app/components/avo/fields/markdown_field/edit_component.html.erb +3 -4
- 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 -3
- data/app/components/avo/fields/password_field/edit_component.html.erb +1 -3
- data/app/components/avo/fields/progress_bar_field/edit_component.html.erb +0 -1
- data/app/components/avo/fields/select_field/edit_component.html.erb +1 -2
- data/app/components/avo/fields/status_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/text_field/edit_component.html.erb +2 -3
- data/app/components/avo/fields/textarea_field/edit_component.html.erb +0 -1
- data/app/components/avo/fields/trix_field/edit_component.html.erb +1 -2
- 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/field_wrapper_component.rb +12 -0
- data/app/components/avo/index/grid_item_component.html.erb +35 -9
- data/app/components/avo/index/grid_item_component.rb +10 -36
- data/app/components/avo/index/resource_controls_component.rb +11 -8
- data/app/components/avo/index/resource_table_component.rb +1 -1
- data/app/components/avo/item_switcher_component.html.erb +5 -10
- data/app/components/avo/item_switcher_component.rb +1 -2
- data/app/components/avo/modal_component.html.erb +1 -1
- data/app/components/avo/panel_component.html.erb +1 -6
- data/app/components/avo/panel_component.rb +0 -1
- data/app/components/avo/profile_item_component.html.erb +2 -17
- data/app/components/avo/profile_item_component.rb +1 -13
- data/app/components/avo/referrer_params_component.html.erb +0 -2
- data/app/components/avo/resource_component.rb +6 -69
- data/app/components/avo/resource_sidebar_component.rb +1 -1
- data/app/components/avo/sidebar/link_component.html.erb +0 -2
- data/app/components/avo/sidebar/link_component.rb +3 -5
- 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.html.erb +5 -5
- data/app/components/avo/views/resource_edit_component.rb +1 -1
- data/app/components/avo/views/resource_index_component.html.erb +10 -19
- data/app/components/avo/views/resource_index_component.rb +16 -22
- data/app/components/avo/views/resource_show_component.html.erb +4 -4
- data/app/controllers/avo/actions_controller.rb +20 -20
- data/app/controllers/avo/application_controller.rb +67 -90
- data/app/controllers/avo/associations_controller.rb +7 -5
- data/app/controllers/avo/attachments_controller.rb +7 -22
- data/app/controllers/avo/base_controller.rb +35 -47
- data/app/controllers/avo/home_controller.rb +1 -1
- data/app/controllers/avo/search_controller.rb +16 -20
- data/app/controllers/concerns/avo/initializes_avo.rb +8 -3
- data/app/helpers/avo/application_helper.rb +6 -13
- data/app/javascript/js/application.js +0 -2
- data/app/javascript/js/controllers/fields/{easy_mde_controller.js → simple_mde_controller.js} +3 -4
- data/app/javascript/js/controllers/search_controller.js +1 -3
- data/app/javascript/js/controllers.js +2 -2
- data/app/views/avo/actions/show.html.erb +3 -5
- data/app/views/avo/associations/new.html.erb +3 -3
- data/app/views/avo/debug/status.html.erb +5 -6
- data/app/views/avo/home/index.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/_table_header.html.erb +8 -0
- data/app/views/avo/partials/_view_toggle_button.html.erb +0 -9
- data/app/views/avo/private/design.html.erb +2 -2
- data/app/views/layouts/avo/application.html.erb +3 -2
- data/avo.gemspec +1 -2
- data/config/initializers/pagy.rb +10 -12
- data/config/routes.rb +5 -5
- data/db/factories.rb +0 -17
- data/lib/avo/app.rb +165 -0
- data/lib/avo/base_action.rb +18 -31
- data/lib/avo/base_resource.rb +213 -238
- data/lib/avo/concerns/breadcrumbs.rb +2 -2
- data/lib/avo/concerns/can_replace_items.rb +7 -3
- data/lib/avo/concerns/filters_session_handler.rb +4 -5
- data/lib/avo/concerns/has_item_type.rb +0 -4
- data/lib/avo/concerns/has_items.rb +115 -93
- data/lib/avo/concerns/is_visible.rb +1 -1
- data/lib/avo/concerns/model_class_constantized.rb +2 -0
- data/lib/avo/configuration.rb +8 -9
- data/lib/avo/current.rb +1 -35
- data/lib/avo/dsl/field_parser.rb +1 -1
- data/lib/avo/dynamic_router.rb +2 -13
- data/lib/avo/engine.rb +13 -11
- data/lib/avo/execution_context.rb +2 -4
- data/lib/avo/fields/base_field.rb +14 -51
- data/lib/avo/fields/belongs_to_field.rb +13 -20
- data/lib/avo/fields/concerns/is_searchable.rb +1 -1
- data/lib/avo/fields/concerns/use_resource.rb +1 -1
- data/lib/avo/fields/date_field.rb +3 -16
- data/lib/avo/fields/field_manager.rb +3 -13
- data/lib/avo/fields/file_field.rb +0 -2
- data/lib/avo/fields/files_field.rb +0 -6
- data/lib/avo/fields/has_base_field.rb +5 -5
- data/lib/avo/fields/has_one_field.rb +1 -2
- data/lib/avo/fields/id_field.rb +1 -2
- data/lib/avo/filters/base_filter.rb +0 -9
- data/lib/avo/grid_collector.rb +40 -0
- data/lib/avo/html/builder.rb +1 -3
- data/lib/avo/licensing/h_q.rb +6 -11
- data/lib/avo/licensing/license.rb +1 -1
- data/lib/avo/licensing/license_manager.rb +1 -1
- data/lib/avo/licensing/{nil_license.rb → null_license.rb} +1 -1
- data/lib/avo/loaders/fields_loader.rb +1 -7
- data/lib/avo/plugin.rb +0 -10
- data/lib/avo/plugin_manager.rb +4 -2
- data/lib/avo/reloader.rb +1 -1
- data/lib/avo/resources/controls/actions_list.rb +1 -2
- data/lib/avo/resources/controls/create_button.rb +1 -1
- data/lib/avo/resources/controls/delete_button.rb +1 -1
- data/lib/avo/resources/controls/detach_button.rb +1 -1
- data/lib/avo/resources/controls/edit_button.rb +1 -1
- data/lib/avo/resources/controls/show_button.rb +1 -1
- data/lib/avo/resources/items/holder.rb +5 -13
- data/lib/avo/resources/items/item_group.rb +0 -1
- data/lib/avo/resources/resource_manager.rb +18 -11
- data/lib/avo/services/debug_service.rb +5 -6
- data/lib/avo/services/telemetry_service.rb +2 -3
- data/lib/avo/version.rb +1 -1
- data/lib/avo.rb +25 -109
- data/lib/generators/avo/action_generator.rb +8 -8
- data/lib/generators/avo/card/chartkick_generator.rb +18 -0
- data/lib/generators/avo/card/metric_generator.rb +18 -0
- data/lib/generators/avo/card/partial_generator.rb +19 -0
- data/lib/generators/avo/eject_generator.rb +0 -1
- data/lib/generators/avo/filter_generator.rb +8 -8
- data/lib/generators/avo/install_generator.rb +1 -11
- data/lib/generators/avo/resource_generator.rb +4 -22
- data/lib/generators/avo/tailwindcss/install_generator.rb +1 -4
- data/lib/generators/avo/templates/action.tt +5 -7
- 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 +3 -5
- data/lib/generators/avo/templates/initializer/avo.tt +2 -4
- data/lib/generators/avo/templates/resource/resource.tt +6 -6
- data/lib/generators/avo/templates/scope.tt +1 -1
- data/lib/generators/avo/templates/standalone_action.tt +8 -0
- data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
- data/lib/tasks/avo_tasks.rake +0 -5
- metadata +19 -56
- data/app/assets/svgs/map-empty-state.svg +0 -35
- data/app/assets/svgs/map-view-type.svg +0 -3
- data/app/components/avo/fields/area_field/edit_component.html.erb +0 -7
- data/app/components/avo/fields/area_field/edit_component.rb +0 -4
- data/app/components/avo/fields/area_field/show_component.html.erb +0 -8
- data/app/components/avo/fields/area_field/show_component.rb +0 -4
- data/app/components/avo/fields/common/files/controls_component.html.erb +0 -29
- data/app/components/avo/fields/common/files/controls_component.rb +0 -19
- data/app/components/avo/fields/common/files/list_viewer_component.html.erb +0 -20
- data/app/components/avo/fields/common/files/list_viewer_component.rb +0 -41
- data/app/components/avo/fields/common/files/view_type/grid_component.html.erb +0 -27
- data/app/components/avo/fields/common/files/view_type/grid_component.rb +0 -51
- data/app/components/avo/fields/common/files/view_type/list_component.html.erb +0 -22
- data/app/components/avo/fields/common/files/view_type/list_component.rb +0 -15
- data/app/components/avo/fields/location_field/edit_component.html.erb +0 -22
- data/app/components/avo/fields/location_field/edit_component.rb +0 -4
- data/app/components/avo/fields/location_field/show_component.html.erb +0 -7
- data/app/components/avo/fields/location_field/show_component.rb +0 -4
- data/app/components/avo/index/resource_map_component.html.erb +0 -16
- data/app/components/avo/index/resource_map_component.rb +0 -109
- data/app/components/avo/row_component.html.erb +0 -3
- data/app/components/avo/row_component.rb +0 -12
- data/app/views/avo/attachments/destroy.turbo_stream.erb +0 -7
- data/app/views/avo/partials/_profile_menu_extra.html.erb +0 -2
- data/lib/avo/concerns/has_description.rb +0 -23
- data/lib/avo/fields/area_field.rb +0 -39
- data/lib/avo/fields/concerns/file_authorization.rb +0 -31
- data/lib/avo/fields/location_field.rb +0 -86
- data/lib/avo/resources/items/row.rb +0 -54
- data/lib/generators/avo/card_generator.rb +0 -27
- data/public/avo-assets/avo.base.css +0 -10542
- data/public/avo-assets/avo.base.js +0 -949
- data/public/avo-assets/avo.base.js.map +0 -7
- data/public/avo-assets/avo.js +0 -513
- data/public/avo-assets/avo.js.map +0 -7
@@ -33,14 +33,17 @@ module Avo
|
|
33
33
|
attr_reader :nullable
|
34
34
|
attr_reader :null_values
|
35
35
|
attr_reader :format_using
|
36
|
-
attr_reader :autocomplete
|
37
36
|
attr_reader :help
|
38
37
|
attr_reader :default
|
38
|
+
attr_reader :as_label
|
39
39
|
attr_reader :as_avatar
|
40
|
+
attr_reader :as_description
|
41
|
+
attr_reader :index_text_align
|
40
42
|
attr_reader :stacked
|
41
43
|
attr_reader :for_presentation_only
|
42
44
|
|
43
45
|
# Private options
|
46
|
+
attr_reader :updatable
|
44
47
|
attr_reader :computable # if allowed to be computable
|
45
48
|
attr_reader :computed # if block is present
|
46
49
|
attr_reader :computed_value # the value after computation
|
@@ -65,13 +68,14 @@ module Avo
|
|
65
68
|
@nullable = args[:nullable] || false
|
66
69
|
@null_values = args[:null_values] || [nil, ""]
|
67
70
|
@format_using = args[:format_using] || nil
|
68
|
-
@update_using = args[:update_using] || nil
|
69
71
|
@placeholder = args[:placeholder]
|
70
|
-
@autocomplete = args[:autocomplete] || nil
|
71
72
|
@help = args[:help] || nil
|
72
73
|
@default = args[:default] || nil
|
73
|
-
@visible = args[:visible]
|
74
|
+
@visible = args[:visible] || true
|
75
|
+
@as_label = args[:as_label] || false
|
74
76
|
@as_avatar = args[:as_avatar] || false
|
77
|
+
@as_description = args[:as_description] || false
|
78
|
+
@index_text_align = args[:index_text_align] || :left
|
75
79
|
@html = args[:html] || nil
|
76
80
|
@view = args[:view] || nil
|
77
81
|
@value = args[:value] || nil
|
@@ -81,6 +85,7 @@ module Avo
|
|
81
85
|
|
82
86
|
@args = args
|
83
87
|
|
88
|
+
@updatable = !readonly
|
84
89
|
@computable = true
|
85
90
|
@computed = block.present?
|
86
91
|
@computed_value = nil
|
@@ -93,11 +98,11 @@ module Avo
|
|
93
98
|
end
|
94
99
|
|
95
100
|
def translated_name(default:)
|
96
|
-
t(translation_key, count: 1, default: default).
|
101
|
+
t(translation_key, count: 1, default: default).capitalize
|
97
102
|
end
|
98
103
|
|
99
104
|
def translated_plural_name(default:)
|
100
|
-
t(translation_key, count: 2, default: default).
|
105
|
+
t(translation_key, count: 2, default: default).capitalize
|
101
106
|
end
|
102
107
|
|
103
108
|
# Getting the name of the resource (user/users, post/posts)
|
@@ -155,48 +160,19 @@ module Avo
|
|
155
160
|
|
156
161
|
# Run computable callback block if present
|
157
162
|
if computable && block.present?
|
158
|
-
final_value =
|
159
|
-
target: block,
|
160
|
-
record: record,
|
161
|
-
resource: @resource,
|
162
|
-
view: @view,
|
163
|
-
field: self,
|
164
|
-
include: self.class.included_modules
|
165
|
-
).handle
|
163
|
+
final_value = instance_exec(record, @resource, @view, self, &block)
|
166
164
|
end
|
167
165
|
|
168
166
|
# Run the value through resolver if present
|
169
|
-
if format_using.present?
|
170
|
-
final_value = Avo::ExecutionContext.new(
|
171
|
-
target: format_using,
|
172
|
-
value: final_value,
|
173
|
-
record: record,
|
174
|
-
resource: resource,
|
175
|
-
view: view,
|
176
|
-
field: self,
|
177
|
-
include: self.class.included_modules
|
178
|
-
).handle
|
179
|
-
end
|
167
|
+
final_value = instance_exec(final_value, &@format_using) if @format_using.present?
|
180
168
|
|
181
169
|
final_value
|
182
170
|
end
|
183
171
|
|
184
|
-
# Fills the record with the received value on create and update actions.
|
185
172
|
def fill_field(record, key, value, params)
|
186
173
|
return record unless record.methods.include? key.to_sym
|
187
174
|
|
188
|
-
|
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)
|
175
|
+
record.send("#{key}=", value)
|
200
176
|
|
201
177
|
record
|
202
178
|
end
|
@@ -273,19 +249,6 @@ module Avo
|
|
273
249
|
options
|
274
250
|
end
|
275
251
|
|
276
|
-
def updatable
|
277
|
-
!is_disabled? && visible?
|
278
|
-
end
|
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
|
-
|
289
252
|
private
|
290
253
|
|
291
254
|
def model_or_class(model)
|
@@ -104,7 +104,9 @@ module Avo
|
|
104
104
|
|
105
105
|
# What the user sees in the text field
|
106
106
|
def field_label
|
107
|
-
|
107
|
+
value.send(target_resource.class.title)
|
108
|
+
rescue
|
109
|
+
nil
|
108
110
|
end
|
109
111
|
|
110
112
|
def options
|
@@ -113,16 +115,16 @@ module Avo
|
|
113
115
|
|
114
116
|
def values_for_type(model = nil)
|
115
117
|
resource = target_resource
|
116
|
-
resource = Avo.
|
118
|
+
resource = Avo::App.resources.get_resource_by_model_class model if model.present?
|
117
119
|
|
118
|
-
query = resource.query_scope
|
120
|
+
query = resource.class.query_scope
|
119
121
|
|
120
122
|
if attach_scope.present?
|
121
123
|
query = Avo::ExecutionContext.new(target: attach_scope, query: query, parent: get_model).handle
|
122
124
|
end
|
123
125
|
|
124
|
-
query.all.map do |
|
125
|
-
[resource.
|
126
|
+
query.all.map do |model|
|
127
|
+
[model.send(resource.class.title), model.id]
|
126
128
|
end
|
127
129
|
end
|
128
130
|
|
@@ -180,8 +182,7 @@ module Avo
|
|
180
182
|
end
|
181
183
|
|
182
184
|
def label
|
183
|
-
|
184
|
-
target_resource.new(record: value)&.record_title
|
185
|
+
value.send(target_resource.class.title)
|
185
186
|
end
|
186
187
|
|
187
188
|
def to_permitted_param
|
@@ -196,12 +197,10 @@ module Avo
|
|
196
197
|
return model unless model.methods.include? key.to_sym
|
197
198
|
|
198
199
|
if polymorphic_as.present?
|
199
|
-
|
200
|
-
|
201
|
-
model.send("#{polymorphic_as}_type=", valid_model_class)
|
200
|
+
model.send("#{polymorphic_as}_type=", params["#{polymorphic_as}_type"])
|
202
201
|
|
203
202
|
# If the type is blank, reset the id too.
|
204
|
-
if
|
203
|
+
if params["#{polymorphic_as}_type"].blank?
|
205
204
|
model.send("#{polymorphic_as}_id=", nil)
|
206
205
|
else
|
207
206
|
model.send("#{polymorphic_as}_id=", params["#{polymorphic_as}_id"])
|
@@ -213,12 +212,6 @@ module Avo
|
|
213
212
|
model
|
214
213
|
end
|
215
214
|
|
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
|
-
|
222
215
|
def database_id
|
223
216
|
# If the field is a polymorphic value, return the polymorphic_type as key and pre-fill the _id in fill_field.
|
224
217
|
return "#{polymorphic_as}_type" if polymorphic_as.present?
|
@@ -233,7 +226,7 @@ module Avo
|
|
233
226
|
|
234
227
|
if is_polymorphic?
|
235
228
|
if value.present?
|
236
|
-
return Avo.
|
229
|
+
return Avo::App.resources.get_resource_by_model_class(value.class)
|
237
230
|
else
|
238
231
|
return nil
|
239
232
|
end
|
@@ -242,9 +235,9 @@ module Avo
|
|
242
235
|
reflection_key = polymorphic_as || id
|
243
236
|
|
244
237
|
if @record._reflections[reflection_key.to_s].klass.present?
|
245
|
-
Avo.
|
238
|
+
Avo::App.resources.get_resource_by_model_class @record._reflections[reflection_key.to_s].klass.to_s
|
246
239
|
elsif @record._reflections[reflection_key.to_s].options[:class_name].present?
|
247
|
-
Avo.
|
240
|
+
Avo::App.resources.get_resource_by_model_class @record._reflections[reflection_key.to_s].options[:class_name]
|
248
241
|
else
|
249
242
|
App.get_resource_by_name reflection_key.to_s
|
250
243
|
end
|
@@ -5,7 +5,7 @@ module Avo
|
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
7
|
def is_searchable?
|
8
|
-
defined?(
|
8
|
+
defined?(AvoPro) && @searchable && ::Avo::App.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::App.resources.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.
|
@@ -20,26 +20,13 @@ module Avo
|
|
20
20
|
def formatted_value
|
21
21
|
return if value.blank?
|
22
22
|
|
23
|
-
|
23
|
+
value.iso8601
|
24
24
|
end
|
25
25
|
|
26
26
|
def edit_formatted_value
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
27
|
+
return nil if value.nil?
|
31
28
|
|
32
|
-
|
33
|
-
if value.respond_to?(:iso8601)
|
34
|
-
value.iso8601
|
35
|
-
elsif value.is_a?(String)
|
36
|
-
parsed = DateTime.parse(value.dup)
|
37
|
-
if parsed.present?
|
38
|
-
parsed
|
39
|
-
end
|
40
|
-
else
|
41
|
-
value
|
42
|
-
end
|
29
|
+
value.iso8601
|
43
30
|
end
|
44
31
|
end
|
45
32
|
end
|
@@ -11,22 +11,12 @@ module Avo
|
|
11
11
|
|
12
12
|
attr_reader :fields
|
13
13
|
|
14
|
+
alias_method :all, :fields
|
15
|
+
|
14
16
|
def initialize
|
15
17
|
@fields = []
|
16
18
|
end
|
17
19
|
|
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
|
-
|
30
20
|
# This method will find all fields available in the Avo::Fields namespace and add them to the fields class_variable array
|
31
21
|
# so later we can instantiate them on our resources.
|
32
22
|
#
|
@@ -46,7 +36,7 @@ module Avo
|
|
46
36
|
|
47
37
|
def load_field(method_name, klass)
|
48
38
|
fields.push(
|
49
|
-
name: method_name
|
39
|
+
name: method_name,
|
50
40
|
class: klass
|
51
41
|
)
|
52
42
|
end
|
@@ -7,7 +7,6 @@ module Avo
|
|
7
7
|
attr_accessor :is_audio
|
8
8
|
attr_accessor :direct_upload
|
9
9
|
attr_accessor :accept
|
10
|
-
attr_reader :display_filename
|
11
10
|
|
12
11
|
def initialize(id, **args, &block)
|
13
12
|
super(id, **args, &block)
|
@@ -18,7 +17,6 @@ module Avo
|
|
18
17
|
@is_audio = args[:is_audio].present? ? args[:is_audio] : false
|
19
18
|
@direct_upload = args[:direct_upload].present? ? args[:direct_upload] : false
|
20
19
|
@accept = args[:accept].present? ? args[:accept] : nil
|
21
|
-
@display_filename = args[:display_filename].nil? ? true : args[:display_filename]
|
22
20
|
end
|
23
21
|
|
24
22
|
def path
|
@@ -5,9 +5,6 @@ module Avo
|
|
5
5
|
attr_accessor :is_image
|
6
6
|
attr_accessor :direct_upload
|
7
7
|
attr_accessor :accept
|
8
|
-
attr_reader :display_filename
|
9
|
-
attr_reader :view_type
|
10
|
-
attr_reader :hide_view_type_switcher
|
11
8
|
|
12
9
|
def initialize(id, **args, &block)
|
13
10
|
super(id, **args, &block)
|
@@ -16,9 +13,6 @@ module Avo
|
|
16
13
|
@is_image = args[:is_image].present? ? args[:is_image] : @is_avatar
|
17
14
|
@direct_upload = args[:direct_upload].present? ? args[:direct_upload] : false
|
18
15
|
@accept = args[:accept].present? ? args[:accept] : nil
|
19
|
-
@display_filename = args[:display_filename].nil? ? true : args[:display_filename]
|
20
|
-
@view_type = args[:view_type] || :grid
|
21
|
-
@hide_view_type_switcher = args[:hide_view_type_switcher]
|
22
16
|
end
|
23
17
|
|
24
18
|
def view_component_name
|
@@ -27,7 +27,7 @@ module Avo
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def field_resource
|
30
|
-
resource || Avo.
|
30
|
+
resource || Avo::App.resources.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
|
-
target_resource.
|
53
|
+
value.send(target_resource.class.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::App.resources.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::App.resources.get_resource_by_model_class @record._reflections[id.to_s].options[:class_name]
|
63
63
|
else
|
64
|
-
Avo.
|
64
|
+
Avo::App.resources.get_resource_by_name id.to_s
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
@@ -29,8 +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
|
-
|
33
|
-
related_record = related_resource.find_record value
|
32
|
+
related_record = related_class.safe_constantize.find value
|
34
33
|
end
|
35
34
|
|
36
35
|
model.public_send("#{key}=", related_record)
|
data/lib/avo/fields/id_field.rb
CHANGED
@@ -5,13 +5,12 @@ module Avo
|
|
5
5
|
|
6
6
|
def initialize(id, **args, &block)
|
7
7
|
args[:readonly] = true
|
8
|
+
args[:sortable] = true
|
8
9
|
|
9
10
|
hide_on :forms
|
10
11
|
|
11
12
|
super(id, **args, &block)
|
12
13
|
|
13
|
-
add_boolean_prop args, :sortable, true
|
14
|
-
|
15
14
|
@link_to_resource = args[:link_to_resource].present? ? args[:link_to_resource] : false
|
16
15
|
end
|
17
16
|
end
|
@@ -13,11 +13,6 @@ module Avo
|
|
13
13
|
attr_reader :arguments
|
14
14
|
|
15
15
|
delegate :params, to: Avo::Current
|
16
|
-
delegate :request, to: Avo::Current
|
17
|
-
delegate :view_context, to: Avo::Current
|
18
|
-
def curent_user
|
19
|
-
Avo::Current.user
|
20
|
-
end
|
21
16
|
|
22
17
|
class << self
|
23
18
|
def decode_filters(filter_params)
|
@@ -26,10 +21,6 @@ module Avo
|
|
26
21
|
{}
|
27
22
|
end
|
28
23
|
|
29
|
-
def encode_filters(filter_params)
|
30
|
-
Base64.encode64(filter_params.to_json)
|
31
|
-
end
|
32
|
-
|
33
24
|
def get_empty_message
|
34
25
|
empty_message || I18n.t("avo.no_options_available")
|
35
26
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Avo
|
2
|
+
class GridCollector
|
3
|
+
attr_accessor :cover_field
|
4
|
+
attr_accessor :title_field
|
5
|
+
attr_accessor :body_field
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@cover_field = nil
|
9
|
+
@title_field = nil
|
10
|
+
@body_field = nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def cover(field_name, as:, **args, &block)
|
14
|
+
field_parser = Avo::Dsl::FieldParser.new(id: field_name, as: as, **args, &block).parse
|
15
|
+
self.cover_field = field_parser.instance if field_parser.valid?
|
16
|
+
end
|
17
|
+
|
18
|
+
def title(field_name, as:, **args, &block)
|
19
|
+
field_parser = Avo::Dsl::FieldParser.new(id: field_name, as: as, **args, &block).parse
|
20
|
+
self.title_field = field_parser.instance if field_parser.valid?
|
21
|
+
end
|
22
|
+
|
23
|
+
def body(field_name, as:, **args, &block)
|
24
|
+
field_parser = Avo::Dsl::FieldParser.new(id: field_name, as: as, **args, &block).parse
|
25
|
+
self.body_field = field_parser.instance if field_parser.valid?
|
26
|
+
end
|
27
|
+
|
28
|
+
def hydrate(record:, view:, resource:)
|
29
|
+
cover_field.hydrate(record: record, view: view, resource: resource) if cover_field.present?
|
30
|
+
title_field.hydrate(record: record, view: view, resource: resource) if title_field.present?
|
31
|
+
body_field.hydrate(record: record, view: view, resource: resource) if body_field.present?
|
32
|
+
|
33
|
+
self
|
34
|
+
end
|
35
|
+
|
36
|
+
def blank?
|
37
|
+
title_field.blank?
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/avo/html/builder.rb
CHANGED
@@ -22,9 +22,7 @@ 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
|
-
|
26
|
-
Avo::Current.user
|
27
|
-
end
|
25
|
+
delegate :current_user, to: Avo::Current
|
28
26
|
|
29
27
|
def initialize(record: nil, resource: nil)
|
30
28
|
@wrapper_stack = {}
|
data/lib/avo/licensing/h_q.rb
CHANGED
@@ -4,7 +4,6 @@ module Avo
|
|
4
4
|
attr_accessor :current_request
|
5
5
|
attr_accessor :cache_store
|
6
6
|
|
7
|
-
# ENDPOINT = "https://v3.avohq.io/api/v1/licenses/check".freeze unless const_defined?(:ENDPOINT)
|
8
7
|
ENDPOINT = "https://avohq.io/api/v1/licenses/check".freeze unless const_defined?(:ENDPOINT)
|
9
8
|
REQUEST_TIMEOUT = 5 unless const_defined?(:REQUEST_TIMEOUT) # seconds
|
10
9
|
CACHE_TIME = 3600 unless const_defined?(:CACHE_TIME) # seconds
|
@@ -17,7 +16,7 @@ module Avo
|
|
17
16
|
|
18
17
|
def initialize(current_request = nil)
|
19
18
|
@current_request = current_request
|
20
|
-
@cache_store = Avo.cache_store
|
19
|
+
@cache_store = Avo::App.cache_store
|
21
20
|
end
|
22
21
|
|
23
22
|
def response
|
@@ -70,10 +69,10 @@ module Avo
|
|
70
69
|
app_name: app_name
|
71
70
|
}
|
72
71
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
72
|
+
metadata = Avo::Services::DebugService.avo_metadata
|
73
|
+
if metadata[:resources_count] != 0
|
74
|
+
result[:avo_metadata] = metadata
|
75
|
+
end
|
77
76
|
|
78
77
|
result
|
79
78
|
end
|
@@ -150,11 +149,7 @@ module Avo
|
|
150
149
|
def perform_request
|
151
150
|
Avo.logger.debug "Performing request to avohq.io API to check license availability." if Rails.env.development?
|
152
151
|
|
153
|
-
|
154
|
-
OpenStruct.new({code: 200, parsed_response: {id: "pro", valid: true}})
|
155
|
-
else
|
156
|
-
HTTParty.post ENDPOINT, body: payload.to_json, headers: {"Content-type": "application/json"}, timeout: REQUEST_TIMEOUT
|
157
|
-
end
|
152
|
+
HTTParty.post ENDPOINT, body: payload.to_json, headers: {"Content-type": "application/json"}, timeout: REQUEST_TIMEOUT
|
158
153
|
end
|
159
154
|
|
160
155
|
def app_name
|
@@ -6,7 +6,7 @@ module Avo
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def method_missing(method, *args, &block)
|
9
|
-
matched_field = Avo.
|
9
|
+
matched_field = Avo::App.fields.find do |field|
|
10
10
|
field[:name].to_s == method.to_s
|
11
11
|
end
|
12
12
|
|
@@ -22,12 +22,6 @@ module Avo
|
|
22
22
|
add_field field
|
23
23
|
end
|
24
24
|
end
|
25
|
-
|
26
|
-
def respond_to_missing?(method)
|
27
|
-
Avo.field_manager.find do |field|
|
28
|
-
field[:name].to_s == method.to_s
|
29
|
-
end
|
30
|
-
end
|
31
25
|
end
|
32
26
|
end
|
33
27
|
end
|
data/lib/avo/plugin.rb
CHANGED
data/lib/avo/plugin_manager.rb
CHANGED
@@ -25,13 +25,15 @@ module Avo
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def register_field(method_name, klass)
|
28
|
-
Avo.
|
28
|
+
Avo::App.fields.load_field method_name, klass
|
29
29
|
end
|
30
30
|
|
31
31
|
def register_resource_tool
|
32
|
+
# puts ["register_resource_tool->"].inspect
|
32
33
|
end
|
33
34
|
|
34
35
|
def register_tool
|
36
|
+
# puts ["register_tool->"].inspect
|
35
37
|
end
|
36
38
|
|
37
39
|
def as_json(*arg)
|
@@ -45,7 +47,7 @@ module Avo
|
|
45
47
|
|
46
48
|
def installed?(name)
|
47
49
|
plugins.any? do |plugin|
|
48
|
-
plugin.klass.to_s.
|
50
|
+
plugin.klass.to_s.split("::").first.underscore == name.to_s || plugin.klass.to_s.split("::").first == name.to_s
|
49
51
|
end
|
50
52
|
end
|
51
53
|
end
|
data/lib/avo/reloader.rb
CHANGED
@@ -46,7 +46,7 @@ class Avo::Reloader
|
|
46
46
|
if reload_lib?
|
47
47
|
dirs[Avo::Engine.root.join("lib", "avo").to_s] = ["rb"]
|
48
48
|
if Avo.avo_filters_installed?
|
49
|
-
dirs[
|
49
|
+
dirs[AvoFilters::Engine.root.join("lib", "avo_filters").to_s] = ["rb"]
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
@@ -2,14 +2,13 @@ module Avo
|
|
2
2
|
module Resources
|
3
3
|
module Controls
|
4
4
|
class ActionsList < BaseControl
|
5
|
-
attr_reader :color, :exclude, :
|
5
|
+
attr_reader :color, :exclude, :style
|
6
6
|
|
7
7
|
def initialize(**args)
|
8
8
|
super(**args)
|
9
9
|
|
10
10
|
@color = args[:color] || :primary
|
11
11
|
@exclude = args[:exclude] || []
|
12
|
-
@include = args[:include] || []
|
13
12
|
@style = args[:style] || :outline
|
14
13
|
end
|
15
14
|
end
|
@@ -7,7 +7,7 @@ module Avo
|
|
7
7
|
|
8
8
|
@label = args[:label] || I18n.t("avo.delete").capitalize
|
9
9
|
if args[:item].present?
|
10
|
-
@title = I18n.t("avo.delete_item", item: args[:item]).
|
10
|
+
@title = I18n.t("avo.delete_item", item: args[:item]).capitalize if title.nil?
|
11
11
|
@confirmation_message = I18n.t("avo.are_you_sure") if confirmation_message.nil?
|
12
12
|
end
|
13
13
|
end
|
@@ -6,7 +6,7 @@ module Avo
|
|
6
6
|
super(**args)
|
7
7
|
|
8
8
|
if args[:item].present?
|
9
|
-
@title = I18n.t("avo.detach_item", item: args[:item]).
|
9
|
+
@title = I18n.t("avo.detach_item", item: args[:item]).capitalize if title.nil?
|
10
10
|
@confirmation_message = I18n.t("avo.are_you_sure_detach_item", item: args[:item]) if confirmation_message.nil?
|
11
11
|
end
|
12
12
|
end
|