pg_rails 7.3.0 → 7.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/pg_associable/app/helpers/pg_associable/form_builder_methods.rb +8 -0
  3. data/pg_associable/app/helpers/pg_associable/helpers.rb +2 -2
  4. data/pg_associable/app/javascript/modal_controller.js +66 -4
  5. data/pg_associable/spec/system/associable_spec.rb +28 -5
  6. data/pg_engine/app/assets/stylesheets/pg_rails_b5.scss +5 -0
  7. data/pg_engine/app/components/date_selector_component.rb +2 -2
  8. data/pg_engine/app/components/modal_content_component.rb +20 -19
  9. data/pg_engine/app/components/search_bar_component.html.slim +1 -1
  10. data/pg_engine/app/controllers/admin/accounts_controller.rb +1 -1
  11. data/pg_engine/app/controllers/admin/email_logs_controller.rb +1 -1
  12. data/pg_engine/app/controllers/admin/emails_controller.rb +1 -1
  13. data/pg_engine/app/controllers/admin/user_accounts_controller.rb +1 -1
  14. data/pg_engine/app/controllers/admin/users_controller.rb +1 -1
  15. data/pg_engine/app/controllers/concerns/pg_engine/resource.rb +209 -86
  16. data/pg_engine/app/controllers/pg_engine/base_controller.rb +5 -0
  17. data/pg_engine/app/controllers/public/mensaje_contactos_controller.rb +1 -1
  18. data/pg_engine/app/decorators/pg_engine/base_record_decorator.rb +27 -16
  19. data/pg_engine/app/helpers/pg_engine/form_helper.rb +0 -5
  20. data/pg_engine/app/helpers/pg_engine/frame_helper.rb +52 -0
  21. data/pg_engine/app/lib/pg_engine/bootstrap5_breadcrumbs_builder.rb +22 -0
  22. data/pg_engine/app/lib/pg_engine/filtros_builder.rb +3 -2
  23. data/pg_engine/app/models/current.rb +1 -1
  24. data/pg_engine/app/models/pg_engine/base_record.rb +2 -0
  25. data/pg_engine/app/views/pg_engine/base/edit.html.slim +1 -2
  26. data/pg_engine/app/views/pg_engine/base/index.html.slim +2 -3
  27. data/pg_engine/config/initializers/ransack_memory.rb +13 -2
  28. data/pg_engine/config/locales/es.yml +1 -1
  29. data/pg_engine/spec/controllers/concerns/pg_engine/resource_helper_spec.rb +0 -2
  30. data/pg_engine/spec/lib/pg_engine/form_helper_spec.rb +0 -2
  31. data/pg_engine/spec/system/breadcrumbs_spec.rb +61 -0
  32. data/pg_engine/spec/system/destroy_spec.rb +1 -1
  33. data/pg_engine/spec/system/login_spec.rb +1 -1
  34. data/pg_engine/spec/system/modal_windows_spec.rb +4 -4
  35. data/pg_layout/app/javascript/application.js +14 -0
  36. data/pg_layout/app/javascript/config/turbo_rails/index.js +4 -1
  37. data/pg_layout/app/javascript/controllers/embedded_frame_controller.js +10 -0
  38. data/pg_layout/app/javascript/controllers/index.js +2 -0
  39. data/pg_layout/app/javascript/controllers/tooltip_controller.js +8 -0
  40. data/pg_layout/app/javascript/elements/pg_event.js +2 -1
  41. data/pg_layout/app/views/layouts/pg_layout/base.html.slim +45 -17
  42. data/pg_layout/app/views/layouts/pg_layout/containerized.html.slim +1 -1
  43. data/pg_rails/lib/version.rb +1 -1
  44. data/pg_rails/scss/bootstrap_overrides.scss +2 -1
  45. data/pg_rails/scss/pg_rails.scss +8 -1
  46. data/pg_scaffold/lib/generators/pg_scaffold/templates/controller.rb +2 -4
  47. metadata +6 -6
  48. data/pg_engine/app/components/form_modal_component.html.slim +0 -15
  49. data/pg_engine/app/components/form_modal_component.rb +0 -6
  50. data/pg_engine/app/components/show_modal_component.html.slim +0 -10
  51. data/pg_engine/app/components/show_modal_component.rb +0 -7
