pg_rails 7.0.8.pre.alpha.88 → 7.0.8.pre.alpha.89

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/pg_engine/app/components/alert_component.html.slim +15 -0
  3. data/pg_engine/app/components/alert_component.rb +50 -0
  4. data/pg_engine/app/components/bad_request_component.rb +16 -0
  5. data/pg_engine/app/components/base_component.rb +12 -0
  6. data/pg_engine/app/components/flash_container_component.rb +9 -0
  7. data/pg_engine/app/components/internal_error_component.rb +24 -0
  8. data/pg_engine/app/controllers/pg_engine/base_controller.rb +32 -13
  9. data/pg_engine/app/helpers/pg_engine/flash_helper.rb +0 -15
  10. data/pg_engine/lib/pg_engine.rb +1 -0
  11. data/pg_engine/spec/components/alert_component_spec.rb +37 -0
  12. data/pg_engine/spec/components/internal_error_component_spec.rb +17 -0
  13. data/pg_engine/spec/components/previews/alert_component_preview/default.html.slim +29 -0
  14. data/pg_engine/spec/components/previews/alert_component_preview/dismisible.html.slim +2 -0
  15. data/pg_engine/spec/components/previews/alert_component_preview.rb +8 -0
  16. data/pg_engine/spec/components/previews/internal_error_preview/default.html.slim +2 -0
  17. data/pg_engine/spec/components/previews/internal_error_preview.rb +5 -0
  18. data/pg_engine/spec/controllers/pg_engine/base_controller_spec.rb +1 -2
  19. data/pg_engine/spec/requests/base_controller_requests_spec.rb +68 -0
  20. data/pg_engine/spec/system/alerts_spec.rb +21 -0
  21. data/pg_engine/spec/system/destroy_spec.rb +1 -1
  22. data/pg_engine/spec/system/signup_spec.rb +1 -1
  23. data/pg_layout/app/views/devise/sessions/new.html.erb +2 -1
  24. data/pg_layout/app/views/layouts/pg_layout/base.html.slim +10 -6
  25. data/pg_layout/app/views/layouts/pg_layout/centered.html.slim +6 -0
  26. data/pg_layout/app/views/pg_layout/_flash.html.slim +4 -1
  27. data/pg_rails/lib/version.rb +1 -1
  28. metadata +32 -7
  29. data/pg_layout/app/views/pg_layout/_default_error_message.html.erb +0 -13
  30. data/pg_layout/app/views/pg_layout/_error.html.erb +0 -13
  31. data/pg_layout/app/views/pg_layout/_flash_container.html.slim +0 -5
  32. data/pg_layout/app/views/pg_layout/_flash_inner.html.slim +0 -24
  33. data/pg_layout/app/views/pg_layout/error.html.erb +0 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2c900ac5b6158852a5a907b1f7f66885a23ac9257490bb927471d001df36b9bd
4
- data.tar.gz: eead4343c6e37e043067b355f57a4b9dc9e1baf65a78ec40f231efbe2171e73e
3
+ metadata.gz: d8141d5335d0993a419e183b7cb6ae3d30c89d77b2f0e620b03279f5971e6d21
4
+ data.tar.gz: 93f2de289e395627774991e6464d212430ca264cf5b7ec6ab5e89d007ed82353
5
5
  SHA512:
