avo 1.0.2 → 1.2.2

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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +7 -4
  3. data/Gemfile.lock +19 -4
  4. data/README.md +3 -1
  5. data/app/components/avo/edit/fields/belongs_to_field_component.html.erb +0 -1
  6. data/app/components/avo/edit/fields/belongs_to_field_component.rb +7 -0
  7. data/app/components/avo/index/grid_cover_empty_state_component.html.erb +3 -0
  8. data/app/components/avo/index/grid_cover_empty_state_component.rb +4 -0
  9. data/app/components/avo/index/grid_item_component.html.erb +4 -4
  10. data/app/components/avo/modal_component.rb +2 -1
  11. data/app/components/avo/panel_component.html.erb +7 -2
  12. data/app/components/avo/panel_component.rb +4 -1
  13. data/app/components/avo/show/fields/has_one_field_component.html.erb +3 -3
  14. data/app/components/avo/views/resource_edit_component.html.erb +3 -3
  15. data/app/components/avo/views/resource_index_component.html.erb +6 -6
  16. data/app/components/avo/views/resource_new_component.html.erb +3 -3
  17. data/app/components/avo/views/resource_show_component.html.erb +2 -2
  18. data/app/controllers/avo/application_controller.rb +12 -8
  19. data/app/controllers/avo/base_controller.rb +16 -0
  20. data/app/controllers/avo/home_controller.rb +2 -0
  21. data/app/helpers/avo/application_helper.rb +0 -30
  22. data/app/packs/entrypoints/application.css +1 -0
  23. data/app/packs/stylesheets/breadcrumbs.css +12 -0
  24. data/app/packs/svgs/chevron-right.svg +3 -0
  25. data/app/views/avo/actions/show.html.erb +2 -2
  26. data/app/views/avo/home/index.html.erb +3 -3
  27. data/{lib/generators/avo/templates → app/views/avo}/partials/_scripts.html.erb +0 -0
  28. data/app/views/avo/relations/new.html.erb +2 -2
  29. data/app/views/avo/sidebar/_sidebar.html.erb +11 -2
  30. data/app/views/layouts/avo/application.html.erb +5 -4
  31. data/avo.gemspec +2 -0
  32. data/lib/avo/app.rb +28 -9
  33. data/lib/avo/base_resource.rb +12 -12
  34. data/lib/avo/configuration.rb +11 -1
  35. data/lib/avo/fields/belongs_to_field.rb +0 -2
  36. data/lib/avo/grid_collector.rb +1 -1
  37. data/lib/avo/version.rb +1 -1
  38. data/lib/generators/avo/eject_generator.rb +55 -0
  39. data/lib/generators/avo/templates/tool/controller.tt +2 -0
  40. data/lib/generators/avo/templates/tool/sidebar_item.tt +1 -0
  41. data/lib/generators/avo/templates/tool/view.tt +27 -0
  42. data/lib/generators/avo/tool_generator.rb +62 -0
  43. data/public/avo-packs/css/{application-9d115b7e.css → application-13cc02fb.css} +41 -7
  44. data/public/avo-packs/css/application-13cc02fb.css.br +0 -0
  45. data/public/avo-packs/css/application-13cc02fb.css.gz +0 -0
  46. data/public/avo-packs/css/application-13cc02fb.css.map +1 -0
  47. data/public/avo-packs/css/application-13cc02fb.css.map.br +0 -0
  48. data/public/avo-packs/css/application-13cc02fb.css.map.gz +0 -0
  49. data/public/avo-packs/js/application-e351ef988a3cb9687542.js.map +1 -1
  50. data/public/avo-packs/js/application-e351ef988a3cb9687542.js.map.br +0 -0
  51. data/public/avo-packs/js/application-e351ef988a3cb9687542.js.map.gz +0 -0
  52. data/public/avo-packs/manifest.json +7 -7
  53. metadata +46 -13
  54. data/lib/generators/avo/partials_generator.rb +0 -14
  55. data/lib/generators/avo/templates/partials/_footer.html.erb +0 -3
  56. data/lib/generators/avo/templates/partials/_header.html.erb +0 -1
  57. data/lib/generators/avo/templates/partials/_logo.html.erb +0 -1
  58. data/public/avo-packs/css/application-9d115b7e.css.br +0 -0
  59. data/public/avo-packs/css/application-9d115b7e.css.gz +0 -0
  60. data/public/avo-packs/css/application-9d115b7e.css.map +0 -1
  61. data/public/avo-packs/css/application-9d115b7e.css.map.br +0 -0
  62. data/public/avo-packs/css/application-9d115b7e.css.map.gz +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d4deaec43a305c17e1cfb0427f2f2539ffe31f3aa0abbd2f353d45c4fbd7c122
