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
@@ -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).humanize
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).humanize
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 = Avo::ExecutionContext.new(
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
- 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)
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
- label
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.resource_manager.get_resource_by_model_class model if model.present?
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 |record|
125
- [resource.new(record: record).record_title, record.id]
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
- return if target_resource.blank?
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
- valid_model_class = valid_polymorphic_class params["#{polymorphic_as}_type"]
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 valid_model_class.blank?
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.resource_manager.get_resource_by_model_class(value.class)
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.resource_manager.get_resource_by_model_class @record._reflections[reflection_key.to_s].klass.to_s
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.resource_manager.get_resource_by_model_class @record._reflections[reflection_key.to_s].options[:class_name]
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?(Avo::Pro) && @searchable && Avo.license.has_with_trial(:searchable_associations)
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.resource_manager.get_resource @use_resource
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
- try_iso8601
23
+ value.iso8601
24
24
  end
25
25
 
26
26
  def edit_formatted_value
27
- formatted_value
28
- end
29
-
30
- private
27
+ return nil if value.nil?
31
28
 
32
- def try_iso8601
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.to_s,
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.resource_manager.get_resource_by_model_class(@record.class)
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.hydrate(record: value).record_title
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.resource_manager.get_resource_by_model_class @record._reflections[id.to_s].klass.to_s
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.resource_manager.get_resource_by_model_class @record._reflections[id.to_s].options[:class_name]
62
+ Avo::App.resources.get_resource_by_model_class @record._reflections[id.to_s].options[:class_name]
63
63
  else
64
- Avo.resource_manager.get_resource_by_name id.to_s
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
- related_resource = Avo.resource_manager.get_resource_by_model_class(related_class)
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)
@@ -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
@@ -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
- def curent_user
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 = {}
@@ -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
- # metadata = Avo::Services::DebugService.avo_metadata
74
- # if metadata[:resources_count] != 0
75
- # result[:avo_metadata] = "metadata"
76
- # end
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
- if Rails.env.test?
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
  attr_accessor :valid
7
7
  attr_accessor :payload
8
8
 
9
- def initialize(response = {})
9
+ def initialize(response)
10
10
  @response = response
11
11
  @id = response["id"]
12
12
  @valid = response["valid"]
@@ -12,7 +12,7 @@ module Avo
12
12
  when "pro"
13
13
  ProLicense.new @hq_response
14
14
  else
15
- NilLicense.new @hq_response
15
+ NullLicense.new @hq_response
16
16
  end
17
17
  end
18
18
 
@@ -1,6 +1,6 @@
1
1
  module Avo
2
2
  module Licensing
3
- class NilLicense < License
3
+ class NullLicense < License
4
4
  def initialize(response = nil)
5
5
  response ||= {
6
6
  id: "community",
@@ -6,7 +6,7 @@ module Avo
6
6
  end
7
7
 
8
8
  def method_missing(method, *args, &block)
9
- matched_field = Avo.field_manager.find do |field|
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
@@ -2,15 +2,5 @@ module Avo
2
2
  class Plugin
3
3
  def initialize(*, **, &block)
4
4
  end
5
-
6
- class << self
7
- def version
8
- "#{namespace}::VERSION".safe_constantize
9
- end
10
-
11
- def namespace
12
- to_s.split("::").first
13
- end
14
- end
15
5
  end
16
6
  end
@@ -25,13 +25,15 @@ module Avo
25
25
  end
26
26
 
27
27
  def register_field(method_name, klass)
28
- Avo.field_manager.load_field method_name, klass
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.chomp("::Plugin").underscore.tr("/", "-") == name.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[Avo::DynamicFilters::Engine.root.join("lib", "avo", "dynamic_filters").to_s] = ["rb"]
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, :include, :style
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
@@ -6,7 +6,7 @@ module Avo
6
6
  super(**args)
7
7
 
8
8
  if args[:item].present?
9
- @label = I18n.t("avo.create_new_item", item: args[:item].humanize(capitalize: false)) if label.nil?
9
+ @label = I18n.t("avo.create_new_item", item: args[:item]) if label.nil?
10
10
  end
11
11
  end
12
12
  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]).humanize if title.nil?
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]).humanize if title.nil?
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