6
- metadata.gz: 1791df3ff62596290d1def2c00916bd24bc9248f3eaa3a7fee799b79e1f6c730d8363b87fdaead496b65b6ff1c7faaabc715edb8691cd8c70e0e1fe2c2af42ac
7
- data.tar.gz: bbd8f3bb0974366926cd19964aad87b61668877e8a5c6a8c8250e6229d00eaf5dec803f25a62489461b13080c3a5bec41bb7ecde735eeb8ec884882dbcc373fb
6
+ metadata.gz: fc6fa69e44fb872daae120dbadfa520789670fa96028e638de435b39cf44d9c183e5a42de0efe631849131b06c2f58808c5b2a207141f3c6c84cd92bb9e807da
7
+ data.tar.gz: 2a8f1e7b7d327364f58be8844f1d9b77468cb6154b0526b5ce4ccaa80037e89a07df9d6927471a37587425a9c634dbbfc45a567dbe7f022dc6a124cf97bec628
@@ -0,0 +1,15 @@
1
+ / El mt-2 es necesario para que en modo sticky (FlashContainerComponent)
2
+ / no quede pegado al borde superior
3
+ .alert.mt-2.d-inline-block[
4
+ class=@klass
5
+ data-bs-autohide="true"
6
+ aria-live="assertive" aria-atomic="true" role="alert"
7
+ ]
8
+ .d-flex.align-items-center
9
+ .bi class=icon_class
10
+
11
+ = content
12
+
13
+ - if @dismissible
14
+ button(type="button" class="btn-close"
15
+ data-bs-dismiss="alert" aria-label="Close")
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AlertComponent < ViewComponent::Base
4
+ def initialize(type:, toast: false, dismissible: true)
5
+ @type = type.to_s
6
+
7
+ # rubocop:disable Style/IfUnlessModifier
8
+ unless @type.in? ApplicationController._flash_types.map(&:to_s)
9
+ raise PgEngine::Error, 'el type no es válido'
10
+ end
11
+ # rubocop:enable Style/IfUnlessModifier
12
+
13
+ @toast = toast
14
+ @dismissible = dismissible
15
+ @klass = [
16
+ "alert-#{flash_type_to_class}",
17
+ ('alert-dismissible' if @dismissible),
18
+ ('position-absolute pg-toast' if @toast)
19
+ ].join(' ')
20
+
21
+ super
22
+ end
23
+
24
+ def icon_class
25
+ {
26
+ 'critical' => 'bi-emoji-dizzy me-3 fs-2',
27
+ 'alert' => 'bi-exclamation-triangle-fill me-2',
28
+ 'warning' => 'bi-exclamation-circle me-2',
29
+ 'success' => 'bi-check-lg me-2',
30
+ 'notice' => 'bi-info-circle me-2'
31
+ }[@type]
32
+ end
33
+
34
+ def flash_type_to_class
35
+ case @type
36
+ when 'notice'
37
+ 'info'
38
+ when 'critical', 'alert'
39
+ 'danger'
40
+ when 'warning'
41
+ 'warning'
42
+ when 'success'
43
+ 'success'
44
+ else
45
+ # :nocov:
46
+ pg_err 'no debería pasar'
47
+ # :nocov:
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,16 @@
1
+ class BadRequestComponent < BaseComponent
2
+ def self.alert_type
3
+ :alert
4
+ end
5
+
6
+ erb_template <<~ERB
7
+ <div>
8
+ <div class="mb-1">
9
+ Solicitud incorrecta
10
+ </div>
11
+ Por favor, recargá la página e intentá nuevamente
12
+ <br>
13
+ o <a class="text-decoration-underline" href="<%= new_public_mensaje_contacto_path %>">ponete en contacto con nosotros</a>
14
+ </div>
15
+ ERB
16
+ end
@@ -0,0 +1,12 @@
1
+ class BaseComponent < ViewComponent::Base
2
+ def self.alert_wrapped(view_context)
3
+ AlertComponent.new(type: alert_type)
4
+ .with_content(new.render_in(view_context))
5
+ end
6
+
7
+ def self.alert_type
8
+ # :nocov:
9
+ raise 'implement in subclass'
10
+ # :nocov:
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ class FlashContainerComponent < ViewComponent::Base
2
+ erb_template <<~HTML
3
+ <div id="flash-container" class="d-flex justify-content-around sticky-top">
4
+ <div id="flash" class="flash position-relative w-100 d-flex justify-content-center">
5
+ <%= content || render(partial: 'pg_layout/flash') %>
6
+ </div>
7
+ </div>
8
+ HTML
9
+ end
@@ -0,0 +1,24 @@
1
+ class InternalErrorComponent < BaseComponent
2
+ def initialize(error_msg: nil)
3
+ @error_msg = error_msg
4
+ super
5
+ end
6
+
7
+ def self.alert_type
8
+ :critical
9
+ end
10
+
11
+ erb_template <<~ERB
12
+ <div>
13
+ <div class="mb-1">
14
+ <%= @error_msg || 'Ocurrió algo inesperado' %>
15
+ </div>
16
+ Por favor, intentá nuevamente
17
+ <br>
18
+ o <a class="text-decoration-underline" href="<%= new_public_mensaje_contacto_path %>">dejá un mensaje</a>
19
+ para que te avisemos
20
+ <br>
21
+ cuando el problema esté resuelto 🙏
22
+ </div>
23
+ ERB
24
+ end
@@ -23,6 +23,9 @@ module PgEngine
23
23
  protect_from_forgery with: :exception