4
- data.tar.gz: a6351b2c75af841dda72bf09e85f693e6e1b0b733f4e47fe73de4e6577e0afbc
3
+ metadata.gz: a5cd3316f4906c09337ae6079468f6779b272ec800112cefa1db60a169acaddf
4
+ data.tar.gz: 6238d803e939ed4471cf6b67fbcf2568bc74fddd6f125eb10575d15f2ee6c244
5
5
  SHA512:
6
- metadata.gz: 5e0ab93027fd906fed93a6e188034d83adcc57a712c75522c856fca89982d6fed648251d7037e5ab3f48d528205475bdd6f7f9214efe59d580ee0b7d4945f261
7
- data.tar.gz: 1222aba1414d9ea3e7392698b3a0a8917b8d0d56ac4e746afd3373b2f2f8d648263eaa93b30601216c976d040ebc4ead197e9d49b79e8f9427fb3ac0b73de3cc
6
+ metadata.gz: 3e81e69fdb6f0094ccada08f1ca66c522fbf813b9dbc310de63a8c1ed64c9155d62e2dadee337b7ea937280755b157325e07ada2de94a88e219d4f29a8c58d66
7
+ data.tar.gz: f82850865b3a6592364534c33b4766f808e9d869025ea57bbe8148625fd0399d46575046d86bcca9115a68f604c302628c39965ba7f36f55c9822f2b3bf41480
data/Gemfile CHANGED
@@ -52,7 +52,7 @@ gem "byebug", platforms: [:mri, :mingw, :x64_mingw]
52
52
  gem "dotenv-rails"
53
53
  # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
54
54
  gem "web-console", ">= 3.3.0"
55
- gem "listen", ">= 3.3.0"
55
+ gem "listen", ">= 3.5.1"
56
56
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
57
57
  gem "spring"
58
58
 
@@ -106,9 +106,6 @@ end
106
106
 
107
107
  gem "zeitwerk", "~> 2.3"
108
108
 
109
- # Pagination
110
- gem "pagy"
111
-
112
109
  gem "httparty"
113
110
 
114
111
  gem "iso"
@@ -120,3 +117,9 @@ gem "active_link_to"
120
117
  gem "view_component", require: "view_component/engine"
121
118
 
122
119
  gem "addressable"
120
+
121
+ gem "appraisal"
122
+
123
+ gem 'meta-tags'
124
+
125
+ gem 'breadcrumbs_on_rails'
data/Gemfile.lock CHANGED
@@ -1,13 +1,15 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- avo (1.0.2)
4
+ avo (1.2.2)
5
5
  active_link_to
6
6
  addressable
7
+ breadcrumbs_on_rails
7
8
  countries
8
9
  hotwire-rails
9
10
  httparty
10
11
  image_processing
12
+ meta-tags
11
13
  pagy
12
14
  pundit
13
15
  rails (>= 6.0)
@@ -78,11 +80,17 @@ GEM
78
80
  zeitwerk (~> 2.2, >= 2.2.2)
79
81
  addressable (2.7.0)
80
82
  public_suffix (>= 2.0.2, < 5.0)
