pg_rails 7.2.2 → 7.3.0
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 +1 -2
- data/pg_associable/app/helpers/pg_associable/helpers.rb +4 -5
- data/pg_associable/app/javascript/modal_controller.js +19 -7
- data/pg_associable/spec/system/associable_spec.rb +2 -2
- 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/form_modal_component.html.slim +15 -0
- data/pg_engine/app/components/form_modal_component.rb +6 -0
- 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 +28 -0
- data/pg_engine/app/components/show_modal_component.html.slim +10 -0
- data/pg_engine/app/components/show_modal_component.rb +7 -0
- data/pg_engine/app/controllers/admin/emails_controller.rb +3 -20
- data/pg_engine/app/controllers/concerns/pg_engine/resource.rb +134 -102
- data/pg_engine/app/decorators/pg_engine/base_record_decorator.rb +29 -8
- data/pg_engine/app/helpers/pg_engine/flash_helper.rb +6 -2
- data/pg_engine/app/helpers/pg_engine/form_helper.rb +20 -2
- data/pg_engine/app/models/email.rb +2 -0
- data/pg_engine/app/models/pg_engine/base_record.rb +11 -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/index.html.slim +4 -0
- 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/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/lib/pg_engine/form_helper_spec.rb +53 -0
- 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 +24 -0
- data/pg_layout/app/javascript/controllers/date_selector_controller.js +5 -4
- data/pg_layout/app/javascript/controllers/popover_toggler_controller.js +3 -2
- data/pg_layout/app/javascript/elements/index.js +1 -0
- data/pg_layout/app/javascript/elements/pg_event.js +12 -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_rails/lib/version.rb +1 -1
- data/pg_scaffold/lib/generators/pg_rspec/scaffold/templates/controller_spec.rb +2 -2
- 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: 987f2b59fff584bde7004887e631c776fd0da367988e6ca6117726ff6b6de937
|
4
|
+
data.tar.gz: 41676e4fbcadad6e6a7a2b999368137c4d200fe83da5d7a1a300ed8d0a24a99f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2cda455c10578a6c9b990e0f7c00317166c80d499ff82267a925912935f510b79195d1ad13caf9669af1f314da0dfeb23a7aa9782f3df56996b4a128af3b5535
|
7
|
+
data.tar.gz: f394f37f00f3f7dad3abcdfaab5697e1cf2079733a9e385df66101f8e5d1fe55e61f48d385ba9e6d855c9990b509c4a98a63c4efc1e1d9cb2c8535702c1c34cd
|
@@ -31,8 +31,7 @@ module PgAssociable
|
|
31
31
|
def collection_pc(atributo, _options)
|
32
32
|
klass = clase_asociacion(atributo)
|
33
33
|
user = Current.user
|
34
|
-
|
35
|
-
puede_crear = !in_modal && Pundit::PolicyFinder.new(klass).policy.new(user, klass).new?
|
34
|
+
puede_crear = !template.using_modal? && Pundit::PolicyFinder.new(klass).policy.new(user, klass).new?
|
36
35
|
collection = Pundit::PolicyFinder.new(klass).scope.new(user, klass).resolve
|
37
36
|
[collection, puede_crear]
|
38
37
|
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
|
+
content = FormModalComponent.new(@clase_modelo.new.decorate)
|
7
|
+
.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,7 +3,6 @@ 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
|
9
8
|
|
@@ -15,17 +14,30 @@ export default class extends Controller {
|
|
15
14
|
})
|
16
15
|
}
|
17
16
|
this.modalPuntero.show()
|
17
|
+
|
18
|
+
this.element.addEventListener('pg:record-created', (ev) => {
|
19
|
+
const el = ev.data
|
20
|
+
if (this.asociableOutlets.length > 0) {
|
21
|
+
const newObject = JSON.parse(el.dataset.response)
|
22
|
+
this.asociableOutlet.completarCampo(newObject)
|
23
|
+
ev.stopPropagation()
|
24
|
+
}
|
25
|
+
this.modalPuntero.hide()
|
26
|
+
})
|
27
|
+
|
28
|
+
this.element.addEventListener('pg:record-updated', (ev) => {
|
29
|
+
this.modalPuntero.hide()
|
30
|
+
})
|
31
|
+
|
32
|
+
this.element.addEventListener('pg:record-destroyed', (ev) => {
|
33
|
+
this.modalPuntero.hide()
|
34
|
+
})
|
35
|
+
|
18
36
|
document.addEventListener('turbo:before-cache', () => {
|
19
37
|
this.element.remove()
|
20
38
|
}, { once: true })
|
21
39
|
}
|
22
40
|
|
23
|
-
responseTargetConnected (e) {
|
24
|
-
const newObject = JSON.parse(e.dataset.response)
|
25
|
-
this.asociableOutlet.completarCampo(newObject)
|
26
|
-
this.element.remove()
|
27
|
-
}
|
28
|
-
|
29
41
|
openModal () {
|
30
42
|
this.modalPuntero.show()
|
31
43
|
}
|
@@ -17,8 +17,8 @@ describe 'Associable' do
|
|
17
17
|
find('.cosa_categoria_de_cosa .list-group-item').click
|
18
18
|
fill_in 'categoria_de_cosa_nombre', with: 'la categoría'
|
19
19
|
select 'Completar', from: 'categoria_de_cosa_tipo'
|
20
|
-
click_on '
|
21
|
-
click_on '
|
20
|
+
click_on 'Agregar Categoría de cosa'
|
21
|
+
click_on 'Cargar Coso'
|
22
22
|
expect(page).to have_text 'Creado por'
|
23
23
|
end
|
24
24
|
end
|
@@ -0,0 +1,15 @@
|
|
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 }
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class ModalContentComponent < ViewComponent::Base
|
2
|
+
renders_one :actions
|
3
|
+
renders_one :body
|
4
|
+
renders_one :header
|
5
|
+
|
6
|
+
def before_render
|
7
|
+
controller.instance_variable_set(:@using_modal, true)
|
8
|
+
end
|
9
|
+
|
10
|
+
erb_template <<~ERB
|
11
|
+
<%= helpers.turbo_frame_tag :modal_generic do %>
|
12
|
+
<div class="modal-header">
|
13
|
+
<%= header %>
|
14
|
+
<a class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close"></a>
|
15
|
+
</div>
|
16
|
+
<div class="modal-body">
|
17
|
+
<div class="d-flex justify-content-around sticky-top">
|
18
|
+
<div class="flash position-relative w-100 d-flex justify-content-center">
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
<div class="float-end">
|
22
|
+
<%= actions %>
|
23
|
+
</div>
|
24
|
+
<%= body %>
|
25
|
+
</div>
|
26
|
+
<% end %>
|
27
|
+
ERB
|
28
|
+
end
|
@@ -0,0 +1,10 @@
|
|
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
|
@@ -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
|
|
@@ -7,6 +7,16 @@ module PgEngine
|
|
7
7
|
clazz.helper_method :current_page_size
|
8
8
|
clazz.helper_method :show_filters?
|
9
9
|
clazz.helper_method :available_page_sizes
|
10
|
+
|
11
|
+
clazz.layout :set_layout
|
12
|
+
end
|
13
|
+
|
14
|
+
def set_layout
|
15
|
+
if action_name == 'index'
|
16
|
+
'pg_layout/base'
|
17
|
+
else
|
18
|
+
'pg_layout/containerized'
|
19
|
+
end
|
10
20
|
end
|
11
21
|
|
12
22
|
# Public endpoints
|
@@ -25,18 +35,40 @@ module PgEngine
|
|
25
35
|
end
|
26
36
|
|
27
37
|
def show
|
28
|
-
add_breadcrumb instancia_modelo.to_s_short, instancia_modelo.target_object
|
29
|
-
|
30
38
|
pg_respond_show
|
31
39
|
end
|
32
40
|
|
41
|
+
def respond_with_modal(klass_or_string)
|
42
|
+
if klass_or_string.is_a?(Class)
|
43
|
+
content = klass_or_string.new(instancia_modelo).render_in(view_context)
|
44
|
+
elsif klass_or_string.is_a?(String)
|
45
|
+
content = ModalContentComponent.new.with_body_content(klass_or_string)
|
46
|
+
.render_in(view_context)
|
47
|
+
end
|
48
|
+
|
49
|
+
if can_open_modal?
|
50
|
+
modal = ModalComponent.new.with_content(content)
|
51
|
+
render turbo_stream: turbo_stream.append_all('body', modal)
|
52
|
+
else
|
53
|
+
render html: content
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
33
57
|
def new
|
34
|
-
|
58
|
+
if respond_with_modal?
|
59
|
+
respond_with_modal(FormModalComponent)
|
60
|
+
else
|
61
|
+
add_breadcrumb instancia_modelo.submit_default_value
|
62
|
+
end
|
35
63
|
end
|
36
64
|
|
37
65
|
def edit
|
38
|
-
|
39
|
-
|
66
|
+
if respond_with_modal?
|
67
|
+
respond_with_modal(FormModalComponent)
|
68
|
+
else
|
69
|
+
add_breadcrumb instancia_modelo.to_s_short, instancia_modelo.target_object
|
70
|
+
add_breadcrumb 'Editando'
|
71
|
+
end
|
40
72
|
end
|
41
73
|
|
42
74
|
def create
|
@@ -93,57 +125,53 @@ module PgEngine
|
|
93
125
|
|
94
126
|
def pg_respond_update
|
95
127
|
object = instancia_modelo
|
96
|
-
|
97
|
-
if
|
98
|
-
|
99
|
-
|
128
|
+
if (@saved = object.save)
|
129
|
+
if in_modal?
|
130
|
+
body = <<~HTML.html_safe
|
131
|
+
<pg-event data-event-name="pg:record-created" data-turbo-temporary
|
132
|
+
data-response='#{object.decorate.to_json}'></pg-event>
|
133
|
+
HTML
|
134
|
+
render html: ModalContentComponent.new.with_body_content(body)
|
135
|
+
.render_in(view_context)
|
100
136
|
else
|
101
|
-
|
102
|
-
# self.instancia_modelo = instancia_modelo.decorate
|
103
|
-
format.html { render :edit, status: :unprocessable_entity }
|
104
|
-
format.json { render json: object.errors, status: :unprocessable_entity }
|
137
|
+
redirect_to object.decorate.target_object
|
105
138
|
end
|
139
|
+
elsif in_modal?
|
140
|
+
render html: FormModalComponent.new(instancia_modelo.decorate)
|
141
|
+
.render_in(view_context)
|
142
|
+
else
|
143
|
+
add_breadcrumb instancia_modelo.decorate.to_s_short, instancia_modelo.decorate.target_object
|
144
|
+
add_breadcrumb 'Editando'
|
145
|
+
# TODO: esto solucionaría el problema?
|
146
|
+
# self.instancia_modelo = instancia_modelo.decorate
|
147
|
+
#
|
148
|
+
render :edit, status: :unprocessable_entity
|
106
149
|
end
|
107
150
|
end
|
108
151
|
|
109
152
|
def pg_respond_create
|
110
153
|
object = instancia_modelo
|
111
|
-
|
112
|
-
if
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
)
|
121
|
-
# FIXME: handlear json
|
122
|
-
# render json: object.decorate, content_type: 'application/json'
|
123
|
-
end
|
124
|
-
end
|
125
|
-
format.html do
|
126
|
-
if params[:save_and_next] == 'true'
|
127
|
-
new_path = "#{url_for(@clase_modelo)}/new"
|
128
|
-
redirect_to new_path, notice: "#{@clase_modelo.nombre_singular} creado."
|
129
|
-
else
|
130
|
-
redirect_to object.decorate.target_object
|
131
|
-
end
|
132
|
-
end
|
133
|
-
format.json { render json: object.decorate }
|
154
|
+
if (@saved = object.save)
|
155
|
+
if in_modal?
|
156
|
+
body = <<~HTML.html_safe
|
157
|
+
<pg-event data-event-name="pg:record-created" data-turbo-temporary
|
158
|
+
data-response='#{object.decorate.to_json}'></pg-event>
|
159
|
+
HTML
|
160
|
+
render html: ModalContentComponent.new.with_body_content(body)
|
161
|
+
.render_in(view_context)
|
162
|
+
|
134
163
|
else
|
135
|
-
|
136
|
-
# self.instancia_modelo = instancia_modelo.decorate
|
137
|
-
if params[:asociable]
|
138
|
-
format.turbo_stream do
|
139
|
-
# FIXME: agregar , status: :unprocessable_entity
|
140
|
-
render turbo_stream:
|
141
|
-
turbo_stream.update_all('.modal.show .pg-associable-form', partial: 'form', locals: { asociable: true })
|
142
|
-
end
|
143
|
-
end
|
144
|
-
format.html { render :new, status: :unprocessable_entity }
|
145
|
-
format.json { render json: object.errors.full_messages, status: :unprocessable_entity }
|
164
|
+
redirect_to object.decorate.target_object
|
146
165
|
end
|
166
|
+
elsif in_modal?
|
167
|
+
render html: FormModalComponent.new(instancia_modelo.decorate)
|
168
|
+
.render_in(view_context)
|
169
|
+
else
|
170
|
+
add_breadcrumb instancia_modelo.decorate.submit_default_value
|
171
|
+
# TODO: esto solucionaría el problema?
|
172
|
+
# self.instancia_modelo = instancia_modelo.decorate
|
173
|
+
|
174
|
+
render :new, status: :unprocessable_entity
|
147
175
|
end
|
148
176
|
end
|
149
177
|
|
@@ -159,83 +187,87 @@ module PgEngine
|
|
159
187
|
end
|
160
188
|
end
|
161
189
|
|
162
|
-
def
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
190
|
+
def accepts_turbo_stream?
|
191
|
+
request.headers['Accept'].present? &&
|
192
|
+
request.headers['Accept'].include?('text/vnd.turbo-stream.html')
|
193
|
+
end
|
194
|
+
|
195
|
+
def in_modal?
|
196
|
+
request.headers['turbo-frame'] == 'modal_generic'
|
197
|
+
end
|
198
|
+
|
199
|
+
def respond_with_modal?
|
200
|
+
can_open_modal? || in_modal?
|
201
|
+
end
|
202
|
+
|
203
|
+
def can_open_modal?
|
204
|
+
request.get? &&
|
205
|
+
params[:start_modal] == 'true' &&
|
206
|
+
accepts_turbo_stream? &&
|
207
|
+
!in_modal?
|
208
|
+
end
|
209
|
+
|
210
|
+
def pg_respond_show
|
211
|
+
if respond_with_modal?
|
212
|
+
respond_with_modal(ShowModalComponent)
|
173
213
|
else
|
174
|
-
|
175
|
-
format.json { render json: object }
|
176
|
-
format.html
|
177
|
-
end
|
214
|
+
add_breadcrumb instancia_modelo.to_s_short, instancia_modelo.target_object
|
178
215
|
end
|
179
216
|
end
|
180
217
|
|
218
|
+
def destroyed_message(model)
|
219
|
+
"#{model.model_name.human} #{model.gender == 'f' ? 'borrada' : 'borrado'}"
|
220
|
+
end
|
221
|
+
|
181
222
|
def pg_respond_destroy(model, redirect_url = nil)
|
182
223
|
if destroy_model(model)
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
224
|
+
if respond_with_modal?
|
225
|
+
body = <<~HTML.html_safe
|
226
|
+
<pg-event data-event-name="pg:record-destroyed" data-turbo-temporary>
|
227
|
+
</pg-event>
|
228
|
+
HTML
|
229
|
+
respond_with_modal(body)
|
230
|
+
elsif redirect_url.present?
|
231
|
+
redirect_to redirect_url, notice: destroyed_message(model), status: :see_other
|
232
|
+
elsif accepts_turbo_stream?
|
233
|
+
body = <<~HTML.html_safe
|
234
|
+
<pg-event data-event-name="pg:record-destroyed" data-turbo-temporary>
|
235
|
+
</pg-event>
|
236
|
+
HTML
|
237
|
+
render turbo_stream: turbo_stream.append_all('body', body)
|
238
|
+
else
|
239
|
+
redirect_back(fallback_location: root_path,
|
240
|
+
notice: destroyed_message(model), status: 303)
|
200
241
|
end
|
242
|
+
elsif in_modal?
|
243
|
+
|
244
|
+
flash.now[:alert] = @error_message
|
245
|
+
render turbo_stream: render_turbo_stream_flash_messages(to: '.modal-body .flash')
|
246
|
+
elsif accepts_turbo_stream?
|
247
|
+
flash.now[:alert] = @error_message
|
248
|
+
render turbo_stream: render_turbo_stream_flash_messages
|
201
249
|
else
|
202
|
-
|
203
|
-
|
204
|
-
if model.respond_to?(:associated_elements) && model.associated_elements.present?
|
205
|
-
@model = model
|
206
|
-
render destroy_error_details_view
|
207
|
-
else
|
208
|
-
flash[:alert] = @error_message
|
209
|
-
redirect_back(fallback_location: root_path, status: 303)
|
210
|
-
end
|
211
|
-
end
|
212
|
-
format.json { render json: { error: @error_message }, status: :unprocessable_entity }
|
213
|
-
end
|
250
|
+
flash[:alert] = @error_message
|
251
|
+
redirect_back(fallback_location: root_path, status: 303)
|
214
252
|
end
|
215
253
|
end
|
216
254
|
|
217
|
-
# TODO: crear esta vista en pg_rails
|
218
|
-
def destroy_error_details_view
|
219
|
-
'destroy_error_details'
|
220
|
-
end
|
221
|
-
|
222
255
|
def destroy_model(model)
|
223
256
|
@error_message = 'No se pudo eliminar el registro'
|
257
|
+
|
224
258
|
begin
|
225
259
|
destroy_method = model.respond_to?(:discard) ? :discard : :destroy
|
226
260
|
return true if model.send(destroy_method)
|
227
261
|
|
228
|
-
@error_message = model.errors.full_messages.join(', ')
|
262
|
+
@error_message = model.errors.full_messages.join(', ').presence || @error_message
|
263
|
+
|
229
264
|
false
|
230
265
|
rescue ActiveRecord::InvalidForeignKey => e
|
231
|
-
# class_name = /from table \"(?<table_name>[\p{L}_]*)\"/.match(e.message)[:table_name].singularize.camelcase
|
232
|
-
# # pk_id = /from table \"(?<pk_id>[\p{L}_]*)\"/.match(e.message)[:pk_id].singularize.camelcase
|
233
|
-
# clazz = Object.const_get class_name
|
234
|
-
# objects = clazz.where(model.class.table_name.singularize => model)
|
235
266
|
model_name = t("activerecord.models.#{model.class.name.underscore}")
|
236
267
|
@error_message = "#{model_name} no se pudo borrar porque tiene elementos asociados."
|
237
|
-
|
268
|
+
pg_warn(e)
|
238
269
|
end
|
270
|
+
|
239
271
|
false
|
240
272
|
end
|
241
273
|
|
@@ -42,7 +42,11 @@ module PgEngine
|
|
42
42
|
# rubocop:enable Style/MissingRespondToMissing
|
43
43
|
|
44
44
|
def destroy_link_redirect
|
45
|
-
|
45
|
+
if helpers.using_modal?
|
46
|
+
destroy_link
|
47
|
+
else
|
48
|
+
destroy_link(redirect_to: helpers.url_for(target_index))
|
49
|
+
end
|
46
50
|
end
|
47
51
|
|
48
52
|
def destroy_link(confirm_text: '¿Estás seguro?', klass: 'btn-light', redirect_to: nil)
|
@@ -60,18 +64,28 @@ module PgEngine
|
|
60
64
|
def edit_link(text: ' Modificar', klass: 'btn-warning')
|
61
65
|
return unless Pundit.policy!(Current.user, object).edit?
|
62
66
|
|
67
|
+
start_modal = !helpers.using_modal? && object.class.default_modal
|
68
|
+
|
63
69
|
helpers.content_tag :span, rel: :tooltip, title: 'Modificar' do
|
64
|
-
helpers.link_to edit_object_url, class: "btn btn-sm #{klass}"
|
70
|
+
helpers.link_to edit_object_url + url_suffix(start_modal:), class: "btn btn-sm #{klass}",
|
71
|
+
'data-turbo-stream': start_modal do
|
65
72
|
helpers.content_tag(:span, nil, class: clase_icono('pencil')) + text
|
66
73
|
end
|
67
74
|
end
|
68
75
|
end
|
69
76
|
|
77
|
+
def url_suffix(start_modal: nil)
|
78
|
+
start_modal ? '?start_modal=true' : ''
|
79
|
+
end
|
80
|
+
|
70
81
|
def show_link(text: '', klass: 'btn-light')
|
71
82
|
return unless Pundit.policy!(Current.user, object).show?
|
72
83
|
|
84
|
+
start_modal = !helpers.using_modal? && object.class.default_modal
|
85
|
+
|
73
86
|
helpers.content_tag :span, rel: :tooltip, title: 'Ver' do
|
74
|
-
helpers.link_to object_url, class: "btn btn-sm #{klass}"
|
87
|
+
helpers.link_to object_url + url_suffix(start_modal:), class: "btn btn-sm #{klass}",
|
88
|
+
'data-turbo-stream': start_modal do
|
75
89
|
helpers.content_tag(:span, nil, class: clase_icono('eye-fill')) + text
|
76
90
|
end
|
77
91
|
end
|
@@ -88,12 +102,14 @@ module PgEngine
|
|
88
102
|
end
|
89
103
|
end
|
90
104
|
|
91
|
-
def new_link(
|
105
|
+
def new_link(klass: 'btn-warning')
|
92
106
|
return unless Pundit.policy!(Current.user, object).new?
|
93
107
|
|
108
|
+
start_modal = !helpers.using_modal? && object.class.default_modal
|
109
|
+
|
94
110
|
helpers.content_tag :span, rel: :tooltip, title: submit_default_value do
|
95
|
-
helpers.link_to(new_object_url, class: "btn btn-sm #{klass}",
|
96
|
-
|
111
|
+
helpers.link_to(new_object_url + url_suffix(start_modal:), class: "btn btn-sm #{klass}",
|
112
|
+
'data-turbo-stream': start_modal) do
|
97
113
|
helpers.content_tag(:span, nil,
|
98
114
|
class: clase_icono('plus').to_s) + "<span class='d-none d-sm-inline'> #{submit_default_value}</span>".html_safe
|
99
115
|
end
|
@@ -105,7 +121,7 @@ module PgEngine
|
|
105
121
|
end
|
106
122
|
|
107
123
|
def new_object_url
|
108
|
-
|
124
|
+
helpers.url_for(target_new)
|
109
125
|
end
|
110
126
|
|
111
127
|
def object_url
|
@@ -116,6 +132,11 @@ module PgEngine
|
|
116
132
|
pg_namespace.present? ? [pg_namespace, object] : object
|
117
133
|
end
|
118
134
|
|
135
|
+
def target_new
|
136
|
+
mod_name_sing = object.class.model_name.singular.to_sym
|
137
|
+
pg_namespace.present? ? [:new, pg_namespace, mod_name_sing] : [:new, mod_name_sing]
|
138
|
+
end
|
139
|
+
|
119
140
|
def target_index
|
120
141
|
pg_namespace.present? ? [pg_namespace, object.class] : object.class
|
121
142
|
end
|
@@ -123,7 +144,7 @@ module PgEngine
|
|
123
144
|
# actionview-7.1.3.2/lib/action_view/helpers/form_helper.rb
|
124
145
|
def submit_default_value
|
125
146
|
key = :create
|
126
|
-
model = object.model_name.human
|
147
|
+
model = object.model_name.human.downcase
|
127
148
|
defaults = []
|
128
149
|
defaults << :"helpers.submit.#{object.model_name.i18n_key}.#{key}"
|
129
150
|
defaults << :"helpers.submit.#{key}"
|
@@ -1,7 +1,11 @@
|
|
1
1
|
module PgEngine
|
2
2
|
module FlashHelper
|
3
|
-
def render_turbo_stream_flash_messages
|
4
|
-
|
3
|
+
def render_turbo_stream_flash_messages(to: nil)
|
4
|
+
if to.present?
|
5
|
+
turbo_stream.prepend_all to, partial: 'pg_layout/flash'
|
6
|
+
else
|
7
|
+
turbo_stream.prepend 'flash', partial: 'pg_layout/flash'
|
8
|
+
end
|
5
9
|
end
|
6
10
|
|
7
11
|
def render_turbo_stream_title
|