24
24
 
25
25
  rescue_from StandardError, with: :internal_error
26
+ rescue_from ActionController::InvalidAuthenticityToken,
27
+ with: :invalid_authenticity_token
28
+
26
29
  rescue_from Pundit::NotAuthorizedError, with: :not_authorized
27
30
  rescue_from Redirect do |e|
28
31
  redirect_to e.url
@@ -31,19 +34,13 @@ module PgEngine
31
34
  def internal_error(error)
32
35
  pg_err error
33
36
 
34
- respond_to do |format|
35
- format.html do
36
- render 'pg_layout/error', layout: 'pg_layout/containerized', status: :internal_server_error
37
- end
38
- format.turbo_stream do
39
- flash.now[:critical] = self.class.render(partial: 'pg_layout/default_error_message')
40
- render turbo_stream: (turbo_stream.remove_all('.modal') + render_turbo_stream_flash_messages),
41
- status: :internal_server_error
42
- end
43
- format.any do
44
- head :internal_server_error
45
- end
46
- end
37
+ render_my_component(InternalErrorComponent, :internal_server_error)
38
+ end
39
+
40
+ def invalid_authenticity_token(err)
41
+ pg_warn err
42
+
43
+ render_my_component(BadRequestComponent, :bad_request)
47
44
  end
48
45
 
49
46
  before_action do
@@ -94,6 +91,28 @@ module PgEngine
94
91
 
95
92
  protected
96
93
 
94
+ def render_my_component(component, status) # rubocop:disable Metrics/AbcSize
95
+ respond_to do |format|
96
+ format.html do
97
+ render component.alert_wrapped(view_context),
98
+ layout: 'pg_layout/centered',
99
+ status:
100
+ end
101
+
102
+ format.turbo_stream do
103
+ flash.now[component.alert_type] = component.new.render_in(view_context)
104
+
105
+ render turbo_stream: (turbo_stream.remove_all('.modal') +
106
+ render_turbo_stream_flash_messages),
107
+ status:
108
+ end
109
+
110
+ format.any do
111
+ head status
112
+ end
113
+ end
114
+ end
115
+
97
116
  def not_authorized(_arg_required_for_active_admin)
98
117
  respond_to do |format|
99
118
  format.json do
@@ -9,20 +9,5 @@ module PgEngine
9
9
  turbo_stream.update_all 'title', title
10
10
  # rubocop:enable Rails/SkipsModelValidations
11
11
  end
12
-
13
- def flash_type_to_class(flash_type)
14
- case flash_type
15
- when 'notice'
16
- 'info'
17
- when 'critical', 'alert'
18
- 'danger'
19
- when 'warning'
20
- 'warning'
21
- when 'success'
22
- 'success'
23
- else
24
- flash_type
25
- end
26
- end
27
12
  end
28
13
  end
@@ -50,6 +50,7 @@ require 'redis'
50
50
  require 'kredis'
51
51
  require 'mailgun-ruby'
52
52
  require 'pg_search'
53
+ require 'view_component'
53
54
 
54
55
  if Rails.env.local?