83
+ appraisal (2.4.0)
84
+ bundler
85
+ rake
86
+ thor (>= 0.14.0)
81
87
  ast (2.4.2)
82
88
  bcrypt (3.1.16)
83
89
  bindex (0.8.1)
84
90
  bootsnap (1.4.8)
85
91
  msgpack (~> 1.0)
92
+ breadcrumbs_on_rails (4.0.0)
93
+ rails (>= 5.0)
86
94
  builder (3.2.4)
87
95
  bump (0.9.0)
88
96
  byebug (11.1.3)
@@ -157,6 +165,8 @@ GEM
157
165
  mail (2.7.1)
158
166
  mini_mime (>= 0.1.1)
159
167
  marcel (1.0.0)
168
+ meta-tags (2.14.0)
169
+ actionpack (>= 3.2.0, < 6.2)
160
170
  method_source (1.0.0)
161
171
  mime-types (3.3.1)
162
172
  mime-types-data (~> 3.2015)
@@ -171,6 +181,8 @@ GEM
171
181
  nokogiri (1.11.2)
172
182
  mini_portile2 (~> 2.5.0)
173
183
  racc (~> 1.4)
184
+ nokogiri (1.11.2-x86_64-linux)
185
+ racc (~> 1.4)
174
186
  orm_adapter (0.5.0)
175
187
  pagy (3.12.0)
176
188
  parallel (1.20.1)
@@ -342,12 +354,15 @@ GEM
342
354
 
343
355
  PLATFORMS
344
356
  ruby
357
+ x86_64-linux
345
358
 
346
359
  DEPENDENCIES
347
360
  active_link_to
348
361
  addressable
362
+ appraisal
349
363
  avo!
350
364
  bootsnap (>= 1.4.2)
365
+ breadcrumbs_on_rails
351
366
  bump
352
367
  byebug
353
368
  capybara (>= 2.15)
@@ -364,8 +379,8 @@ DEPENDENCIES
364
379
  image_processing (~> 1.2)
365
380
  iso
366
381
  jbuilder (~> 2.7)
367
- listen (>= 3.3.0)
368
- pagy
382
+ listen (>= 3.5.1)
383
+ meta-tags
369
384
  pg (>= 0.18, < 2.0)
370
385
  puma (~> 4.3.5)
371
386
  pundit
@@ -390,4 +405,4 @@ DEPENDENCIES
390
405
  zeitwerk (~> 2.3)
391
406
 
392
407
  BUNDLED WITH