@@ -14,6 +14,8 @@ module PgEngine
14
14
  before_update :setear_actualizado_por
15
15
 
16
16
  class << self
17
+ # This is a per class variable, all subclasses of BaseRecord inherit it
18
+ # BUT **the values are independent between all of them**
17
19
  attr_accessor :default_modal
18
20
  end
19
21
 
@@ -1,5 +1,4 @@
1
1
  - content_for :title do
2
2
  | Modificar #{@clase_modelo.nombre_singular.downcase}
3
3
 
4
- .p-3
5
- = render 'form'
4
+ = render 'form'
@@ -46,7 +46,7 @@ div
46
46
  ul.list-group.list-group-horizontal
47
47
  - available_page_sizes.each do |page_size|
48
48
  = link_to page_size,
49
- namespaced_path(@clase_modelo, page_size:),
49
+ url_for(page_size:),
50
50
  class: "list-group-item py-0 px-1 #{'active' if current_page_size == page_size}"
51
51
  - elsif @records_filtered
52
52
  - i18n_key = "#{controller_key}.#{action_name}.index.empty_but_filtered"
@@ -54,8 +54,7 @@ div
54
54
  = t(i18n_key, default: :'.empty_but_filtered', model: @clase_modelo.nombre_plural.downcase)
55
55
  | :
56
56
  span.ms-2
57
- = link_to namespaced_path(@clase_modelo, mostrar_filtros: 1) do
58
- | Limpiar búsqueda
57
+ = link_to 'Limpiar búsqueda', url_for + '?cancel_filter=true'
59
58
  - else
60
59
  - i18n_key = "#{controller_key}.#{action_name}.index.empty"
61
60
  p.m-3 = t(i18n_key, default: :'.empty', model: @clase_modelo.nombre_plural.downcase)
@@ -1,4 +1,15 @@
1
1
  RansackMemory::Core.config = {
2
- param: :q, # this means the default Ransack param name for searching. You can change it
3
- session_key_format: '%controller_name%_%action_name%_%request_format%' # this means how the key used to store the information to the session will be stored. Currently it interpolates request parameters. You can customize it and use these vars to build a key that fits your needs
2
+ # This means the default Ransack param name for searching. You can change it
3
+ param: :q,
4
+
5
+ # This means how the key used to store the information to the session
6
+ # will be stored. Currently it interpolates request parameters.
7
+ # You can customize it and use these vars to build a key that fits your needs
8
+ #
9
+ # Available variables are:
10
+ # controller_name
11
+ # action_name
12
+ # request_format
13
+ # turbo_frame
14
+ session_key_format: '%controller_name%_%action_name%_%request_format%_%turbo_frame%'
4
15
  }
@@ -14,7 +14,7 @@ es:
14
14
  pg_engine:
15
15
  base:
16
16
  index:
17
- empty: 'No hay %{model} aún'
17
+ empty: 'No hay %{model} que mostrar'
18
18
  empty_but_filtered: 'No hay %{model} para los filtros aplicados'
19
19
  attributes:
20
20
  external_labels: Etiquetas externas
@@ -14,7 +14,6 @@ describe PgEngine::Resource do
14
14
  allow(request).to receive_messages(filtered_parameters: { id: 321 },
15
15
  parameters: { id: 321 })
16
16
  allow(instancia).to receive(:request).and_return(request)
17
- instancia.set_clase_modelo
18
17
  end
19
18
 
20
19
  it do
@@ -34,7 +33,6 @@ describe PgEngine::Resource do
34
33
  allow(request).to receive_messages(filtered_parameters: { id: categoria_de_cosa.to_param },
35
34
  parameters: { id: categoria_de_cosa.to_param })
