pg_rails 7.0.1 → 7.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +6 -4
- data/pg_associable/app/assets/css/pg_associable.scss +99 -0
- data/pg_associable/app/assets/js/asociable_controller.js +59 -0
- data/pg_associable/app/assets/js/asociable_inline_controller.js +141 -0
- data/pg_associable/app/assets/js/modal_controller.js +130 -0
- data/pg_associable/app/helpers/pg_associable/form_builder_methods.rb +31 -0
- data/pg_associable/app/helpers/pg_associable/helpers.rb +19 -0
- data/pg_associable/app/inputs/pg_associable/pg_associable_inline_input.rb +39 -0
- data/pg_associable/app/inputs/pg_associable/pg_associable_input.rb +41 -0
- data/pg_associable/app/views/pg_associable/_resultados.html.slim +9 -0
- data/pg_associable/app/views/pg_associable/_resultados_inline.html.slim +12 -0
- data/pg_associable/app/views/pg_engine/base/_pg_associable_modal.html.slim +39 -0
- data/pg_associable/index.js +7 -0
- data/pg_associable/lib/pg_associable/engine.rb +12 -0
- data/pg_associable/lib/pg_associable/simple_form_initializer.rb +34 -0
- data/pg_associable/lib/pg_associable.rb +5 -0
- data/{lib/tasks/pg_rails_tasks.rake → pg_associable/lib/tasks/pg_associable_tasks.rake} +1 -2
- data/pg_engine/app/assets/stylesheets/pg_rails_b5.scss +74 -0
- data/pg_engine/app/controllers/pg_engine/base_controller.rb +365 -0
- data/pg_engine/app/controllers/pg_engine/devise_controller.rb +9 -0
- data/pg_engine/app/controllers/pg_engine/signed_in_controller.rb +7 -0
- data/{app/decorators/pg_rails → pg_engine/app/decorators/pg_engine}/base_decorator.rb +21 -23
- data/pg_engine/app/helpers/pg_engine/flash_helper.rb +26 -0
- data/pg_engine/app/helpers/pg_engine/form_helper.rb +33 -0
- data/pg_engine/app/helpers/pg_engine/index_helper.rb +42 -0
- data/{app/helpers/pg_rails → pg_engine/app/helpers/pg_engine}/postgres_helper.rb +1 -1
- data/{app/helpers/pg_rails → pg_engine/app/helpers/pg_engine}/print_helper.rb +15 -31
- data/pg_engine/app/helpers/pg_engine/route_helper.rb +41 -0
- data/pg_engine/app/inputs/pg_engine/fecha_input.rb +20 -0
- data/{app/lib/pg_rails → pg_engine/app/lib/pg_engine}/filtros_builder.rb +16 -17
- data/pg_engine/app/lib/pg_form_builder.rb +22 -0
- data/pg_engine/app/models/pg_engine/base_record.rb +63 -0
- data/{app/policies/pg_rails → pg_engine/app/policies/pg_engine}/application_policy.rb +2 -2
- data/pg_engine/app/views/pg_engine/base/download.xlsx.axlsx +14 -0
- data/pg_engine/app/views/pg_engine/base/index.html.slim +51 -0
- data/pg_engine/config/locales/es.yml +48 -0
- data/pg_engine/config/simple_form/simple_form.rb +178 -0
- data/pg_engine/config/simple_form/simple_form_bootstrap.rb +371 -0
- data/{lib/pg_rails → pg_engine/lib/pg_engine}/configuracion.rb +3 -1
- data/pg_engine/lib/pg_engine/engine.rb +53 -0
- data/{lib/pg_rails → pg_engine/lib/pg_engine}/utils/logueador.rb +8 -1
- data/pg_engine/lib/pg_engine.rb +35 -0
- data/{lib → pg_engine/lib}/tasks/auto_anotar_modelos.rake +1 -1
- data/pg_engine/lib/templates/activeadmin/audits.rb +53 -0
- data/pg_engine/lib/templates/activeadmin/users.rb +54 -0
- data/pg_layout/app/assets/stylesheets/sidebar.scss +106 -0
- data/pg_layout/app/javascript/cookies.js +23 -0
- data/pg_layout/app/javascript/navbar_controller.js +10 -0
- data/pg_layout/app/lib/navbar.rb +61 -0
- data/pg_layout/app/views/devise/confirmations/new.html.erb +20 -0
- data/pg_layout/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/pg_layout/app/views/devise/mailer/email_changed.html.erb +7 -0
- data/pg_layout/app/views/devise/mailer/password_change.html.erb +3 -0
- data/pg_layout/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/pg_layout/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/pg_layout/app/views/devise/passwords/edit.html.erb +27 -0
- data/pg_layout/app/views/devise/passwords/new.html.erb +18 -0
- data/pg_layout/app/views/devise/registrations/edit.html.erb +35 -0
- data/pg_layout/app/views/devise/registrations/new.html.erb +25 -0
- data/pg_layout/app/views/devise/sessions/new.html.erb +20 -0
- data/pg_layout/app/views/devise/shared/_error_messages.html.erb +15 -0
- data/pg_layout/app/views/devise/shared/_links.html.erb +25 -0
- data/pg_layout/app/views/devise/unlocks/new.html.erb +19 -0
- data/pg_layout/app/views/kaminari/_first_page.html.slim +3 -0
- data/pg_layout/app/views/kaminari/_gap.html.slim +2 -0
- data/pg_layout/app/views/kaminari/_last_page.html.slim +3 -0
- data/pg_layout/app/views/kaminari/_next_page.html.slim +3 -0
- data/pg_layout/app/views/kaminari/_page.html.slim +6 -0
- data/pg_layout/app/views/kaminari/_paginator.html.slim +12 -0
- data/pg_layout/app/views/kaminari/_prev_page.html.slim +3 -0
- data/pg_layout/app/views/layouts/pg_layout/devise.html.slim +24 -0
- data/pg_layout/app/views/layouts/pg_layout/layout.html.slim +30 -0
- data/pg_layout/app/views/pg_layout/_flash.html.slim +10 -0
- data/pg_layout/app/views/pg_layout/_navbar.html.erb +43 -0
- data/pg_layout/app/views/pg_layout/_sidebar.html.erb +42 -0
- data/pg_layout/index.js +35 -0
- data/pg_layout/lib/pg_layout/engine.rb +7 -0
- data/pg_layout/lib/pg_layout.rb +9 -0
- data/pg_rails/js/index.js +2 -0
- data/pg_rails/lib/pg_rails.rb +7 -0
- data/{lib/pg_rails → pg_rails/lib}/version.rb +1 -1
- data/pg_rails/scss/pg_rails.scss +3 -0
- data/pg_scaffold/lib/generators/pg_active_record/model/model_generator.rb +34 -0
- data/pg_scaffold/lib/generators/pg_active_record/model/templates/admin.rb +19 -0
- data/pg_scaffold/lib/generators/pg_active_record/model/templates/create_table_migration.rb.tt +46 -0
- data/pg_scaffold/lib/generators/pg_active_record/model/templates/migration.rb.tt +48 -0
- data/pg_scaffold/lib/generators/pg_active_record/model/templates/model.rb +47 -0
- data/pg_scaffold/lib/generators/pg_active_record/model/templates/module.rb +9 -0
- data/pg_scaffold/lib/generators/pg_decorator/USAGE +8 -0
- data/pg_scaffold/lib/generators/pg_decorator/pg_decorator_generator.rb +31 -0
- data/pg_scaffold/lib/generators/pg_decorator/templates/decorator.rb +22 -0
- data/pg_scaffold/lib/generators/pg_factory_bot/model/model_generator.rb +95 -0
- data/pg_scaffold/lib/generators/pg_factory_bot/model/templates/factories.erb +14 -0
- data/pg_scaffold/lib/generators/pg_pundit/USAGE +8 -0
- data/pg_scaffold/lib/generators/pg_pundit/pg_pundit_generator.rb +21 -0
- data/pg_scaffold/lib/generators/pg_pundit/templates/policy.rb +37 -0
- data/pg_scaffold/lib/generators/pg_rails/instalar/USAGE +8 -0
- data/pg_scaffold/lib/generators/pg_rails/instalar/instalar_generator.rb +17 -0
- data/pg_scaffold/lib/generators/pg_rails/instalar/templates/pg_rails.rb +10 -0
- data/pg_scaffold/lib/generators/pg_resource_route/pg_resource_route_generator.rb +27 -0
- data/pg_scaffold/lib/generators/pg_rspec/model/model_generator.rb +30 -0
- data/pg_scaffold/lib/generators/pg_rspec/model/templates/model_spec.rb +15 -0
- data/pg_scaffold/lib/generators/pg_rspec/scaffold/scaffold_generator.rb +43 -0
- data/pg_scaffold/lib/generators/pg_rspec/scaffold/templates/api_controller_spec.rb +167 -0
- data/pg_scaffold/lib/generators/pg_rspec/scaffold/templates/controller_spec.rb +269 -0
- data/pg_scaffold/lib/generators/pg_rspec/scaffold/templates/edit_spec.rb +34 -0
- data/pg_scaffold/lib/generators/pg_rspec/scaffold/templates/index_spec.rb +28 -0
- data/pg_scaffold/lib/generators/pg_rspec/scaffold/templates/new_spec.rb +34 -0
- data/pg_scaffold/lib/generators/pg_rspec/scaffold/templates/routing_spec.rb +50 -0
- data/pg_scaffold/lib/generators/pg_rspec/scaffold/templates/show_spec.rb +26 -0
- data/pg_scaffold/lib/generators/pg_scaffold/USAGE +8 -0
- data/pg_scaffold/lib/generators/pg_scaffold/pg_scaffold_generator.rb +87 -0
- data/pg_scaffold/lib/generators/pg_scaffold/templates/controller.rb +37 -0
- data/pg_scaffold/lib/generators/pg_slim/USAGE +8 -0
- data/pg_scaffold/lib/generators/pg_slim/pg_slim_generator.rb +31 -0
- data/pg_scaffold/lib/generators/pg_slim/templates/_form.html.slim +12 -0
- data/pg_scaffold/lib/generators/pg_slim/templates/download.xlsx.axlsx +14 -0
- data/pg_scaffold/lib/generators/pg_slim/templates/edit.html.slim +5 -0
- data/pg_scaffold/lib/generators/pg_slim/templates/index.html.slim +51 -0
- data/pg_scaffold/lib/generators/pg_slim/templates/new.html.slim +5 -0
- data/pg_scaffold/lib/generators/pg_slim/templates/partial.html.slim +1 -0
- data/pg_scaffold/lib/generators/pg_slim/templates/show.html.slim +38 -0
- data/pg_scaffold/lib/pg_scaffold/monkey_patches/mejoras_a_named_base.rb +37 -0
- data/pg_scaffold/lib/pg_scaffold/monkey_patches/mejoras_de_atributos.rb +116 -0
- data/pg_scaffold/lib/pg_scaffold/railtie.rb +16 -0
- data/pg_scaffold/lib/pg_scaffold.rb +4 -0
- metadata +134 -48
- data/Rakefile +0 -36
- data/app/assets/javascripts/pg_rails/asociacion_creable.js +0 -85
- data/app/assets/javascripts/pg_rails/best_in_place_datepicker.js +0 -58
- data/app/assets/javascripts/pg_rails/librerias.js +0 -13
- data/app/assets/javascripts/pg_rails/librerias_b3.js +0 -14
- data/app/assets/javascripts/pg_rails/validaciones.js +0 -44
- data/app/assets/javascripts/pg_rails.js +0 -318
- data/app/assets/stylesheets/pg_rails/librerias.scss +0 -5
- data/app/assets/stylesheets/pg_rails/pg_chosen.scss +0 -29
- data/app/assets/stylesheets/pg_rails/pg_rails.scss +0 -199
- data/app/assets/stylesheets/pg_rails_b3.scss +0 -10
- data/app/assets/stylesheets/pg_rails_b4.scss +0 -12
- data/app/assets/stylesheets/pg_rails_b5.scss +0 -1
- data/app/controllers/pg_rails/application_controller.rb +0 -316
- data/app/controllers/pg_rails/editar_en_lugar_controller.rb +0 -24
- data/app/helpers/pg_rails/editar_en_lugar_helper.rb +0 -106
- data/app/helpers/pg_rails/form_helper.rb +0 -25
- data/app/inputs/pg_rails/asociacion_creable_input.rb +0 -72
- data/app/inputs/pg_rails/fecha_input.rb +0 -20
- data/app/inputs/pg_rails/selects_dependientes_input.rb +0 -9
- data/app/lib/pg_form_builder.rb +0 -31
- data/app/models/pg_rails/application_record.rb +0 -51
- data/app/views/application/_abrir_modal.js.erb +0 -14
- data/app/views/application/_actualizar_smart_listing.html.slim +0 -3
- data/app/views/application/_cerrar_modal.js.erb +0 -8
- data/app/views/application/_modal_ajax_form.js.erb +0 -7
- data/config/brakeman.ignore +0 -42
- data/config/locales/es.yml +0 -17
- data/config/routes.rb +0 -3
- data/config/spring.rb +0 -1
- data/lib/pg_rails/engine.rb +0 -42
- data/lib/pg_rails/simple_form/initializer.rb +0 -583
- data/lib/pg_rails.rb +0 -23
- /data/{lib/pg_rails → pg_engine/lib/pg_engine}/core_ext.rb +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
SimpleForm.setup do |config|
|
|
2
|
+
config.wrappers :pg_associable, tag: 'div', class: 'pg_associable mb-3', html: { data: { controller: 'asociable', 'asociable-modal-outlet': '.modal' } },
|
|
3
|
+
error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|
|
|
4
|
+
b.use :html5
|
|
5
|
+
b.optional :readonly
|
|
6
|
+
b.use :label, class: 'form-control-label'
|
|
7
|
+
b.use :hidden_input
|
|
8
|
+
b.wrapper tag: 'div', class: 'position-relative' do |ba|
|
|
9
|
+
ba.use :input, class: 'form-control', disabled: true, placeholder: 'Clic para seleccionar...',
|
|
10
|
+
error_class: 'is-invalid'
|
|
11
|
+
ba.use :pencil
|
|
12
|
+
ba.use :modal_link
|
|
13
|
+
ba.use :limpiar
|
|
14
|
+
end
|
|
15
|
+
b.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback d-block' }
|
|
16
|
+
b.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
config.wrappers :pg_associable_inline, tag: 'div', class: 'pg_associable_inline mb-3', html: { data: { controller: 'asociable_inline' } },
|
|
20
|
+
error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|
|
|
21
|
+
b.use :html5
|
|
22
|
+
b.optional :readonly
|
|
23
|
+
b.use :label, class: 'form-control-label'
|
|
24
|
+
b.use :hidden_input
|
|
25
|
+
b.wrapper tag: 'div', class: 'search-box position-relative' do |ba|
|
|
26
|
+
ba.use :search_form, error_class: 'is-invalid'
|
|
27
|
+
ba.use :limpiar
|
|
28
|
+
ba.use :pencil
|
|
29
|
+
# ba.use :input, class: 'form-control', placeholder: 'Buscar...'
|
|
30
|
+
end
|
|
31
|
+
b.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback d-block' }
|
|
32
|
+
b.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
@use 'sass:color';
|
|
2
|
+
|
|
3
|
+
:root,
|
|
4
|
+
[data-bs-theme=light] {
|
|
5
|
+
--bs-form-invalid-color: #b50000;
|
|
6
|
+
--bs-form-invalid-border-color: #b50000;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
// FORMS
|
|
11
|
+
// .pg-form {
|
|
12
|
+
// max-width: 300px;
|
|
13
|
+
|
|
14
|
+
input[disabled] {
|
|
15
|
+
background-color: #e9e9ed;
|
|
16
|
+
color: black;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.form-control,
|
|
20
|
+
.form-select {
|
|
21
|
+
width: 100%;
|
|
22
|
+
height: 35px;
|
|
23
|
+
border: 1px solid #a7b7bb;
|
|
24
|
+
border-radius: 3px;
|
|
25
|
+
|
|
26
|
+
&.form-control-sm,
|
|
27
|
+
&.form-select-sm {
|
|
28
|
+
height: 29px;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
&.is-invalid {
|
|
32
|
+
background-image: none!important; /* override bootstrap forms */
|
|
33
|
+
padding-right: 0; /* override bootstrap forms */
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
&:focus, &:focus-visible {
|
|
37
|
+
outline: 1px solid color.adjust(#a7b7bb, $saturation: +30%);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
select[multiple] {
|
|
41
|
+
height: inherit;
|
|
42
|
+
}
|
|
43
|
+
.form-control:focus {
|
|
44
|
+
box-shadow: none!important; /* override bootstrap forms */
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
input[type=date] {
|
|
48
|
+
max-width: 170px;
|
|
49
|
+
}
|
|
50
|
+
// }
|
|
51
|
+
|
|
52
|
+
// LISTADOS
|
|
53
|
+
.listado {
|
|
54
|
+
td, th {
|
|
55
|
+
padding: 0.25rem 1rem;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
.listado .btn-sm {
|
|
59
|
+
min-width: 25px;
|
|
60
|
+
height: 25px;
|
|
61
|
+
padding: 1px;
|
|
62
|
+
margin-right: 4px;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// FILTROS
|
|
66
|
+
.filter {
|
|
67
|
+
display: inline-block;
|
|
68
|
+
vertical-align: top;
|
|
69
|
+
min-width: 200px;
|
|
70
|
+
|
|
71
|
+
.input-group {
|
|
72
|
+
width: 230px;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module PgEngine
|
|
4
|
+
# rubocop:disable Rails/ApplicationController
|
|
5
|
+
class BaseController < ActionController::Base
|
|
6
|
+
# rubocop:enable Rails/ApplicationController
|
|
7
|
+
include Pundit::Authorization
|
|
8
|
+
include PrintHelper
|
|
9
|
+
include PostgresHelper
|
|
10
|
+
include FlashHelper
|
|
11
|
+
include RouteHelper
|
|
12
|
+
include PgAssociable::Helpers
|
|
13
|
+
|
|
14
|
+
protect_from_forgery with: :exception
|
|
15
|
+
|
|
16
|
+
rescue_from PrintHelper::FechaInvalidaError, with: :fecha_invalida
|
|
17
|
+
rescue_from Pundit::NotAuthorizedError, with: :not_authorized
|
|
18
|
+
|
|
19
|
+
helper_method :mobile_device?
|
|
20
|
+
helper_method :atributos_para_listar
|
|
21
|
+
helper_method :atributos_para_mostrar
|
|
22
|
+
|
|
23
|
+
layout 'pg_layout/layout'
|
|
24
|
+
|
|
25
|
+
# Los flash_types resultantes serían:
|
|
26
|
+
# [:alert, :notice, :warning, :success]
|
|
27
|
+
add_flash_types :warning, :success
|
|
28
|
+
|
|
29
|
+
before_action do
|
|
30
|
+
@breakpoint_navbar_expand = 'md'
|
|
31
|
+
@navbar_opened_class = if cookies[:navbar_expand] == 'false' || !user_signed_in?
|
|
32
|
+
''
|
|
33
|
+
else
|
|
34
|
+
'opened'
|
|
35
|
+
end
|
|
36
|
+
@navbar = Navbar.new(current_user)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Public endpoints
|
|
40
|
+
def abrir_modal
|
|
41
|
+
pg_respond_abrir_modal
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def buscar
|
|
45
|
+
pg_respond_buscar
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def index
|
|
49
|
+
@collection = filtros_y_policy atributos_para_buscar
|
|
50
|
+
@collection = sort_collection(@collection)
|
|
51
|
+
pg_respond_index
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def show
|
|
55
|
+
add_breadcrumb instancia_modelo, instancia_modelo.target_object
|
|
56
|
+
|
|
57
|
+
pg_respond_show
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def new
|
|
61
|
+
add_breadcrumb "Crear #{@clase_modelo.nombre_singular.downcase}"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def edit
|
|
65
|
+
add_breadcrumb instancia_modelo, instancia_modelo.target_object
|
|
66
|
+
add_breadcrumb 'Editando'
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def create
|
|
70
|
+
pg_respond_create
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def update
|
|
74
|
+
pg_respond_update
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def destroy
|
|
78
|
+
url = namespaced_path(@clase_modelo)
|
|
79
|
+
pg_respond_destroy(instancia_modelo, url)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# End public endpoints
|
|
83
|
+
|
|
84
|
+
def mobile_device?
|
|
85
|
+
request.user_agent =~ /Mobile|webOS/
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
helper_method :any_filter?
|
|
89
|
+
|
|
90
|
+
def any_filter?
|
|
91
|
+
params.keys.reject { |a| a.in? %w[controller action page page_size order_by order_direction] }.any?
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
helper_method :current_page_size
|
|
95
|
+
|
|
96
|
+
def current_page_size
|
|
97
|
+
if params[:page_size].present?
|
|
98
|
+
session[:page_size] = params[:page_size]
|
|
99
|
+
params[:page_size].to_i
|
|
100
|
+
else
|
|
101
|
+
default_page_size
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def default_page_size
|
|
106
|
+
session[:page_size].present? ? session[:page_size].to_i : 10
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
protected
|
|
110
|
+
|
|
111
|
+
def pg_respond_update(object: nil)
|
|
112
|
+
object ||= instancia_modelo
|
|
113
|
+
respond_to do |format|
|
|
114
|
+
if (@saved = object.save)
|
|
115
|
+
format.html { redirect_to object.decorate.target_object }
|
|
116
|
+
format.json { render json: object.decorate }
|
|
117
|
+
else
|
|
118
|
+
format.html { render :edit, status: :unprocessable_entity }
|
|
119
|
+
format.json { render json: object.errors, status: :unprocessable_entity }
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def pg_respond_create(object: nil)
|
|
125
|
+
object ||= instancia_modelo
|
|
126
|
+
respond_to do |format|
|
|
127
|
+
if (@saved = object.save)
|
|
128
|
+
if params[:asociable]
|
|
129
|
+
format.turbo_stream do
|
|
130
|
+
render turbo_stream:
|
|
131
|
+
turbo_stream.update('pg-associable-form', <<~HTML
|
|
132
|
+
<div data-modal-target="response" data-response='#{object.decorate.to_json}'></div>
|
|
133
|
+
HTML
|
|
134
|
+
)
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
format.html do
|
|
138
|
+
if params[:save_and_next] == 'true'
|
|
139
|
+
new_path = "#{url_for(@clase_modelo)}/new"
|
|
140
|
+
redirect_to new_path, notice: "#{@clase_modelo.nombre_singular} creado."
|
|
141
|
+
else
|
|
142
|
+
redirect_to object.decorate.target_object
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
format.json { render json: object.decorate }
|
|
146
|
+
else
|
|
147
|
+
if params[:asociable]
|
|
148
|
+
format.turbo_stream do
|
|
149
|
+
render turbo_stream:
|
|
150
|
+
turbo_stream.update('pg-associable-form', partial: 'form', locals: { asociable: true })
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
format.html { render :new, status: :unprocessable_entity }
|
|
154
|
+
format.json { render json: object.errors.full_messages, status: :unprocessable_entity }
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def pg_respond_index
|
|
160
|
+
respond_to do |format|
|
|
161
|
+
format.json { render json: @collection }
|
|
162
|
+
format.html { render_listing }
|
|
163
|
+
format.xlsx do
|
|
164
|
+
render xlsx: 'download',
|
|
165
|
+
filename: "#{@clase_modelo.nombre_plural.gsub(' ', '-').downcase}" \
|
|
166
|
+
"-#{Time.zone.now.strftime('%Y-%m-%d-%H.%M.%S')}.xlsx"
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def pg_respond_show(object = nil)
|
|
172
|
+
respond_to do |format|
|
|
173
|
+
format.json { render json: object || instancia_modelo }
|
|
174
|
+
format.html
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def pg_respond_destroy(model, redirect_url = nil)
|
|
179
|
+
if destroy_model(model)
|
|
180
|
+
respond_to do |format|
|
|
181
|
+
format.html do
|
|
182
|
+
if redirect_url.present?
|
|
183
|
+
redirect_to redirect_url, notice: 'Elemento borrado.', status: :see_other
|
|
184
|
+
else
|
|
185
|
+
redirect_back(fallback_location: root_path, notice: 'Elemento borrado.', status: 303)
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
format.json { head :no_content }
|
|
189
|
+
end
|
|
190
|
+
else
|
|
191
|
+
respond_to do |format|
|
|
192
|
+
format.html do
|
|
193
|
+
if model.respond_to?(:associated_elements) && model.associated_elements.present?
|
|
194
|
+
@model = model
|
|
195
|
+
render destroy_error_details_view
|
|
196
|
+
else
|
|
197
|
+
flash[:alert] = @error_message
|
|
198
|
+
# if redirect_url.present?
|
|
199
|
+
# redirect_to redirect_url
|
|
200
|
+
# else
|
|
201
|
+
redirect_back(fallback_location: root_path, status: 303)
|
|
202
|
+
# end
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
format.json { render json: { error: @error_message }, status: :unprocessable_entity }
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
# TODO: crear esta vista en pg_rails
|
|
211
|
+
def destroy_error_details_view
|
|
212
|
+
'destroy_error_details'
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
def destroy_model(model)
|
|
216
|
+
@error_message = 'No se pudo eliminar el registro'
|
|
217
|
+
begin
|
|
218
|
+
destroy_method = model.respond_to?(:discard) ? :discard : :destroy
|
|
219
|
+
return true if model.send(destroy_method)
|
|
220
|
+
|
|
221
|
+
@error_message = model.errors.full_messages.join(', ')
|
|
222
|
+
false
|
|
223
|
+
rescue ActiveRecord::InvalidForeignKey => e
|
|
224
|
+
# class_name = /from table \"(?<table_name>[\p{L}_]*)\"/.match(e.message)[:table_name].singularize.camelcase
|
|
225
|
+
# # pk_id = /from table \"(?<pk_id>[\p{L}_]*)\"/.match(e.message)[:pk_id].singularize.camelcase
|
|
226
|
+
# clazz = Object.const_get class_name
|
|
227
|
+
# objects = clazz.where(model.class.table_name.singularize => model)
|
|
228
|
+
model_name = t("activerecord.models.#{model.class.name.underscore}")
|
|
229
|
+
@error_message = "#{model_name} no se pudo borrar porque tiene elementos asociados."
|
|
230
|
+
logger.debug e.message
|
|
231
|
+
end
|
|
232
|
+
false
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
def render_listing
|
|
236
|
+
@collection = @collection.page(params[:page]).per(current_page_size)
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
def buscar_instancia
|
|
240
|
+
if Object.const_defined?('FriendlyId') && @clase_modelo.is_a?(FriendlyId)
|
|
241
|
+
@clase_modelo.friendly.find(params[:id])
|
|
242
|
+
else
|
|
243
|
+
@clase_modelo.find(params[:id])
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
def set_instancia_modelo
|
|
248
|
+
if action_name.in? %w[new create]
|
|
249
|
+
self.instancia_modelo = @clase_modelo.new(modelo_params)
|
|
250
|
+
else
|
|
251
|
+
self.instancia_modelo = buscar_instancia
|
|
252
|
+
|
|
253
|
+
instancia_modelo.assign_attributes(modelo_params) if action_name.in? %w[update]
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
instancia_modelo.current_user = send(PgEngine.configuracion.current_user_method)
|
|
257
|
+
|
|
258
|
+
authorize instancia_modelo
|
|
259
|
+
|
|
260
|
+
# TODO: problema en create y update cuando falla la validacion
|
|
261
|
+
self.instancia_modelo = instancia_modelo.decorate if action_name.in? %w[show edit new]
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
def instancia_modelo=(val)
|
|
265
|
+
instance_variable_set(:"@#{nombre_modelo}", val)
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
def instancia_modelo
|
|
269
|
+
instance_variable_get(:"@#{nombre_modelo}")
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
def modelo_params
|
|
273
|
+
if action_name == 'new'
|
|
274
|
+
params.permit(atributos_permitidos)
|
|
275
|
+
else
|
|
276
|
+
params.require(nombre_modelo).permit(atributos_permitidos)
|
|
277
|
+
end
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
def nombre_modelo
|
|
281
|
+
@clase_modelo.name.underscore
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
def default_url_options(options = {})
|
|
285
|
+
if Rails.env.production?
|
|
286
|
+
options.merge(protocol: 'https')
|
|
287
|
+
else
|
|
288
|
+
options
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
def clase_modelo
|
|
293
|
+
# agarro la variable o intento con el nombre del controller
|
|
294
|
+
@clase_modelo ||= self.class.name.singularize.gsub('Controller', '').constantize
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
def filtros_y_policy(campos)
|
|
298
|
+
@filtros = PgEngine::FiltrosBuilder.new(
|
|
299
|
+
self, clase_modelo, campos
|
|
300
|
+
)
|
|
301
|
+
scope = policy_scope(clase_modelo)
|
|
302
|
+
|
|
303
|
+
@filtros.filtrar(scope)
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
def do_sort(scope, field, direction)
|
|
307
|
+
unless scope.model.column_names.include? field.to_s
|
|
308
|
+
Utils::Logueador.warning("No existe el campo \"#{field}\"")
|
|
309
|
+
return scope
|
|
310
|
+
end
|
|
311
|
+
scope = scope.order(field => direction)
|
|
312
|
+
instance_variable_set(:@field, field)
|
|
313
|
+
instance_variable_set(:@direction, direction)
|
|
314
|
+
scope
|
|
315
|
+
rescue ArgumentError => e
|
|
316
|
+
Utils::Logueador.warning(e.to_s)
|
|
317
|
+
scope
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
def sort_collection(scope, options = {})
|
|
321
|
+
if params[:order_by].present?
|
|
322
|
+
field = params[:order_by]
|
|
323
|
+
direction = params[:order_direction]
|
|
324
|
+
do_sort(scope, field, direction)
|
|
325
|
+
elsif options[:default].present?
|
|
326
|
+
field = options[:default].first[0]
|
|
327
|
+
direction = options[:default].first[1]
|
|
328
|
+
do_sort(scope, field, direction)
|
|
329
|
+
else
|
|
330
|
+
scope
|
|
331
|
+
end
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
def fecha_invalida
|
|
335
|
+
respond_to do |format|
|
|
336
|
+
format.json do
|
|
337
|
+
render json: { error: 'Formato de fecha inválido' },
|
|
338
|
+
status: :unprocessable_entity
|
|
339
|
+
end
|
|
340
|
+
format.html { go_back('Formato de fecha inválido') }
|
|
341
|
+
end
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
def not_authorized
|
|
345
|
+
respond_to do |format|
|
|
346
|
+
format.json do
|
|
347
|
+
render json: { error: 'Not authorized' },
|
|
348
|
+
status: :unprocessable_entity
|
|
349
|
+
end
|
|
350
|
+
format.html do
|
|
351
|
+
if request.path == root_path
|
|
352
|
+
render plain: 'Not authorized'
|
|
353
|
+
else
|
|
354
|
+
go_back('Not authorized')
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
end
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
def go_back(message)
|
|
361
|
+
flash[:alert] = message
|
|
362
|
+
redirect_back fallback_location: root_path
|
|
363
|
+
end
|
|
364
|
+
end
|
|
365
|
+
end
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
module
|
|
3
|
+
module PgEngine
|
|
4
4
|
class BaseDecorator < Draper::Decorator
|
|
5
5
|
include ActionView::Helpers
|
|
6
6
|
include PrintHelper
|
|
7
7
|
include FormHelper
|
|
8
|
+
include RouteHelper
|
|
8
9
|
include Pundit::Authorization
|
|
9
10
|
|
|
10
11
|
attr_accessor :output_buffer
|
|
@@ -15,7 +16,7 @@ module PgRails
|
|
|
15
16
|
object.as_json.tap { |o| o[:to_s] = to_s }
|
|
16
17
|
end
|
|
17
18
|
|
|
18
|
-
# def method_missing(method_name, *args, &block)
|
|
19
|
+
# def method_missing(method_name, *args, &block)
|
|
19
20
|
# valor = object.attributes[method_name.to_s]
|
|
20
21
|
# return super unless valor.present?
|
|
21
22
|
|
|
@@ -29,7 +30,7 @@ module PgRails
|
|
|
29
30
|
# end
|
|
30
31
|
|
|
31
32
|
def destroy_link(message = '¿Estás seguro?')
|
|
32
|
-
return unless Pundit.policy!(helpers.send(
|
|
33
|
+
return unless Pundit.policy!(helpers.send(PgEngine.configuracion.current_user_method), object).destroy?
|
|
33
34
|
|
|
34
35
|
helpers.content_tag :span, rel: :tooltip, title: 'Eliminar' do
|
|
35
36
|
helpers.link_to object_url, data: { 'turbo-confirm': message, 'turbo-method': :delete },
|
|
@@ -40,43 +41,44 @@ module PgRails
|
|
|
40
41
|
end
|
|
41
42
|
|
|
42
43
|
def edit_link(texto = '')
|
|
43
|
-
return unless Pundit.policy!(helpers.send(
|
|
44
|
+
return unless Pundit.policy!(helpers.send(PgEngine.configuracion.current_user_method), object).edit?
|
|
44
45
|
|
|
45
46
|
helpers.content_tag :span, rel: :tooltip, title: 'Editar' do
|
|
46
47
|
helpers.link_to edit_object_url, data: { turbo_frame: :main },
|
|
47
|
-
|
|
48
|
+
class: "btn #{_config.clase_botones_chicos} btn-#{_config.boton_edit}" do
|
|
48
49
|
helpers.content_tag(:span, nil, class: clase_icono(_config.icono_edit).to_s) + texto
|
|
49
50
|
end
|
|
50
51
|
end
|
|
51
52
|
end
|
|
52
53
|
|
|
53
54
|
def show_link(texto = '')
|
|
54
|
-
return unless Pundit.policy!(helpers.send(
|
|
55
|
+
return unless Pundit.policy!(helpers.send(PgEngine.configuracion.current_user_method), object).show?
|
|
55
56
|
|
|
56
57
|
helpers.content_tag :span, rel: :tooltip, title: 'Ver' do
|
|
57
58
|
helpers.link_to object_url, data: { turbo_frame: :main },
|
|
58
|
-
|
|
59
|
+
class: "btn #{_config.clase_botones_chicos} btn-#{_config.boton_show}" do
|
|
59
60
|
helpers.content_tag(:span, nil, class: clase_icono(_config.icono_show).to_s) + texto
|
|
60
61
|
end
|
|
61
62
|
end
|
|
62
63
|
end
|
|
63
64
|
|
|
64
65
|
def export_link(url, texto = '')
|
|
65
|
-
return unless Pundit.policy!(helpers.send(
|
|
66
|
+
return unless Pundit.policy!(helpers.send(PgEngine.configuracion.current_user_method), object).export?
|
|
66
67
|
|
|
67
68
|
helpers.content_tag :span, rel: :tooltip, title: 'Exportar' do
|
|
68
69
|
helpers.content_tag :a, target: '_blank',
|
|
69
|
-
|
|
70
|
+
class: "btn #{_config.clase_botones_chicos} btn-#{_config.boton_export}", href: url_change_format(url, 'xlsx') do
|
|
70
71
|
"#{helpers.content_tag(:span, nil, class: clase_icono('file-earmark-excel-fill'))} #{texto}".html_safe
|
|
71
72
|
end
|
|
72
73
|
end
|
|
73
74
|
end
|
|
74
75
|
|
|
75
76
|
def new_link(options = {})
|
|
76
|
-
return unless Pundit.policy!(helpers.send(
|
|
77
|
+
return unless Pundit.policy!(helpers.send(PgEngine.configuracion.current_user_method), object).new?
|
|
77
78
|
|
|
78
79
|
helpers.content_tag :span, rel: :tooltip, title: 'Crear' do
|
|
79
|
-
helpers.link_to new_object_url, class: "btn #{_config.clase_botones_chicos} btn-primary",
|
|
80
|
+
helpers.link_to new_object_url, class: "btn #{_config.clase_botones_chicos} btn-primary",
|
|
81
|
+
remote: options[:remote] do
|
|
80
82
|
helpers.content_tag(:span, nil,
|
|
81
83
|
class: clase_icono('plus').to_s) + "<span class='d-none d-sm-inline'> Crear #{object.class.nombre_singular.downcase}</span>".html_safe
|
|
82
84
|
end
|
|
@@ -96,25 +98,21 @@ module PgRails
|
|
|
96
98
|
end
|
|
97
99
|
|
|
98
100
|
def target_object
|
|
99
|
-
|
|
101
|
+
pg_namespace.present? ? [pg_namespace, object] : object
|
|
100
102
|
end
|
|
101
103
|
|
|
102
104
|
def target_index
|
|
103
|
-
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def default_module
|
|
107
|
-
nil
|
|
105
|
+
pg_namespace.present? ? [pg_namespace, object.class] : object.class
|
|
108
106
|
end
|
|
109
107
|
|
|
110
108
|
private
|
|
111
109
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
110
|
+
def _config
|
|
111
|
+
PgEngine.configuracion
|
|
112
|
+
end
|
|
115
113
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
114
|
+
def clase_icono(icono)
|
|
115
|
+
"#{_config.sistema_iconos} #{_config.sistema_iconos}-#{icono}"
|
|
116
|
+
end
|
|
119
117
|
end
|
|
120
118
|
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module PgEngine
|
|
2
|
+
module FlashHelper
|
|
3
|
+
def render_turbo_stream_flash_messages
|
|
4
|
+
turbo_stream.prepend 'flash', partial: 'layouts/flash'
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def render_turbo_stream_title
|
|
8
|
+
turbo_stream.update 'title', "#{breadcrumbs.last&.name} - #{Rails.application.class.module_parent_name}"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def flash_type_to_class(flash_type)
|
|
12
|
+
case flash_type
|
|
13
|
+
when 'notice'
|
|
14
|
+
'info'
|
|
15
|
+
when 'error'
|
|
16
|
+
'danger'
|
|
17
|
+
when 'alert'
|
|
18
|
+
'warning'
|
|
19
|
+
when 'success'
|
|
20
|
+
'success'
|
|
21
|
+
else
|
|
22
|
+
flash_type
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module PgEngine
|
|
4
|
+
module FormHelper
|
|
5
|
+
def pg_form_for(object, *args, &)
|
|
6
|
+
if object.is_a? PgEngine::BaseDecorator
|
|
7
|
+
object = object.target_object
|
|
8
|
+
elsif object.is_a?(PgEngine::BaseRecord) &&
|
|
9
|
+
object.decorator_class.present? &&
|
|
10
|
+
object.decorator_class < PgEngine::BaseDecorator
|
|
11
|
+
object = object.decorate.target_object
|
|
12
|
+
end
|
|
13
|
+
# byebug
|
|
14
|
+
options = args.extract_options!
|
|
15
|
+
|
|
16
|
+
options[:builder] = PgFormBuilder
|
|
17
|
+
options[:html] ||= {}
|
|
18
|
+
options[:html][:class] = if options[:html].key?(:class)
|
|
19
|
+
['pg-form', options[:html][:class]].compact
|
|
20
|
+
else
|
|
21
|
+
'pg-form'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
simple_form_for(object, *(args << options), &)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def url_change_format(url, formato)
|
|
28
|
+
uri = URI.parse(url)
|
|
29
|
+
uri.path = "#{uri.path}.#{formato}"
|
|
30
|
+
uri.to_s
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|