55
56
  require 'letter_opener'
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.fdescribe AlertComponent, type: :component do
6
+ subject do
7
+ render_inline(alert).to_html
8
+ end
9
+
10
+ let(:type) { 'notice' }
11
+
12
+ let(:toast) { true }
13
+ let(:dismissible) { true }
14
+ let(:content) { 'pasaron cosas' }
15
+
16
+ let(:alert) do
17
+ described_class.new(type:, toast:, dismissible:).with_content(content)
18
+ end
19
+
20
+ %w[critical alert notice warning success].each do |flash_type|
21
+ context "cuando el type es #{flash_type}" do
22
+ let(:type) { flash_type }
23
+
24
+ it do
25
+ expect(subject).to have_text 'pasaron cosas'
26
+ end
27
+ end
28
+ end
29
+
30
+ context 'cuando el type no es válido' do
31
+ let(:type) { %w[info danger].sample }
32
+
33
+ it do
34
+ expect { subject }.to raise_error(PgEngine::Error)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,17 @@
1
+ require 'rails_helper'
2
+
3
+ describe InternalErrorComponent, type: :component do
4
+ subject do
5
+ render_inline(internal_error).to_html
6
+ end
7
+
8
+ let(:internal_error) do
9
+ described_class.new(error_msg:)
10
+ end
11
+
12
+ let(:error_msg) { 'internal error' }
13
+
14
+ it do
15
+ expect(subject).to have_text(error_msg)
16
+ end
17
+ end
@@ -0,0 +1,29 @@
1
+ = render FlashContainerComponent.new do
2
+ = render AlertComponent.new(type: :critical, toast: false) do
3
+ | Mal las cosas
4
+ = render AlertComponent.new(type: :success, toast: false) do
5
+ | Un simple flash success
6
+ = render AlertComponent.new(type: :alert, toast: true) \
7
+ .with_content(BadRequestComponent.new.render_in(self))
8
+ .row
9
+ .col Dismissible
10
+ .col No dismissible
11
+ .col
12
+ div Toasts
13
+ p cuando se agregan dinámicamente, tienen que estar dentro de #flash
14
+ - %i[alert warning notice success critical].each do |type|
15
+ .row
16
+ - [true, false].each do |dismissible|
17
+ .col
18
+ = render AlertComponent.new(type:, dismissible:) do
19
+ span = type
20
+ .col
21
+ = render AlertComponent.new(type:, toast: true) do
22
+ span Los toasts van a desaparecer
23
+ = render AlertComponent.new(type: :critical) \
24
+ .with_content(InternalErrorComponent.new.render_in(self))
25
+ br
26
+ = render AlertComponent.new(type: :alert) \
27
+ .with_content(BadRequestComponent.new.render_in(self))
28
+
29
+ div style="margin-top: 40em" cosas
@@ -0,0 +1,2 @@
1
+ = render AlertComponent.new(type: :notice, dismissible: true) do
2
+ | este dismisible se va a cerrar
@@ -0,0 +1,8 @@
1
+ class AlertComponentPreview < ViewComponent::Preview
2
+ # layout 'pg_layout/centered'
3
+ layout 'pg_layout/containerized'
4
+
5
+ def default; end
6
+
7
+ def dismisible; end
8
+ end
@@ -0,0 +1,2 @@
1
+ = render InternalErrorComponent.alert_wrapped(self)
2
+ div style="margin-top: 40em" cosas
@@ -0,0 +1,5 @@
1
+ class InternalErrorPreview < ViewComponent::Preview
2
+ layout 'pg_layout/centered'
3
+
4
+ def default; end
5
+ end
@@ -20,10 +20,9 @@ class DummyBaseController < PgEngine::BaseController
20
20
  end
21
21
  end
22
22
 
23
- # rubocop:disable RSpec/MultipleExpectations
24
23
  # rubocop:disable RSpec/FilePath
25
24
  # rubocop:disable RSpec/SpecFilePathFormat
26
- describe DummyBaseController do
25
+ fdescribe DummyBaseController do
27
26
  render_views
28
27
 
29
28
  describe 'PgEngine::BaseController::Redirect' do
@@ -0,0 +1,68 @@
1
+ require 'rails_helper'
2
+
3
+ fdescribe 'Base requests' do
4
+ describe 'invalid authenticity token' do
5
+ subject { get '/admin/cosas', headers: }
6
+
7
+ before do
8
+ sign_in create(:user, :developer)
9
+ allow_any_instance_of(Admin::CosasController).to \
10
+ receive(:index).and_raise(ActionController::InvalidAuthenticityToken)
11
+ end
12
+
13
+ shared_examples 'manda el status correcto' do
14
+ it do
15
+ subject
16
+ expect(response).to have_http_status(:bad_request)
17
+ end
18
+
19
+ it do
20
+ subject
21
+ expect(response).to have_http_status(:bad_request)
22
+ end
23
+ end
24
+
25
+ it do
26
+ expect { subject }.to have_warned
27
+ end
28
+
29
+ context 'cuando pide html' do
30
+ let(:headers) do
31
+ { 'ACCEPT' => 'text/html' }
32
+ end
33
+
34
+ include_examples 'manda el status correcto'
35
+
36
+ it 'no manda el flash' do
37
+ subject
38
+ expect(flash).to be_empty
39
+ end
40
+
41
+ it 'muestra el mensaje' do
42
+ subject
43
+ expect(response.body).to include 'Solicitud incorrecta'
44
+ end
45
+ end
46
+
47
+ context 'cuando pide turbo_stream' do
48
+ let(:headers) do
49
+ { 'ACCEPT' => 'text/vnd.turbo-stream.html' }
50
+ end
51
+
52
+ include_examples 'manda el status correcto'
53
+
54
+ it 'manda el flash' do
55
+ subject
56
+ expect(flash[:alert]).to include 'Solicitud incorrecta'
57
+ end
58
+ end
59
+
60
+ context 'cuando pide json' do
61
+ let(:headers) do
62
+ { 'ACCEPT' => 'application/json' }
63
+ end
64
+
65
+ include_examples 'manda el status correcto'
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,21 @@
1
+ require 'rails_helper'
2
+
3
+ fdescribe 'Alertas' do
4
+ before do
5
+ driven_by ENV['DRIVER']&.to_sym || :selenium_chrome_headless_iphone
6
+ end
7
+
8
+ it 'los toasts desaparecen' do
9
+ visit '/rails/view_components/alert_component/default'
10
+ expect(page).to have_text('Los toasts van a desaparecer').exactly(5)
11
+ # Desaparecieron
12
+ expect(page).to have_no_text('Los toasts van a desaparecer', wait: 10)
13
+ end
14
+
15
+ it 'los dismissibles se cierran' do
16
+ visit '/rails/view_components/alert_component/dismisible'
17
+ expect(page).to have_text('este dismisible se va a cerrar')
18
+ find('.btn-close').click
19
+ expect(page).to have_no_text('este dismisible se va a cerrar')
20
+ end
21
+ 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 # rubocop:disable RSpec/MultipleExpectations
46
+ it do
47
47
  subject