36
35
  allow(instancia).to receive(:request).and_return(request)
37
- instancia.set_clase_modelo
38
36
  end
39
37
 
40
38
  it do
@@ -11,8 +11,6 @@ describe PgEngine::FormHelper do
11
11
  {}
12
12
  end
13
13
 
14
- let(:using_modal) { false }
15
-
16
14
  let(:view_context) do
17
15
  cont = Admin::CosasController.new
18
16
  cont.request = ActionDispatch::TestRequest.create
@@ -0,0 +1,61 @@
1
+ # Initially generated with PgRails::SystemSpecGenerator
2
+ # https://github.com/martin-rosso/pg_rails
3
+
4
+ require 'rails_helper'
5
+
6
+ # By default uses selenium_chrome_headless_iphone driver
7
+ # run with DRIVER environment variable to override, eg:
8
+ #
9
+ # DRIVER=selenium rspec
10
+ describe 'Breadcrumbs' do
11
+ subject(:visitar) do
12
+ visit path
13
+ end
14
+
15
+ let(:path) { "/admin/cosas/#{cosa.id}" }
16
+ let(:cosa) { create :cosa }
17
+ let(:logged_user) { create :user, :developer }
18
+ let(:account) { logged_user.current_account }
19
+
20
+ before do
21
+ login_as logged_user
22
+ end
23
+
24
+ describe 'some case' do
25
+ it do
26
+ visitar
27
+
28
+ expect(page).to have_css('nav ol.breadcrumb li').exactly(2)
29
+ expect(page).to have_css('nav ol.breadcrumb li a').exactly(1)
30
+ end
31
+
32
+ context 'cuando es con nested' do
33
+ let(:path) do
34
+ hashid = cosa.categoria_de_cosa.hashid
35
+ "/admin/categoria_de_cosas/#{hashid}/cosas/#{cosa.id}"
36
+ end
37
+
38
+ it do
39
+ visitar
40
+
41
+ expect(page).to have_css('nav ol.breadcrumb li').exactly(3)
42
+ expect(page).to have_css('nav ol.breadcrumb li a').exactly(1)
43
+ end
44
+ end
45
+
46
+ context 'cuando es con nested y modal' do
47
+ let(:path) do
48
+ hashid = cosa.categoria_de_cosa.hashid
49
+ "/admin/categoria_de_cosas/#{hashid}"
50
+ end
51
+
52
+ it do
53
+ visitar
54
+ find('td span[title=Ver] a').click
55
+
56
+ expect(page).to have_css('.modal nav ol.breadcrumb li').exactly(3)
57
+ expect(page).to have_no_css('.modal nav ol.breadcrumb li a')
58
+ end
59
+ end
60
+ end
61
+ end
@@ -43,7 +43,7 @@ describe 'Sign in' do
43
43
  visit "/frontend/cosas/#{cosa.to_param}"
44
44
  end
45
45
 
46
- it do
46
+ it 'muestra el flash' do
47
47
  subject
48
48
  expect(page).to have_current_path('/frontend/cosas')
49
49
  expect(page).to have_text('Coso borrado')
@@ -16,7 +16,7 @@ describe 'Sign in' do
16
16
 
17
17
  it do
18
18
  subject
19
- expect(page).to have_text :all, 'No hay categorías de cosas aún'
19
+ expect(page).to have_text :all, 'No hay categorías de cosas que mostrar'
20
20
  end
21
21
  end
22
22
 
@@ -24,11 +24,11 @@ describe 'Modal windows' do
24
24
  it do
25
25
  visitar
26
26
  click_on 'Cargar coso'
27
- select 'Completar'
28
- select categoria_de_cosa.to_s
27
+ select 'Completar', from: 'cosa_tipo'
28
+ select categoria_de_cosa.to_s, from: 'cosa_categoria_de_cosa_id'
29
29
  find('.modal input[type=submit]').click
30
30
  expect(page).to have_text 'Por favor, revisá los campos obligatorios'