393
- 2.2.15
408
+ 2.2.5
data/README.md CHANGED
@@ -15,10 +15,12 @@ Avo is a beautiful next-generation framework that empowers you, the developer, t
15
15
  **Documentation**: [docs.avohq.io](https://docs.avohq.io)\
16
16
  **Twitter**: [avo_hq](https://twitter.com/avo_hq)\
17
17
  **Community chat**: [discord](https://discord.gg/pkTF6y8)\
18
- **Issue tracker**: [GitHub issues](http://github.com/avo-hq/avo/issues)
18
+ **Issue tracker**: [GitHub issues](http://github.com/avo-hq/avo/issues)\
19
+ **Discussions and feature requests**: [GitHub issues](http://github.com/avo-hq/avo/discussions)
19
20
 
20
21
  ## Features
21
22
 
23
+ - **Powered by Hotwire** - Rails ❤️ Hotwire
22
24
  - **Code driven configuration** - Configure your Rails dashboard entirely by writing Ruby code.
23
25
  - **Resource Management** - Create a CRUD interface for Active Record from one command. No more copy-pasting view and controller files around.
24
26
  - **Active Storage support** - Amazingly easy, **one-line**, single or multi-file integration with **ActiveStorage**.
@@ -1,5 +1,4 @@
1
1
  <%= edit_field_wrapper field: @field, index: @index, form: @form, resource: @resource, displayed_in_modal: @displayed_in_modal do %>
2
- <% disabled = @field.readonly || params[:via_resource_id] %>
3
2
  <%= @form.select @field.foreign_key, @field.options.map { |o| [o[:label], o[:value]] },
4
3
  {
5
4
  include_blank: @field.placeholder,
@@ -1,4 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Avo::Edit::Fields::BelongsToFieldComponent < Avo::Edit::Fields::FieldComponent
4
+ def disabled
5
+ return true if @field.readonly
6
+ return true if @field.target_resource.model_class.name == params[:via_resource_class]
7
+ return true if @field.id.to_s == params[:via_relation].to_s
8
+
9
+ false
10
+ end
4
11
  end
@@ -0,0 +1,3 @@
1
+ <div class="absolute bg-gray-100 w-full h-full">
2
+ <%= helpers.svg 'avocado', class: 'relative transform -translate-x-1/2 -translate-y-1/2 h-20 text-gray-400 inset-auto top-1/2 left-1/2' %>
3
+ </div>
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Avo::Index::GridCoverEmptyStateComponent < ViewComponent::Base
4
+ end
@@ -4,7 +4,9 @@
4
4
  <div class="relative w-full pb-3/4 rounded-t-xl overflow-hidden">
5
5
  <%== item_selector_input floating: true, size: :lg %>
6
6
 
7
- <% if cover.respond_to? :to_image %>
7
+ <% if cover.blank? %>
8
+ <%= render Avo::Index::GridCoverEmptyStateComponent.new %>
9
+ <% elsif cover.respond_to? :to_image %>
8
10
  <%= link_to_if cover.link_to_resource, image_tag(cover.to_image, class: 'absolute h-full w-full object-cover'), helpers.resource_path(@resource.model), class: 'absolute h-full w-full object-cover', title: title.value %>
9
11
  <% elsif cover.type == 'file' %>
10
12
  <% if cover.value.attached? && cover.value.representable? %>
@@ -18,9 +20,7 @@
18
20
  <% if cover.value.present? %>
19
21
  <%= link_to_if cover.link_to_resource, image_tag(cover.value, class: 'absolute h-full w-full object-cover'), helpers.resource_path(@resource.model), class: 'absolute h-full w-full object-cover', title: title.value %>
20
22
  <% else %>
21
- <div class="absolute bg-gray-100 w-full h-full">
22
- <%= helpers.svg 'avocado', class: 'relative transform -translate-x-1/2 -translate-y-1/2 h-20 text-gray-400 inset-auto top-1/2 left-1/2' %>
23
- </div>
23
+ <%= render Avo::Index::GridCoverEmptyStateComponent.new %>
24
24
  <% end %>
25
25
  <% end %>
26
26
  </div>
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Avo::ModalComponent < ViewComponent::Base
4
- with_content_areas :heading, :controls
4
+ renders_one :heading
5
+ renders_one :controls
5
6
  end
@@ -1,7 +1,12 @@
1
1
  <div <%== data_attributes %>>
2
2
  <div class="mb-6">
3
- <div class="text-2xl tracking-normal font-bold text-gray-800 truncate mb-3">
4
- <%= @title %>
3
+ <div>
4
+ <div class="breadcrumbs">
5
+ <%= helpers.render_breadcrumbs(separator: helpers.svg('chevron-right', class: 'inline-block h-3 stroke-current relative top-[-1px] ml-1' )) if Avo.configuration.display_breadcrumbs %>
6
+ </div>
7
+ <div class="text-2xl tracking-normal font-bold text-gray-800 truncate">
8
+ <%= @title %>
9
+ </div>
5
10
  </div>
6
11
 
7
12
  <div>
@@ -1,7 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Avo::PanelComponent < ViewComponent::Base
4
- with_content_areas :tools, :body, :bare_content, :footer
4
+ renders_one :tools
5
+ renders_one :body
6
+ renders_one :bare_content
7
+ renders_one :footer
5
8
 
6
9
  def initialize(title: nil, body_classes: nil, data: {})
7
10
  @title = title
@@ -3,14 +3,14 @@
3
3
  <%= render(Avo::LoadingComponent.new(title: @field.name)) %>
4
4
  </turbo-frame>
5
5
  <% else %>
6
- <%= panel(title: @field.id.capitalize) do |c| %>
7
- <% c.with :tools do %>
6
+ <%= render Avo::PanelComponent.new(title: @field.id.capitalize) do |c| %>
7
+ <% c.tools do %>
8
8
  <%= a_link helpers.resource_attach_path(@resource.model.model_name.route_key, @resource.model.id, @field.id), color: 'indigo', 'data-turbo-frame': 'attach_modal' do %>
9
9
  <%= svg 'view-grid-add' %> <%= t('avo.attach_item', item: @field.id).capitalize %>
10
10
  <% end %>
11
11
  <% end %>
12
12
 
13
- <% c.with :body do %>
13
+ <% c.body do %>
14
14
  <div class="py-8 flex justify-center items-center">
15
15
  <%= empty_state @field.id %>
16
16
  </div>
@@ -3,8 +3,8 @@
3
3
  <%= form_with model: @resource.model, url: helpers.resource_path(@resource.model), method: :put, multipart: true do |form| %>
4
4
  <%= hidden_field_tag :referrer, back_path if params[:via_resource_class] %>
5
5
 
6
- <%= panel(title: resource_panel[:name]) do |component| %>
7
- <% component.with :tools do %>
6
+ <%= render Avo::PanelComponent.new(title: resource_panel[:name]) do |c| %>
7
+ <% c.tools do %>
8
8
  <div class="flex justify-end space-x-2">
9
9
  <%= a_link back_path do %>
10
10
  <%= helpers.svg 'arrow-left' %> <%= t('avo.cancel').capitalize %>
@@ -18,7 +18,7 @@
18
18
  </div>
19
19
  <% end %>
20
20
 
21
- <% component.with :body do %>
21
+ <% c.body do %>
22
22
  <% @resource.get_fields.each_with_index do |field, index| %>
23
23
  <%= edit_field field, index, @resource, form unless field.computed %>
24
24
  <% end %>
@@ -1,5 +1,5 @@
1
- <%= panel title: title, body_classes: 'py-4', data: { component: 'resources-index' } do |c| %>
2
- <% c.with :tools do %>
1
+ <%= render Avo::PanelComponent.new title: title, body_classes: 'py-4', data: { component: 'resources-index' } do |c| %>
2
+ <% c.tools do %>
3
3
  <%= render 'actions' if @actions.present? %>
4
4
 
5
5
  <% if can_create? %>
@@ -21,7 +21,7 @@
21
21
  <% end %>
22
22
  <% end %>
23
23
 
24
- <% c.with :body do %>
24
+ <% c.body do %>
25
25
  <div class="flex justify-between py-6 min-h-24"
26
26
  data-selected-resources-name="<%= @resource.plural_name.downcase %>"
27
27
  data-selected-resources="[]"
@@ -43,7 +43,7 @@
43
43
 
44
44
  <% if @models.present? %>
45
45
  <div class="py-4">
46
- <%= render partial: 'avo/partials/paginator', locals: { pagy: @pagy, turbo_frame: @turbo_frame } %>
46
+ <%= render partial: 'avo/partials/paginator', locals: { pagy: @pagy, turbo_frame: @turbo_frame || 'none' } %>
47
47
  </div>
48
48
  <% end %>
49
49
  </div>
@@ -51,11 +51,11 @@
51
51
  <% end %>
52
52
 
53
53
  <% if view_type.to_sym == :grid %>
54
- <% c.with :bare_content do %>
54
+ <% c.bare_content do %>
55
55
  <%= render Avo::Index::ResourceGridComponent.new(resources: @resources, resource: @resource, reflection: @reflection, parent_model: @parent_model) %>
56
56
 
57
57
  <div class="bg-white rounded-xl shadow-xl mt-8 py-6">
58
- <%= render partial: 'avo/partials/paginator', locals: { pagy: @pagy, turbo_frame: @turbo_frame } %>
58
+ <%= render partial: 'avo/partials/paginator', locals: { pagy: @pagy, turbo_frame: @turbo_frame || 'none' } %>
59
59
  </div>
60
60
  <% end %>
61
61
  <% end %>
@@ -1,8 +1,8 @@
1
1
  <div>
2
2
  <% @resource.panels.each do |resource_panel| %>
3
3
  <%= form_with model: @resource.model, url: helpers.resources_path(@resource.model, via_relation_class: params[:via_relation_class], via_resource_id: params[:via_resource_id]), local: true, multipart: true do |form| %>
4
- <%= panel(title: resource_panel[:name]) do |component| %>
5
- <% component.with :tools do %>
4
+ <%= render Avo::PanelComponent.new(title: resource_panel[:name]) do |c| %>
5
+ <% c.tools do %>
6
6
  <div class="flex justify-end space-x-2">
7
7
  <%= a_link back_path do %>
8
8
  <%= svg 'arrow-left' %> <%= t('avo.cancel').capitalize %>
@@ -14,7 +14,7 @@
14
14
  </div>
15
15
  <% end %>
16
16
 
17
- <% component.with :body do %>
17
+ <% c.body do %>
18
18
  <% @resource.get_fields.each_with_index do |field, index| %>
19
19
  <%= edit_field field, index, @resource, form unless field.computed %>
20
20
  <% end %>
@@ -4,7 +4,7 @@
4
4
  >
5
5
  <% @resource.panels.each do |resource_panel| %>
6
6
  <%= render(Avo::PanelComponent.new(title: resource_panel[:name])) do |c| %>
7
- <% c.with :tools do %>
7
+ <% c.tools do %>
8
8
  <% if resource_panel[:name] == @resource.default_panel_name %>
9
9
  <%= render 'actions' %>
10
10
 
@@ -44,7 +44,7 @@
44
44
  <% end %>
45
45
  <% end %>
46
46
 
47
- <% c.with :body do %>
47
+ <% c.body do %>
48
48
  <% if fields_by_panel[resource_panel[:name]].present? %>
49
49
  <% fields_by_panel[resource_panel[:name]].each_with_index do |field, index| %>
50
50
  <%= show_field field, index, @resource %>
@@ -7,6 +7,7 @@ module Avo
7
7
  before_action :set_authorization
8
8
  before_action :_authenticate!
9
9
  before_action :set_container_classes
10
+ before_action :add_initial_breadcrumbs
10
11
 
11
12
  rescue_from Pundit::NotAuthorizedError, with: :render_unauthorized
12
13
  rescue_from ActiveRecord::RecordInvalid, with: :exception_logger
@@ -51,7 +52,7 @@ module Avo
51
52
  existing_params = Addressable::URI.parse(request.fullpath).query_values.symbolize_keys
52
53
  end
53
54
  rescue; end
54
- send :"resources_#{model.model_name.route_key}_path", **existing_params, **args
55
+ avo.send :"resources_#{model.model_name.route_key}_path", **existing_params, **args
55
56
  end
56
57
 
57
58
  def related_resources_path(parent_model, model, keep_query_params: false, **args)
@@ -70,9 +71,9 @@ module Avo
70
71
  end
71
72
 
72
73
  def resource_path(model = nil, resource_id: nil, keep_query_params: false, **args)
73
- return send :"resources_#{model.model_name.route_key.singularize}_path", resource_id, **args if resource_id.present?
74
+ return avo.send :"resources_#{model.model_name.route_key.singularize}_path", resource_id, **args if resource_id.present?
74
75
 
75
- send :"resources_#{model.model_name.route_key.singularize}_path", model, **args
76
+ avo.send :"resources_#{model.model_name.route_key.singularize}_path", model, **args
76
77
  end
77
78
 
78
79
  def resource_attach_path(model_name, model_id, related_name, related_id = nil)
@@ -92,11 +93,11 @@ module Avo
92
93
  end
93
94
 
94
95
  def new_resource_path(model, **args)
95
- send :"new_resources_#{model.model_name.route_key.singularize}_path", **args
96
+ avo.send :"new_resources_#{model.model_name.route_key.singularize}_path", **args
96
97
  end
97
98
 
98
99
  def edit_resource_path(model, **args)
99
- send :"edit_resources_#{model.model_name.route_key.singularize}_path", model, **args
100
+ avo.send :"edit_resources_#{model.model_name.route_key.singularize}_path", model, **args
100
101
  end
101
102
 
102
103
  private
@@ -110,6 +111,8 @@ module Avo
110
111
  end
111
112
 
112
113
  def set_resource
114
+ raise ActionController::RoutingError.new "No route matches" if resource.nil?
115
+
113
116
  @resource = resource.hydrate(params: params)
114
117
  end
115
118
 
@@ -182,8 +185,6 @@ module Avo
182
185
  def eager_load_files(resource, query)
183
186
  if resource.attached_file_fields.present?
184
187
  resource.attached_file_fields.map do |field|
185
- # abort "#{field.pluralize}".inspect
186
- # abort field.class.inspect
187
188
  attachment = case field.class.to_s
188
189
  when "Avo::Fields::FileField"
189
190
  "attachment"
@@ -194,7 +195,6 @@ module Avo
194
195
  end
195
196
 
196
197
  return query.eager_load "#{field.id}_#{attachment}": :blob
197
- # return query.send :"with_attached_#{field}"
198
198
  end
199
199
  end
200
200
 
@@ -241,5 +241,9 @@ module Avo
241
241
 
242
242
  @container_classes = contain ? "2xl:container 2xl:mx-auto" : ""
243
243
  end
244
+
245
+ def add_initial_breadcrumbs
246
+ instance_eval(&Avo.configuration.initial_breadcrumbs) if Avo.configuration.initial_breadcrumbs.present?
247
+ end
244
248
  end
245
249
  end
@@ -9,6 +9,9 @@ module Avo
9
9
  before_action :set_model, only: [:show, :edit, :destroy, :update]
10
10
 
11
11
  def index
12
+ @page_title = resource_name.humanize
13
+ add_breadcrumb resource_name.humanize
14
+
12
15
  set_index_params
13
16
  set_filters
14
17
  set_actions
@@ -48,15 +51,28 @@ module Avo
48
51
  set_actions
49
52
 
50
53
  @resource = @resource.hydrate(model: @model, view: :show, user: _current_user, params: params)
54
+
55
+ @page_title = @resource.default_panel_name
56
+ add_breadcrumb resource_name.humanize, resources_path(@resource.model_class)
57
+ add_breadcrumb @resource.model_title
51
58
  end
52
59
 
53
60
  def new
54
61
  @model = @resource.model_class.new
55
62
  @resource = @resource.hydrate(model: @model, view: :new, user: _current_user)
63
+
64
+ @page_title = @resource.default_panel_name
65
+ add_breadcrumb resource_name.humanize, resources_path(@resource.model_class)
66
+ add_breadcrumb t("avo.new").humanize
56
67
  end
57
68
 
58
69
  def edit
59
70
  @resource = @resource.hydrate(model: @model, view: :edit, user: _current_user)
71
+
72
+ @page_title = @resource.default_panel_name
73
+ add_breadcrumb resource_name.humanize, resources_path(@resource.model_class)
74
+ add_breadcrumb @resource.model_title, resource_path(@resource.model)
75
+ add_breadcrumb t("avo.edit").humanize
60
76
  end
61
77
 
62
78
  def create