48
48
  expect(page).to have_current_path('/frontend/cosas')
49
49
  expect(page).to have_text('Coso borrado')
@@ -50,7 +50,7 @@ describe 'Al Registrarse' do
50
50
  visit '/users/edit'
51
51
  end
52
52
 
53
- it do # rubocop:disable RSpec/MultipleExpectations
53
+ it do
54
54
  expect { subject }.to change { user.reload.nombre }.to('despues')
55
55
  expect(page).to have_text('Tu cuenta se ha actualizado')
56
56
  end
@@ -1,6 +1,7 @@
1
1
  <h2><%= t(".sign_in") %></h2>
2
2
 
3
- <%= render partial: 'pg_layout/flash_container' %>
3
+ <%= render FlashContainerComponent.new %>
4
+
4
5
  <%= pg_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
5
6
  <div class="form-inputs">
6
7
  <%= f.input :email,
@@ -45,13 +45,15 @@ html
45
45
  }
46
46
 
47
47
  body
48
- = render partial: 'pg_layout/sidebar_mobile'
48
+ - sidebar_present = @navbar.present? && @sidebar != false
49
+ - if sidebar_present
50
+ = render partial: 'pg_layout/sidebar_mobile'
49
51
 
50
- div class="#{ @sidebar == false ? '' : 'with-sidebar' }"
51
- - unless @sidebar == false
52
+ div class="#{ 'with-sidebar' if sidebar_present }"
53
+ - if sidebar_present
52
54
  = render partial: 'pg_layout/sidebar'
53
55
  div
54
- = render partial: 'pg_layout/navbar'
56
+ = render partial: 'pg_layout/navbar' if @navbar.present?
55
57
  div
56
58
  - if user_signed_in? && breadcrumbs.any?