31
- fill_in 'Nombre', with: 'bla'
31
+ fill_in 'cosa_nombre', with: 'bla'
32
32
  find('.modal input[type=submit]').click
33
33
  expect(page).to have_text 'bla'
34
34
  end
@@ -68,7 +68,7 @@ describe 'Modal windows' do
68
68
  accept_confirm do
69
69
  find('.modal span[title=Eliminar] a').click
70
70
  end
71
- expect(page).to have_text 'No hay cosos aún'
71
+ expect(page).to have_text 'No hay cosos que mostrar'
72
72
  end
73
73
 
74
74
  context 'cuando da error' do
@@ -25,3 +25,17 @@ document.addEventListener('pg:record-destroyed', (ev) => {
25
25
  Turbo.cache.clear()
26
26
  }, 1000)
27
27
  })
28
+
29
+ document.addEventListener('turbo:before-fetch-request', (ev) => {
30
+ // Si es POST, quito la opción text/vnd.turbo-stream.html para que
31
+ // on successful redirect no haya posibilidad de que se abra un modal
32
+ // FIXME: buscar una manera mejor de hacerlo porque es para problemas
33
+ // quizás, con la movida de abrir modales desde JS
34
+ if (ev.detail.fetchOptions.method === 'post') {
35
+ ev.detail.fetchOptions.headers.Accept = 'text/html, application/xhtml+xml'
36
+ }
37
+
38
+ if (document.querySelector('.modal.show')) {
39
+ ev.detail.fetchOptions.headers['Modal-Opened'] = true
40
+ }
41
+ })
@@ -9,7 +9,10 @@ import '@hotwired/turbo-rails'
9
9
  // TODO: testear con capybara
