pg_rails 7.2.3 → 7.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/pg_associable/app/helpers/pg_associable/form_builder_methods.rb +9 -2
- data/pg_associable/app/helpers/pg_associable/helpers.rb +4 -5
- data/pg_associable/app/javascript/modal_controller.js +80 -6
- data/pg_associable/spec/system/associable_spec.rb +30 -7
- data/pg_engine/app/assets/stylesheets/pg_rails_b5.scss +5 -0
- data/pg_engine/app/components/actions_component.rb +14 -0
- data/pg_engine/app/components/asociable_modal_component.html.slim +6 -0
- data/pg_engine/app/components/asociable_modal_component.rb +7 -0
- data/pg_engine/app/components/date_selector_component.rb +2 -2
- data/pg_engine/app/components/modal_component.html.slim +5 -0
- data/pg_engine/app/components/modal_component.rb +11 -0
- data/pg_engine/app/components/modal_content_component.rb +29 -0
- data/pg_engine/app/components/search_bar_component.html.slim +1 -1
- data/pg_engine/app/controllers/admin/accounts_controller.rb +1 -1
- data/pg_engine/app/controllers/admin/email_logs_controller.rb +1 -1
- data/pg_engine/app/controllers/admin/emails_controller.rb +4 -21
- data/pg_engine/app/controllers/admin/user_accounts_controller.rb +1 -1
- data/pg_engine/app/controllers/admin/users_controller.rb +1 -1
- data/pg_engine/app/controllers/concerns/pg_engine/resource.rb +288 -133
- data/pg_engine/app/controllers/pg_engine/base_controller.rb +5 -0
- data/pg_engine/app/controllers/public/mensaje_contactos_controller.rb +1 -1
- data/pg_engine/app/decorators/pg_engine/base_record_decorator.rb +36 -10
- data/pg_engine/app/helpers/pg_engine/flash_helper.rb +6 -2
- data/pg_engine/app/helpers/pg_engine/form_helper.rb +15 -2
- data/pg_engine/app/helpers/pg_engine/frame_helper.rb +52 -0
- data/pg_engine/app/lib/pg_engine/bootstrap5_breadcrumbs_builder.rb +22 -0
- data/pg_engine/app/lib/pg_engine/filtros_builder.rb +3 -2
- data/pg_engine/app/models/current.rb +1 -1
- data/pg_engine/app/models/email.rb +2 -0
- data/pg_engine/app/models/pg_engine/base_record.rb +13 -0
- data/pg_engine/app/views/admin/accounts/_form.html.slim +1 -4
- data/pg_engine/app/views/admin/email_logs/_form.html.slim +2 -5
- data/pg_engine/app/views/admin/emails/_form.html.slim +13 -13
- data/pg_engine/app/views/admin/emails/_send.html.slim +0 -1
- data/pg_engine/app/views/admin/emails/show.html.slim +19 -20
- data/pg_engine/app/views/admin/eventos/new.html.slim +0 -2
- data/pg_engine/app/views/admin/user_accounts/_form.html.slim +1 -4
- data/pg_engine/app/views/admin/users/_form.html.slim +1 -4
- data/pg_engine/app/views/pg_engine/base/edit.html.slim +1 -2
- data/pg_engine/app/views/pg_engine/base/index.html.slim +6 -3
- data/pg_engine/app/views/pg_engine/base/new.html.slim +1 -2
- data/pg_engine/app/views/public/mensaje_contactos/new.html.slim +2 -5
- data/pg_engine/config/initializers/kaminari.rb +3 -0
- data/pg_engine/config/initializers/ransack_memory.rb +13 -2
- data/pg_engine/config/locales/es.yml +1 -1
- data/pg_engine/lib/pg_engine/utils/pg_logger.rb +10 -10
- data/pg_engine/spec/controllers/admin/accounts_controller_spec.rb +2 -2
- data/pg_engine/spec/controllers/admin/email_logs_controller_spec.rb +2 -2
- data/pg_engine/spec/controllers/admin/emails_controller_spec.rb +2 -2
- data/pg_engine/spec/controllers/admin/user_accounts_controller_spec.rb +2 -2
- data/pg_engine/spec/controllers/admin/users_controller_spec.rb +2 -2
- data/pg_engine/spec/controllers/concerns/pg_engine/resource_helper_spec.rb +0 -2
- data/pg_engine/spec/lib/pg_engine/form_helper_spec.rb +51 -0
- data/pg_engine/spec/system/breadcrumbs_spec.rb +61 -0
- data/pg_engine/spec/system/destroy_spec.rb +1 -1
- data/pg_engine/spec/system/login_spec.rb +1 -1
- data/pg_engine/spec/system/modal_windows_spec.rb +89 -0
- data/pg_engine/spec/system/send_mail_spec.rb +1 -1
- data/pg_layout/app/javascript/application.js +38 -0
- data/pg_layout/app/javascript/config/turbo_rails/index.js +4 -1
- data/pg_layout/app/javascript/controllers/embedded_frame_controller.js +10 -0
- data/pg_layout/app/javascript/controllers/index.js +2 -0
- data/pg_layout/app/javascript/controllers/popover_toggler_controller.js +3 -2
- data/pg_layout/app/javascript/controllers/tooltip_controller.js +8 -0
- data/pg_layout/app/javascript/elements/index.js +1 -0
- data/pg_layout/app/javascript/elements/pg_event.js +13 -0
- data/pg_layout/app/views/devise/confirmations/new.html.erb +0 -1
- data/pg_layout/app/views/devise/passwords/edit.html.erb +0 -2
- data/pg_layout/app/views/devise/passwords/new.html.erb +0 -2
- data/pg_layout/app/views/devise/registrations/edit.html.erb +0 -2
- data/pg_layout/app/views/devise/registrations/new.html.erb +0 -2
- data/pg_layout/app/views/devise/unlocks/new.html.erb +0 -1
- data/pg_layout/app/views/layouts/pg_layout/base.html.slim +45 -17
- data/pg_layout/app/views/layouts/pg_layout/containerized.html.slim +1 -1
- data/pg_rails/lib/version.rb +1 -1
- data/pg_rails/scss/bootstrap_overrides.scss +2 -1
- data/pg_rails/scss/pg_rails.scss +8 -1
- data/pg_scaffold/lib/generators/pg_rspec/scaffold/templates/controller_spec.rb +2 -2
- data/pg_scaffold/lib/generators/pg_scaffold/templates/controller.rb +2 -4
- data/pg_scaffold/lib/generators/pg_slim/templates/_form.html.slim +2 -5
- data/pg_scaffold/lib/generators/pg_slim/templates/show.html.slim +1 -1
- metadata +17 -4
- data/pg_associable/app/views/pg_engine/base/_pg_associable_modal.html.slim +0 -14
- data/pg_layout/app/views/pg_layout/_modal_show.html.slim +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad67165e1aad7f3b3e31dd236706d4b923eb2139740a095018257899b43928a7
|
4
|
+
data.tar.gz: f3d907a47d97cb7abbfb0e148bb2c2e9466a5255284f14f06c0363966e35e46b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d8482db6b3b8455c819d4db06db374e40785cec70a9737bfca652c2368bddad17ca7a2d3656e1632b48b0ebeb03c5142e83855d3d70cfd9d043de3e7d34609d
|
7
|
+
data.tar.gz: e6e2457ac2a84097209da469aa76dd2538e72c9da05ed383884c19fceddc071b5dc515a82c444c4f3487d7912ca79790bd6eb06f0eed0ae0c4caf48e8797884f
|
@@ -16,6 +16,14 @@ module PgAssociable
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def pg_associable(atributo, options = {})
|
19
|
+
# Si es new y tiene el nested asignado, no permito que se modifique
|
20
|
+
# porque de todos modos se pisaría en el create
|
21
|
+
if !object.persisted? &&
|
22
|
+
template.nested_record.present? &&
|
23
|
+
object.send(template.nested_key) == (template.nested_record.id)
|
24
|
+
options[:disabled] = true
|
25
|
+
end
|
26
|
+
|
19
27
|
return input(atributo, options) if options[:disabled]
|
20
28
|
|
21
29
|
collection, puede_crear = collection_pc(atributo, options)
|
@@ -31,8 +39,7 @@ module PgAssociable
|
|
31
39
|
def collection_pc(atributo, _options)
|
32
40
|
klass = clase_asociacion(atributo)
|
33
41
|
user = Current.user
|
34
|
-
|
35
|
-
puede_crear = !in_modal && Pundit::PolicyFinder.new(klass).policy.new(user, klass).new?
|
42
|
+
puede_crear = !template.using_modal? && Pundit::PolicyFinder.new(klass).policy.new(user, klass).new?
|
36
43
|
collection = Pundit::PolicyFinder.new(klass).scope.new(user, klass).resolve
|
37
44
|
[collection, puede_crear]
|
38
45
|
end
|
@@ -3,11 +3,10 @@ module PgAssociable
|
|
3
3
|
MAX_RESULTS = 8
|
4
4
|
|
5
5
|
def pg_respond_abrir_modal
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
end
|
6
|
+
src = @clase_modelo.new.decorate.new_object_url
|
7
|
+
content = ModalContentComponent.new(src:).render_in(view_context)
|
8
|
+
modal = AsociableModalComponent.new(modal_id: params[:id]).with_content(content)
|
9
|
+
render turbo_stream: turbo_stream.append_all('body', modal)
|
11
10
|
end
|
12
11
|
|
13
12
|
def pg_respond_buscar
|
@@ -3,9 +3,9 @@ import * as bootstrap from 'bootstrap'
|
|
3
3
|
|
4
4
|
export default class extends Controller {
|
5
5
|
static outlets = ['asociable']
|
6
|
-
static targets = ['response']
|
7
6
|
|
8
7
|
modalPuntero = null
|
8
|
+
history = []
|
9
9
|
|
10
10
|
connect (e) {
|
11
11
|
this.modalPuntero = new bootstrap.Modal(this.element)
|
@@ -15,23 +15,97 @@ export default class extends Controller {
|
|
15
15
|
})
|
16
16
|
}
|
17
17
|
this.modalPuntero.show()
|
18
|
+
|
19
|
+
this.element.addEventListener('turbo:frame-render', (ev) => {
|
20
|
+
if (ev.detail.fetchResponse.response.ok && ev.target.id === 'modal_content') {
|
21
|
+
this.history.push(ev.target.src)
|
22
|
+
}
|
23
|
+
})
|
24
|
+
|
25
|
+
this.element.addEventListener('pg:record-created', (ev) => {
|
26
|
+
const el = ev.data
|
27
|
+
if (this.asociableOutlets.length > 0) {
|
28
|
+
const newObject = JSON.parse(el.dataset.response)
|
29
|
+
this.asociableOutlet.completarCampo(newObject)
|
30
|
+
ev.stopPropagation()
|
31
|
+
this.remove()
|
32
|
+
} else {
|
33
|
+
this.back(ev)
|
34
|
+
}
|
35
|
+
})
|
36
|
+
|
37
|
+
this.element.addEventListener('pg:record-updated', (ev) => {
|
38
|
+
this.back(ev)
|
39
|
+
})
|
40
|
+
|
41
|
+
this.element.addEventListener('pg:record-destroyed', (ev) => {
|
42
|
+
this.remove()
|
43
|
+
})
|
44
|
+
|
18
45
|
document.addEventListener('turbo:before-cache', () => {
|
19
46
|
this.element.remove()
|
20
47
|
}, { once: true })
|
21
48
|
}
|
22
49
|
|
23
|
-
|
24
|
-
const
|
25
|
-
|
26
|
-
|
50
|
+
maximize (ev) {
|
51
|
+
const dialog = this.element.querySelector('.modal-dialog')
|
52
|
+
dialog.classList.toggle('modal-fullscreen')
|
53
|
+
const button = ev.currentTarget
|
54
|
+
const icon = button.querySelector('i')
|
55
|
+
icon.classList.toggle('bi-fullscreen')
|
56
|
+
icon.classList.toggle('bi-fullscreen-exit')
|
57
|
+
|
58
|
+
const tooltip = this.application.getControllerForElementAndIdentifier(button, 'tooltip')
|
59
|
+
if (tooltip) {
|
60
|
+
tooltip.hide()
|
61
|
+
if (icon.classList.contains('bi-fullscreen')) {
|
62
|
+
tooltip.setContent('Maximizar')
|
63
|
+
} else {
|
64
|
+
tooltip.setContent('Restaurar')
|
65
|
+
}
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
reloadTop () {
|
70
|
+
// FIXME: rename to main?
|
71
|
+
const topFrame = document.querySelector('#top')
|
72
|
+
if (topFrame.attributes.src) {
|
73
|
+
topFrame.reload()
|
74
|
+
} else {
|
75
|
+
topFrame.setAttribute('src', window.location)
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
79
|
+
back (ev) {
|
80
|
+
this.history.pop()
|
81
|
+
if (this.history.length > 0) {
|
82
|
+
const url = this.history[this.history.length - 1]
|
83
|
+
const frame = this.element.querySelector('#modal_content')
|
84
|
+
frame.src = url
|
85
|
+
frame.innerHTML = '<div style="min-height: 30em">Cargando...</div>'
|
86
|
+
} else {
|
87
|
+
this.modalPuntero.hide()
|
88
|
+
}
|
89
|
+
ev.stopPropagation()
|
90
|
+
this.reloadTop()
|
27
91
|
}
|
28
92
|
|
29
93
|
openModal () {
|
30
94
|
this.modalPuntero.show()
|
31
95
|
}
|
32
96
|
|
97
|
+
remove () {
|
98
|
+
this.element.remove()
|
99
|
+
}
|
100
|
+
|
33
101
|
disconnect (e) {
|
34
|
-
|
102
|
+
// Antes, en lugar de quitar el modal-backdrop:
|
103
|
+
// this.modalPuntero.hide()
|
104
|
+
// pero tiraba a veces error:
|
105
|
+
// TypeError: can't convert null to object, _isWithActiveTrigger
|
106
|
+
document.querySelectorAll('.modal-backdrop').forEach((el) => {
|
107
|
+
el.remove()
|
108
|
+
})
|
35
109
|
document.dispatchEvent(new Event('hidden.bs.modal'))
|
36
110
|
this.modalPuntero.dispose()
|
37
111
|
}
|
@@ -3,22 +3,45 @@ require 'rails_helper'
|
|
3
3
|
describe 'Associable' do
|
4
4
|
let(:user) { create :user, :developer }
|
5
5
|
|
6
|
+
let(:path) { '/admin/cosas/new' }
|
7
|
+
|
6
8
|
before do
|
7
9
|
login_as user
|
8
|
-
|
9
|
-
visit '/admin/cosas/new'
|
10
|
-
fill_in 'cosa_nombre', with: 'La cosa'
|
11
|
-
select 'Los', from: 'cosa_tipo'
|
12
|
-
find('.cosa_categoria_de_cosa input[type=text]').click
|
10
|
+
visit path
|
13
11
|
end
|
14
12
|
|
15
13
|
it do
|
14
|
+
fill_in 'cosa_nombre', with: 'La cosa'
|
15
|
+
select 'Los', from: 'cosa_tipo'
|
16
|
+
find('.cosa_categoria_de_cosa input[type=text]').click
|
16
17
|
expect(page).to have_text :all, 'Nuevo'
|
17
18
|
find('.cosa_categoria_de_cosa .list-group-item').click
|
18
19
|
fill_in 'categoria_de_cosa_nombre', with: 'la categoría'
|
19
20
|
select 'Completar', from: 'categoria_de_cosa_tipo'
|
20
|
-
click_on '
|
21
|
-
click_on '
|
21
|
+
click_on 'Agregar Categoría de cosa'
|
22
|
+
click_on 'Cargar Coso'
|
22
23
|
expect(page).to have_text 'Creado por'
|
23
24
|
end
|
25
|
+
|
26
|
+
context 'cuando crea desde el nested' do
|
27
|
+
let!(:categ) { create :categoria_de_cosa }
|
28
|
+
let(:path) { "/admin/categoria_de_cosas/#{categ.hashid}/cosas/new" }
|
29
|
+
|
30
|
+
it do
|
31
|
+
input = find_by_id('cosa_categoria_de_cosa')
|
32
|
+
expect(input).to be_disabled
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'cuando edita desde el nested' do
|
37
|
+
let!(:categ) { create :categoria_de_cosa }
|
38
|
+
let!(:cosa) { create :cosa, categoria_de_cosa: categ }
|
39
|
+
let(:path) { "/admin/categoria_de_cosas/#{categ.hashid}/cosas/#{cosa.id}/edit" }
|
40
|
+
|
41
|
+
it do
|
42
|
+
ele = find_by_id('cosa_categoria_de_cosa_id', visible: :all)
|
43
|
+
input = ele.sibling('input[type=text]')
|
44
|
+
expect(input).not_to be_disabled
|
45
|
+
end
|
46
|
+
end
|
24
47
|
end
|
@@ -3,9 +3,9 @@ class DateSelectorComponent < ViewComponent::Base
|
|
3
3
|
@field_id = field_id
|
4
4
|
|
5
5
|
@types = [
|
6
|
-
['Días corridos (L a D)', 'calendar_days'],
|
7
|
-
['Días hábiles (L a V)', 'business_days'],
|
8
6
|
['Días hábiles no feriados', 'business_days_excluding_holidays'],
|
7
|
+
['Días hábiles (L a V)', 'business_days'],
|
8
|
+
['Días corridos (L a D)', 'calendar_days'],
|
9
9
|
['Semanas', 'weeks'],
|
10
10
|
['Meses', 'months']
|
11
11
|
]
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class ModalContentComponent < ViewComponent::Base
|
2
|
+
def initialize(src: nil)
|
3
|
+
@src = src
|
4
|
+
with_content(loading_html) if @src.present?
|
5
|
+
|
6
|
+
super
|
7
|
+
end
|
8
|
+
|
9
|
+
def loading_html
|
10
|
+
<<~HTML.html_safe
|
11
|
+
<div class="text-center text-body-secondary fs-3" style="min-height: 15em">
|
12
|
+
Cargando...
|
13
|
+
</div>
|
14
|
+
HTML
|
15
|
+
end
|
16
|
+
|
17
|
+
erb_template <<~ERB
|
18
|
+
<div class="modal-body">
|
19
|
+
<div class="d-flex justify-content-around sticky-top">
|
20
|
+
<div class="flash position-relative w-100 d-flex justify-content-center">
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
<%= helpers.turbo_frame_tag :modal_content,
|
24
|
+
**{ src: @src, refresh: :morph }.compact do %>
|
25
|
+
<%= content %>
|
26
|
+
<% end %>
|
27
|
+
</div>
|
28
|
+
ERB
|
29
|
+
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
.d-flex.align-items-center.px-3.py-2
|
4
4
|
.px-2.d-none.d-sm-inline-block
|
5
5
|
span.bi.bi-funnel-fill
|
6
|
-
= helpers.search_form_for @q, url: url_for
|
6
|
+
= helpers.search_form_for @q, url: url_for do |f|
|
7
7
|
.row.g-1
|
8
8
|
.col
|
9
9
|
.row.g-1
|
@@ -6,7 +6,7 @@ module Admin
|
|
6
6
|
class EmailsController < AdminController
|
7
7
|
include PgEngine::Resource
|
8
8
|
|
9
|
-
|
9
|
+
self.clase_modelo = Email
|
10
10
|
|
11
11
|
before_action(only: :index) { authorize Email }
|
12
12
|
|
@@ -14,26 +14,9 @@ module Admin
|
|
14
14
|
|
15
15
|
add_breadcrumb Email.nombre_plural, :admin_emails_path
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
def create
|
23
|
-
saved = false
|
24
|
-
ActiveRecord::Base.transaction do
|
25
|
-
# TODO: acá la transaction jode porque el ActiveJob no puede deserializar el Email
|
26
|
-
# Con rails 7.2 esto se debería arreglar
|
27
|
-
if (saved = @email.save)
|
28
|
-
PgEngine::AdminMailer.with(email_object: @email).admin_mail.deliver_later
|
29
|
-
end
|
30
|
-
end
|
31
|
-
if saved
|
32
|
-
redirect_to @email.decorate.target_object
|
33
|
-
else
|
34
|
-
render template: 'admin/emails/_send',
|
35
|
-
layout: 'pg_layout/containerized', status: :unprocessable_entity,
|
36
|
-
locals: { email: @email }
|
17
|
+
after_action only: :create do
|
18
|
+
if @saved
|
19
|
+
PgEngine::AdminMailer.with(email_object: @email).admin_mail.deliver_later
|
37
20
|
end
|
38
21
|
end
|
39
22
|
|