57
59
  .d-flex.align-items-center.justify-content-between.px-3.py-1.d-print-none[
@@ -63,8 +65,10 @@ html
63
65
  = yield(:actions)
64
66
  hr.my-0
65
67
  - content = content_for?(:content) ? yield(:content) : yield
66
- - unless content.include? 'flash-wrapper'
67
- = render partial: 'pg_layout/flash_container'
68
+ - unless content.include? 'flash-container'
69
+ = render FlashContainerComponent.new
70
+ / TODO: si hay varios flashes toast, se superponen. habría que
71
+ hacer un container con position absolute para los toasts
68
72
  = content
69
73
  div style="width:100%; height: 10em"
70
74
  = render_turbo_stream_title
@@ -0,0 +1,6 @@
1
+ - content_for :content do
2
+ .container-fluid.pt-3
3
+ .text-center
4
+ = content_for?(:centered_content) ? yield(:centered_content) : yield
5
+
6
+ = render template: 'layouts/pg_layout/base'
@@ -1,5 +1,8 @@
1
1
  / slim-lint:disable LineLength
2
2
  - flash_to_show = flash.select { |fm| fm[0].to_sym.in?(ApplicationController._flash_types) && fm[1].present? }
3
3
  / slim-lint:enable LineLength
4
+
5
+ - toast = flash[:toast]
4
6
  - flash_to_show.each do |flash_type, message|
5
- = render partial: 'pg_layout/flash_inner', locals: { flash_type:, message:, toast: flash[:toast] }
7
+ = render AlertComponent.new(type: flash_type, toast:, dismissible: true) do
8
+ = message
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PgRails
4
- VERSION = '7.0.8-alpha.88'
4
+ VERSION = '7.0.8-alpha.89'
5
5
  end
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.0.8.pre.alpha.88
4
+ version: 7.0.8.pre.alpha.89
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-06-01 00:00:00.000000000 Z
11
+ date: 2024-06-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -528,6 +528,20 @@ dependencies:
528
528
  - - "~>"
529
529
  - !ruby/object:Gem::Version
530
530
  version: 2.3.6
531
+ - !ruby/object:Gem::Dependency
532
+ name: view_component
533
+ requirement: !ruby/object:Gem::Requirement
534
+ requirements:
535
+ - - "~>"
536
+ - !ruby/object:Gem::Version
537
+ version: 3.12.1
538
+ type: :runtime
539
+ prerelease: false
540
+ version_requirements: !ruby/object:Gem::Requirement
541
+ requirements:
542
+ - - "~>"
543
+ - !ruby/object:Gem::Version
544
+ version: 3.12.1
531
545
  - !ruby/object:Gem::Dependency
532
546
  name: vcr
533
547
  requirement: !ruby/object:Gem::Requirement
@@ -955,6 +969,12 @@ files:
955
969
  - pg_engine/app/assets/javascripts/active_admin.js
956
970
  - pg_engine/app/assets/stylesheets/active_admin.scss
957
971
  - pg_engine/app/assets/stylesheets/pg_rails_b5.scss
972
+ - pg_engine/app/components/alert_component.html.slim
973
+ - pg_engine/app/components/alert_component.rb
974
+ - pg_engine/app/components/bad_request_component.rb
975
+ - pg_engine/app/components/base_component.rb
976
+ - pg_engine/app/components/flash_container_component.rb
977
+ - pg_engine/app/components/internal_error_component.rb
958
978
  - pg_engine/app/controllers/admin/accounts_controller.rb
959
979
  - pg_engine/app/controllers/admin/email_logs_controller.rb
960
980
  - pg_engine/app/controllers/admin/emails_controller.rb
@@ -1073,6 +1093,13 @@ files:
1073
1093
  - pg_engine/lib/pg_engine/utils/pdf_preview_generator.rb
1074
1094
  - pg_engine/lib/pg_engine/utils/pg_logger.rb
1075
1095
  - pg_engine/lib/tasks/auto_anotar_modelos.rake
1096
+ - pg_engine/spec/components/alert_component_spec.rb
1097
+ - pg_engine/spec/components/internal_error_component_spec.rb
1098
+ - pg_engine/spec/components/previews/alert_component_preview.rb
1099
+ - pg_engine/spec/components/previews/alert_component_preview/default.html.slim
1100
+ - pg_engine/spec/components/previews/alert_component_preview/dismisible.html.slim
1101
+ - pg_engine/spec/components/previews/internal_error_preview.rb
1102
+ - pg_engine/spec/components/previews/internal_error_preview/default.html.slim
1076
1103
  - pg_engine/spec/controllers/admin/accounts_controller_spec.rb
1077
1104
  - pg_engine/spec/controllers/admin/email_logs_controller_spec.rb
1078
1105
  - pg_engine/spec/controllers/admin/emails_controller_spec.rb
@@ -1108,6 +1135,8 @@ files:
1108
1135
  - pg_engine/spec/models/user_account_spec.rb
1109
1136
  - pg_engine/spec/models/user_spec.rb
1110
1137
  - pg_engine/spec/pg_engine/pdf_preview_generator_spec.rb
1138
+ - pg_engine/spec/requests/base_controller_requests_spec.rb
1139
+ - pg_engine/spec/system/alerts_spec.rb
1111
1140
  - pg_engine/spec/system/destroy_spec.rb
1112
1141
  - pg_engine/spec/system/login_spec.rb
1113
1142
  - pg_engine/spec/system/send_mail_spec.rb
@@ -1157,20 +1186,16 @@ files:
1157
1186
  - pg_layout/app/views/kaminari/_paginator.html.slim
1158
1187
  - pg_layout/app/views/kaminari/_prev_page.html.slim
1159
1188
  - pg_layout/app/views/layouts/pg_layout/base.html.slim
1189
+ - pg_layout/app/views/layouts/pg_layout/centered.html.slim
1160
1190
  - pg_layout/app/views/layouts/pg_layout/container_logo.html.slim
1161
1191
  - pg_layout/app/views/layouts/pg_layout/containerized.html.slim
1162
1192
  - pg_layout/app/views/layouts/pg_layout/devise.html.slim
1163
1193
  - pg_layout/app/views/layouts/pg_layout/mailer.html.slim
1164
1194
  - pg_layout/app/views/layouts/pg_layout/mailer.text.slim
1165
- - pg_layout/app/views/pg_layout/_default_error_message.html.erb
1166
- - pg_layout/app/views/pg_layout/_error.html.erb
1167
1195
  - pg_layout/app/views/pg_layout/_flash.html.slim
1168
- - pg_layout/app/views/pg_layout/_flash_container.html.slim
1169
- - pg_layout/app/views/pg_layout/_flash_inner.html.slim
1170
1196
  - pg_layout/app/views/pg_layout/_navbar.html.erb
1171
1197
  - pg_layout/app/views/pg_layout/_sidebar.html.erb
1172
1198
  - pg_layout/app/views/pg_layout/_sidebar_mobile.html.erb
1173
- - pg_layout/app/views/pg_layout/error.html.erb
1174
1199
  - pg_layout/lib/pg_layout.rb
1175
1200
  - pg_layout/lib/pg_layout/engine.rb
1176
1201
  - pg_layout/spec/lib/navbar_spec.rb
@@ -1,13 +0,0 @@
1
- <%# locals: (error_msg: nil) %>
2
-
3
- <div>
4
- <div class="mb-1">
5
- <%= error_msg || 'Ocurrió algo inesperado' %>
6
- </div>
7
- Por favor, intentá nuevamente
8
- <br>
9
- o <a class="text-decoration-underline" href="<%= new_public_mensaje_contacto_path %>">dejá un mensaje</a>
10
- para que te avisemos
11
- <br>
12
- cuando el problema esté resuelto 🙏
13
- </div>
@@ -1,13 +0,0 @@
1
- <%# locals: (error_msg: nil) %>
2
-
3
- <div class="d-flex justify-content-around mt-2">
4
- <div class="alert alert-danger d-flex align-items-center">
5
- <div>
6
- <span class="bi bi-emoji-dizzy fs-1 me-3"></span>
7
- <%# <span class="bi bi-exclamation-triangle fs-1 me-3"></span> %>
8
- </div>
9
- <div>
10
- <%= render partial: 'pg_layout/default_error_message', locals: { error_msg: } %>
11
- </div>
12
- </div>
13
- </div>
@@ -1,5 +0,0 @@
1
- #flash-wrapper.d-flex.justify-content-around.sticky-top
2
- #flash.flash.position-relative.w-100.d-flex.justify-content-center
3
- = render partial: 'pg_layout/flash'
4
- / TODO: si hay varios flashes toast, se superponen. habría que hacer un container
5
- con position absolute para los toasts
@@ -1,24 +0,0 @@
1
- / # locals: (flash_type:, message:, toast: false)
2
-
3
- .alert.alert-dismissible[
4
- class="
5
- mt-2 d-flex align-items-center
6
- alert-#{flash_type_to_class(flash_type)}
7
- #{'position-absolute pg-toast' if toast}"
8
- data-bs-autohide="true"
9
- aria-live="assertive" aria-atomic="true" role="alert"
10
- ]
11
- - case flash_type
12
- - when 'critical'
13
- / .bi.bi-emoji-dizzy.me-3.fs-2
14
- .bi.bi-exclamation-triangle-fill.me-3.fs-2
15
- - when 'alert'
16
- .bi.bi-exclamation-triangle-fill.me-2
17
- - when 'warning'
18
- .bi.bi-exclamation-circle.me-2
19
- - when 'success'
20
- .bi.bi-check-lg.me-2
21
- - when 'notice'
22
- .bi.bi-info-circle.me-2
23
- = message
24
- button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"
@@ -1,2 +0,0 @@
1
- <%# Para usar como respuesta con layout en controllers %>
2
- <%= render partial: 'pg_layout/error', locals: { error_msg: @error_msg } %>