10
10
  document.addEventListener('turbo:before-cache', () => {
11
11
  document.querySelectorAll('#flash .alert').forEach((el) => {
12
- el.remove()
12
+ // FIXME: en los destroy desde main frame, turbo llama a before-cache
13
+ // después de renderear el redirect, por eso no puedo hacer el remove
14
+ //
15
+ // el.remove()
13
16
  })
14
17
  document.querySelectorAll('.offcanvas-backdrop').forEach((el) => {
15
18
  el.remove()
@@ -0,0 +1,10 @@
1
+ import { Controller } from '@hotwired/stimulus'
2
+
3
+ export default class extends Controller {
4
+ connect () {
5
+ this.element.addEventListener('pg:record-destroyed', (ev) => {
6
+ this.element.querySelector('turbo-frame').reload()
7
+ ev.stopPropagation()
8
+ })
9
+ }
10
+ }
@@ -14,6 +14,7 @@ import TooltipController from './tooltip_controller'
14
14
  import PopoverController from './popover_controller'
15
15
  import PopoverTogglerController from './popover_toggler_controller'
16
16
  import DateSelectorController from './date_selector_controller'
17
+ import EmbeddedFrameController from './embedded_frame_controller'
17
18
 
18
19
  application.register('navbar', NavbarController)
19
20
  application.register('nested', NestedController)
@@ -29,5 +30,6 @@ application.register('tooltip', TooltipController)
29
30
  application.register('popover', PopoverController)
30
31
  application.register('popover-toggler', PopoverTogglerController)
31
32
  application.register('date-selector', DateSelectorController)
33
+ application.register('embedded-frame', EmbeddedFrameController)
32
34
 
33
35
  // TODO: testear con capybara todo lo que se pueda
@@ -20,6 +20,14 @@ export default class extends Controller {
20
20
  }
21
21
  }
22
22
 
23
+ setContent (content) {
24
+ this.tooltip.setContent({ '.tooltip-inner': content })
25
+ }
26
+
27
+ hide () {
28
+ this.tooltip.hide()
29
+ }
30
+
23
31
  disconnect () {
24
32
  if (this.tooltip) {
25
33
  this.tooltip.dispose()
@@ -1,6 +1,7 @@
1
1
  class PgEventElement extends HTMLElement {
2
2
  connectedCallback () {
3
- this.dispatchEvent(new MessageEvent(this.dataset.eventName, { bubbles: true, data: this }))
3
+ const event = new MessageEvent(this.dataset.eventName, { bubbles: true, data: this })
4
+ this.dispatchEvent(event)
4
5
  }
5
6
 
6
7
  disconnectedCallback () {
@@ -59,23 +59,51 @@ html
59
59
  div
60
60
  = render partial: 'pg_layout/navbar' if @navbar.present?
61
61
  div
62
- - if user_signed_in? && breadcrumbs.any?
63
- .d-flex.px-3.py-1.d-print-none[
64
- class="bg-primary-subtle align-items-center justify-content-between"
65
- style="min-height: 2.5em;"]
66
- nav aria-label="breadcrumb"
67
- = render_breadcrumbs
68
- / = render_breadcrumbs builder: ::Bootstrap4BreadcrumbsBuilder
69
- .btn-toolbar.gap-1
70
- = yield(:actions)
71
- hr.my-0
72
- - content = content_for?(:content) ? yield(:content) : yield
73
- - unless content.include? 'flash-container'
74
- = render FlashContainerComponent.new
75
- / TODO: si hay varios flashes toast, se superponen. habría que
76
- hacer un container con position absolute para los toasts
77
- = yield(:filtros)
78
- = content
62
+ / FIXME: rename to main, use a constant
63
+ = turbo_frame_tag current_turbo_frame || 'top',
64
+ **{ 'data-turbo-action': (turbo_frame? ? nil : :advance) }.compact do
65
+ - if user_signed_in? && breadcrumbs.any?
66
+ .d-flex.d-print-none
67
+ .d-flex.flex-grow-1.px-3.py-1[
68
+ class="#{nav_bg} align-items-center justify-content-between"
69
+ style="min-height: 2.5em;"]
70
+ nav.d-flex aria-label="breadcrumb"
71
+ - unless frame_embedded?
72
+ i.bi-segmented-nav.me-2
73
+ ol.breadcrumb
74
+ = render_breadcrumbs builder: PgEngine::Bootstrap5BreadcrumbsBuilder
75
+
76
+ .btn-toolbar.gap-1
77
+ = yield(:actions)
78
+ - if using_modal?
79
+ .px-2.d-flex.align-items-center.border.border-start-0
80
+ = button_tag type: :button, class: 'btn btn-sm btn-link',
81
+ data: { action: 'modal#maximize',
82
+ controller: :tooltip, 'bs-title': 'Maximizar' } do
83
+ i.bi-fullscreen
84
+ = link_to request.url,
85
+ class: 'btn btn-sm btn-link',
86
+ data: { controller: :tooltip,
87
+ 'turbo-frame': :_top,
88
+ 'bs-title': 'Reemplazar ventana principal' } do
89
+ i.bi-box-arrow-up-right
90
+ = button_tag type: :button, class: 'btn btn-sm btn-link',
91
+ data: { controller: :tooltip,
92
+ 'bs-title': 'Cerrar', 'bs-dismiss': :modal },
93
+ 'aria-label': 'Close' do
94
+ i.bi-x-lg
95
+
96
+ / hr.my-0
97
+ - content = content_for?(:content) ? yield(:content) : yield
98
+ / FIXME: rename to main?
99
+ - if (!turbo_frame? || current_turbo_frame == 'top') && \
100
+ content.exclude?('flash-container')
101
+ = render FlashContainerComponent.new
102
+ / TODO: si hay varios flashes toast, se superponen. habría que
103
+ hacer un container con position absolute para los toasts
104
+ = yield(:filtros)
105
+ = content
106
+
79
107
  div style="width:100%; height: 10em"
80
108
  .d-flex.gap-1.justify-content-center.opacity-50 data-controller="theme"
81
109
  | (Beta) Tema:
@@ -1,5 +1,5 @@
1
1
  - content_for :content do
2
- .container-fluid.pt-3
2
+ div class="pt-3 #{modal_targeted? ? '' : 'container-fluid'}"
3
3
  = content_for?(:containerized_content) ? yield(:containerized_content) : yield
4
4
 
5
5
  = render template: 'layouts/pg_layout/base'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PgRails
4
- VERSION = '7.3.0'
4
+ VERSION = '7.3.2'
5
5
  end
@@ -10,5 +10,6 @@ $warning-border-subtle: tint-color($warning, 20%);
10
10
  $secondary-bg-subtle: tint-color($secondary, 92%);
11
11
  // $warning-bg-subtle: tint-color($warning, 40%);
12
12
 
13
-
14
13
  $btn-close-focus-shadow: none;
14
+
15
+ $breadcrumb-divider: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='8' height='8'><path d='M2.5 0L1 1.5 3.5 4 1 6.5 2.5 8l4-4-4-4z' fill='#{$breadcrumb-divider-color}'/></svg>");
@@ -31,6 +31,8 @@ $focus-ring-width: .05rem;
31
31
  $alert-padding-y: 0.5rem;
32
32
  $alert-margin-bottom: 0.5rem;
33
33
 
34
+ $breadcrumb-margin-bottom: 0;
35
+
34
36
  @import 'bootstrap_pre';
35
37
  @import 'bootstrap_overrides';
36
38
  @import 'bootstrap_post';
@@ -63,10 +65,15 @@ $alert-margin-bottom: 0.5rem;
63
65
 
64
66
 
65
67
  $warning-border-emphasis: shade-color($yellow, 60%);
66
- .bg-primary-subtle .btn-warning {
68
+ .btn-toolbar .btn-warning {
67
69
  border: 1px solid $warning-border-emphasis;
68
70
  }
69
71
 
72
+ $light-border-emphasis: shade-color($light, 60%);
73
+ .btn-toolbar .btn-light {
74
+ border: 1px solid $light-border-emphasis;
75
+ }
76
+
70
77
  .listado tr:has(td:hover):has(.bi-eye-fill) td {
71
78
  background-color: #f2f2f2;
72
79
  cursor: pointer;
@@ -9,16 +9,14 @@ require_dependency "<%= namespaced_path %>/application_controller"
9
9
  <% module_namespacing do -%>
10
10
  <% module_namespacing_2 do -%>
11
11
  class <%= controller_class_name.split('::').last %>Controller < <%= parent_controller %>
12
- include PgEngine::Resource
13
-
14
12
  before_action { @clase_modelo = <%= class_name.split('::').last %> }
15
13
 
14
+ include PgEngine::Resource
15
+
16
16
  before_action(only: :index) { authorize <%= class_name.split('::').last %> }
17
17
 
18
18
  before_action :set_instancia_modelo, only: %i[new create show edit update destroy]
19
19
 
20
- add_breadcrumb <%= class_name.split('::').last %>.nombre_plural, :<%= plural_route_name %>_path
21
-
22
20
  private
23
21
 
24
22
  def atributos_permitidos
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.3.0
4
+ version: 7.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martín Rosso
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-21 00:00:00.000000000 Z
11
+ date: 2024-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -646,8 +646,6 @@ files:
646
646
  - pg_engine/app/components/date_selector_component.html.slim
647
647
  - pg_engine/app/components/date_selector_component.rb
648
648
  - pg_engine/app/components/flash_container_component.rb
649
- - pg_engine/app/components/form_modal_component.html.slim
650
- - pg_engine/app/components/form_modal_component.rb
651
649
  - pg_engine/app/components/internal_error_component.rb
652
650
  - pg_engine/app/components/modal_component.html.slim
653
651
  - pg_engine/app/components/modal_component.rb
@@ -659,8 +657,6 @@ files:
659
657
  - pg_engine/app/components/search_bar_component.rb
660
658
  - pg_engine/app/components/search_bar_toggler_component.html.slim
661
659
  - pg_engine/app/components/search_bar_toggler_component.rb
662
- - pg_engine/app/components/show_modal_component.html.slim
663
- - pg_engine/app/components/show_modal_component.rb
664
660
  - pg_engine/app/controllers/admin/accounts_controller.rb
665
661
  - pg_engine/app/controllers/admin/email_logs_controller.rb
666
662
  - pg_engine/app/controllers/admin/emails_controller.rb
@@ -688,6 +684,7 @@ files:
688
684
  - pg_engine/app/decorators/user_decorator.rb
689
685
  - pg_engine/app/helpers/pg_engine/flash_helper.rb
690
686
  - pg_engine/app/helpers/pg_engine/form_helper.rb
687
+ - pg_engine/app/helpers/pg_engine/frame_helper.rb
691
688
  - pg_engine/app/helpers/pg_engine/i18n_helper.rb
692
689
  - pg_engine/app/helpers/pg_engine/index_helper.rb
693
690
  - pg_engine/app/helpers/pg_engine/pg_rails_helper.rb
@@ -695,6 +692,7 @@ files:
695
692
  - pg_engine/app/helpers/pg_engine/print_helper.rb
696
693
  - pg_engine/app/helpers/pg_engine/route_helper.rb
697
694
  - pg_engine/app/inputs/pg_engine/fecha_input.rb
695
+ - pg_engine/app/lib/pg_engine/bootstrap5_breadcrumbs_builder.rb
698
696
  - pg_engine/app/lib/pg_engine/date_jumper.rb
699
697
  - pg_engine/app/lib/pg_engine/devise_failure_app.rb
700
698
  - pg_engine/app/lib/pg_engine/error_helper.rb
@@ -855,6 +853,7 @@ files:
855
853
  - pg_engine/spec/requests/base_controller_requests_spec.rb
856
854
  - pg_engine/spec/requests/users/date_jumper_spec.rb
857
855
  - pg_engine/spec/system/alerts_spec.rb
856
+ - pg_engine/spec/system/breadcrumbs_spec.rb
858
857
  - pg_engine/spec/system/date_selector_spec.rb
859
858
  - pg_engine/spec/system/destroy_spec.rb
860
859
  - pg_engine/spec/system/login_spec.rb
@@ -880,6 +879,7 @@ files:
880
879
  - pg_layout/app/javascript/controllers/application.js
881
880
  - pg_layout/app/javascript/controllers/clear_timeout_controller.js
882
881
  - pg_layout/app/javascript/controllers/date_selector_controller.js
882
+ - pg_layout/app/javascript/controllers/embedded_frame_controller.js
883
883
  - pg_layout/app/javascript/controllers/fadein_onload_controller.js
884
884
  - pg_layout/app/javascript/controllers/filtros_controller.js
885
885
  - pg_layout/app/javascript/controllers/index.js
@@ -1,15 +0,0 @@
1
- = render ModalContentComponent.new do |content|
2
- - content.with_header do
3
- / TODO: render breadcrumbs?
4
- - if @record.persisted?
5
- = link_to @record.target_object do
6
- | Ir al #{@record.class.nombre_singular.downcase}
7
- span.ms-1 » Modificando
8
- - else
9
- .fs-5 = @record.decorate.submit_default_value
10
-
11
- / - content.with_actions do
12
- = render @record.actions_component
13
-
14
- - content.with_body do
15
- = render partial: 'form', locals: { object: @record }
@@ -1,6 +0,0 @@
1
- class FormModalComponent < ViewComponent::Base
2
- def initialize(record)
3
- @record = record
4
- super
5
- end
6
- end
@@ -1,10 +0,0 @@
1
- = render ModalContentComponent.new do |content|
2
- - content.with_header do
3
- = link_to @record.target_object, 'data-turbo-frame': '_top' do
4
- | Ir al #{@record.class.nombre_singular.downcase}
5
-
6
- - content.with_actions do
7
- = render @record.actions_component
8
-
9
- - content.with_body do
10
- = render @record
@@ -1,7 +0,0 @@
1
- class ShowModalComponent < ViewComponent::Base
2
- def initialize(record, **)
3
- @record = record
4
-
5
- super(**)
6
- end
7
- end