pg_rails 7.0.8.pre.alpha.10 → 7.0.8.pre.alpha.12
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/javascript/modal_controller.js +1 -1
- data/pg_engine/app/admin/accounts.rb +1 -4
- data/pg_engine/app/controllers/admin/accounts_controller.rb +4 -4
- data/pg_engine/app/controllers/concerns/pg_engine/resource.rb +2 -0
- data/pg_engine/app/helpers/pg_engine/pg_rails_helper.rb +11 -0
- data/pg_engine/app/helpers/pg_engine/print_helper.rb +2 -2
- data/pg_engine/app/lib/pg_form_builder.rb +21 -0
- data/pg_engine/app/models/account.rb +2 -9
- data/pg_engine/app/models/pg_engine/base_record.rb +3 -3
- data/pg_engine/app/models/user.rb +20 -13
- data/pg_engine/app/models/user_account.rb +4 -12
- data/pg_engine/app/views/admin/accounts/_form.html.slim +0 -1
- data/pg_engine/app/views/pg_engine/base/index.html.slim +1 -1
- data/pg_engine/config/initializers/simple_form_monkey_patch.rb +12 -0
- data/pg_engine/config/locales/es.yml +4 -0
- data/pg_engine/config/simple_form/simple_form_bootstrap.rb +2 -4
- data/pg_engine/db/migrate/20240314114503_remove_hash_ids.rb +5 -0
- data/pg_engine/lib/tasks/auto_anotar_modelos.rake +4 -1
- data/pg_engine/spec/factories/accounts.rb +0 -1
- data/pg_engine/spec/lib/pg_form_builder_spec.rb +14 -0
- data/pg_layout/app/javascript/utils.ts +3 -0
- data/pg_layout/app/views/devise/registrations/new.html.erb +3 -4
- data/pg_layout/app/views/layouts/pg_layout/layout.html.slim +4 -3
- data/pg_layout/app/views/pg_layout/_navbar.html.erb +5 -3
- data/pg_rails/lib/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84eace9e9d023c54401e822df64d253dd94dcdf3831fd19ce1c77bb0ad674541
|
4
|
+
data.tar.gz: 3c1b74610da49e737f4fba5d9b89737a529650831278f95fcfc4c66ebd32a1f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2c350c91dc1f91c4eb6c2b7ad866296d1057c89637ec3b45922ec89a0720d7942a4706a0ab3659adabb34da2a8f681d56367a722b5d7d4f1595210bb3bda12dc
|
7
|
+
data.tar.gz: '0806e415216083b9afe67adb247328764964cd537351a4406e88c7768946b71fe661de0a469f3d61af215d85706312d772e12cf52b03f65c083cb773cf06d687'
|
@@ -1,24 +1,21 @@
|
|
1
1
|
ActiveAdmin.register Account do
|
2
|
-
permit_params :plan, :nombre
|
2
|
+
permit_params :plan, :nombre
|
3
3
|
|
4
4
|
index do
|
5
5
|
selectable_column
|
6
6
|
id_column
|
7
7
|
column :plan
|
8
8
|
column :nombre
|
9
|
-
column :hashid
|
10
9
|
actions
|
11
10
|
end
|
12
11
|
|
13
12
|
filter :plan
|
14
13
|
filter :nombre
|
15
|
-
filter :hashid
|
16
14
|
|
17
15
|
form do |f|
|
18
16
|
f.inputs do
|
19
17
|
f.input :plan
|
20
18
|
f.input :nombre
|
21
|
-
f.input :hashid
|
22
19
|
end
|
23
20
|
f.actions
|
24
21
|
end
|
@@ -15,19 +15,19 @@ module Admin
|
|
15
15
|
private
|
16
16
|
|
17
17
|
def atributos_permitidos
|
18
|
-
%i[plan nombre
|
18
|
+
%i[plan nombre]
|
19
19
|
end
|
20
20
|
|
21
21
|
def atributos_para_buscar
|
22
|
-
%i[plan nombre
|
22
|
+
%i[plan nombre]
|
23
23
|
end
|
24
24
|
|
25
25
|
def atributos_para_listar
|
26
|
-
%i[plan nombre
|
26
|
+
%i[plan nombre]
|
27
27
|
end
|
28
28
|
|
29
29
|
def atributos_para_mostrar
|
30
|
-
%i[plan nombre
|
30
|
+
%i[plan nombre]
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
@@ -210,6 +210,8 @@ module PgEngine
|
|
210
210
|
def buscar_instancia
|
211
211
|
if Object.const_defined?('FriendlyId') && @clase_modelo.is_a?(FriendlyId)
|
212
212
|
@clase_modelo.friendly.find(params[:id])
|
213
|
+
elsif @clase_modelo.respond_to? :find_by_hashid
|
214
|
+
@clase_modelo.find_by!(hashid: params[:id])
|
213
215
|
else
|
214
216
|
@clase_modelo.find(params[:id])
|
215
217
|
end
|
@@ -98,10 +98,10 @@ module PgEngine
|
|
98
98
|
'No'
|
99
99
|
end
|
100
100
|
|
101
|
-
def print_currency(number, simbolo: '$')
|
101
|
+
def print_currency(number, simbolo: '$', precision: nil)
|
102
102
|
return if number.blank?
|
103
103
|
|
104
|
-
precision
|
104
|
+
precision ||= (number % 1).positive? ? 2 : 0
|
105
105
|
"#{simbolo} #{number_with_precision(number, delimiter: '.', separator: ',',
|
106
106
|
precision:)}"
|
107
107
|
end
|
@@ -4,6 +4,27 @@ class PgFormBuilder < SimpleForm::FormBuilder
|
|
4
4
|
include PgAssociable::FormBuilderMethods
|
5
5
|
include PgEngine::ErrorHelper
|
6
6
|
|
7
|
+
def default_prefix(attribute_name)
|
8
|
+
at_name = object.class.human_attribute_name(attribute_name.to_s).downcase
|
9
|
+
"#{articulo(attribute_name)} #{at_name}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def articulo(attribute_name)
|
13
|
+
gender = I18n.t("gender.#{attribute_name}", default: nil)
|
14
|
+
if gender.present?
|
15
|
+
gender == 'f' ? 'La' : 'El'
|
16
|
+
else
|
17
|
+
at_name = object.class.human_attribute_name(attribute_name.to_s).downcase
|
18
|
+
at_name.ends_with?('a') ? 'La' : 'El'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def input(attribute_name, options = {}, &)
|
23
|
+
options[:error_prefix] ||= default_prefix(attribute_name)
|
24
|
+
|
25
|
+
super(attribute_name, options, &)
|
26
|
+
end
|
27
|
+
|
7
28
|
def mensajes_de_error
|
8
29
|
base_errors = object.errors[:base]
|
9
30
|
base_message = (base_errors.map(&:to_s).join('<br>') if base_errors.present?)
|
@@ -6,25 +6,18 @@
|
|
6
6
|
#
|
7
7
|
# id :bigint not null, primary key
|
8
8
|
# discarded_at :datetime
|
9
|
-
# hashid :string
|
10
9
|
# nombre :string not null
|
11
10
|
# plan :integer not null
|
12
11
|
# created_at :datetime not null
|
13
12
|
# updated_at :datetime not null
|
14
|
-
# actualizado_por_id :bigint
|
15
|
-
# creado_por_id :bigint
|
16
|
-
#
|
17
|
-
# Indexes
|
18
|
-
#
|
19
|
-
# index_accounts_on_actualizado_por_id (actualizado_por_id)
|
20
|
-
# index_accounts_on_creado_por_id (creado_por_id)
|
13
|
+
# actualizado_por_id :bigint indexed
|
14
|
+
# creado_por_id :bigint indexed
|
21
15
|
#
|
22
16
|
# Foreign Keys
|
23
17
|
#
|
24
18
|
# fk_rails_... (actualizado_por_id => users.id)
|
25
19
|
# fk_rails_... (creado_por_id => users.id)
|
26
20
|
#
|
27
|
-
# generado con pg_rails
|
28
21
|
|
29
22
|
class Account < ApplicationRecord
|
30
23
|
audited
|
@@ -47,10 +47,10 @@ module PgEngine
|
|
47
47
|
|
48
48
|
def to_s
|
49
49
|
%i[nombre name].each do |campo|
|
50
|
-
return "#{send(campo)} ##{
|
50
|
+
return "#{send(campo)} ##{to_param}" if try(campo).present?
|
51
51
|
end
|
52
|
-
if
|
53
|
-
"#{self.class.nombre_singular} ##{
|
52
|
+
if to_param.present?
|
53
|
+
"#{self.class.nombre_singular} ##{to_param}"
|
54
54
|
else
|
55
55
|
super
|
56
56
|
end
|
@@ -3,41 +3,36 @@
|
|
3
3
|
# Table name: users
|
4
4
|
#
|
5
5
|
# id :bigint not null, primary key
|
6
|
+
# apellido :string not null
|
6
7
|
# confirmation_sent_at :datetime
|
7
|
-
# confirmation_token :string
|
8
|
+
# confirmation_token :string indexed
|
8
9
|
# confirmed_at :datetime
|
9
10
|
# current_sign_in_at :datetime
|
10
11
|
# current_sign_in_ip :string
|
11
12
|
# developer :boolean default(FALSE), not null
|
12
13
|
# discarded_at :datetime
|
13
|
-
# email :string default(""), not null
|
14
|
+
# email :string default(""), not null, indexed
|
14
15
|
# encrypted_password :string default(""), not null
|
15
16
|
# failed_attempts :integer default(0), not null
|
16
17
|
# last_sign_in_at :datetime
|
17
18
|
# last_sign_in_ip :string
|
18
19
|
# locked_at :datetime
|
20
|
+
# nombre :string not null
|
19
21
|
# remember_created_at :datetime
|
20
22
|
# reset_password_sent_at :datetime
|
21
|
-
# reset_password_token :string
|
23
|
+
# reset_password_token :string indexed
|
22
24
|
# sign_in_count :integer default(0), not null
|
23
25
|
# unconfirmed_email :string
|
24
|
-
# unlock_token :string
|
26
|
+
# unlock_token :string indexed
|
25
27
|
# created_at :datetime not null
|
26
28
|
# updated_at :datetime not null
|
27
29
|
#
|
28
|
-
# Indexes
|
29
|
-
#
|
30
|
-
# index_users_on_confirmation_token (confirmation_token) UNIQUE
|
31
|
-
# index_users_on_email (email) UNIQUE
|
32
|
-
# index_users_on_reset_password_token (reset_password_token) UNIQUE
|
33
|
-
# index_users_on_unlock_token (unlock_token) UNIQUE
|
34
|
-
#
|
35
30
|
class User < ApplicationRecord
|
36
31
|
# ApplicationRecord should be defined on Application
|
37
32
|
|
38
33
|
# Include default devise modules. Others available are:
|
39
34
|
devise :database_authenticatable, :registerable,
|
40
|
-
:recoverable, :rememberable,
|
35
|
+
:recoverable, :rememberable,
|
41
36
|
:lockable, :timeoutable, :trackable, :confirmable
|
42
37
|
|
43
38
|
audited
|
@@ -46,7 +41,19 @@ class User < ApplicationRecord
|
|
46
41
|
has_many :user_accounts
|
47
42
|
has_many :accounts, through: :user_accounts
|
48
43
|
|
49
|
-
validates :
|
44
|
+
validates :nombre, :apellido, presence: true
|
45
|
+
|
46
|
+
validates_presence_of :email
|
47
|
+
validates_uniqueness_of :email, message: 'ya pertenece a un usuario'
|
48
|
+
validates_format_of :email, with: /\A[^@\s]+@[^@\s]+\z/
|
49
|
+
validates_presence_of :password, if: :password_required?
|
50
|
+
validates_confirmation_of :password, if: :password_required?, message: 'Las contraseñas no coinciden'
|
51
|
+
validates_length_of :password, if: :password_required?, within: 6..128,
|
52
|
+
message: 'es demasiado corta (6 caracteres mínimo)'
|
53
|
+
|
54
|
+
def password_required?
|
55
|
+
!persisted? || !password.nil? || !password_confirmation.nil?
|
56
|
+
end
|
50
57
|
|
51
58
|
scope :query, ->(param) { where('email ILIKE ?', "%#{param}%") }
|
52
59
|
|
@@ -8,17 +8,10 @@
|
|
8
8
|
# profiles :integer default([]), not null, is an Array
|
9
9
|
# created_at :datetime not null
|
10
10
|
# updated_at :datetime not null
|
11
|
-
# account_id :bigint not null
|
12
|
-
# actualizado_por_id :bigint
|
13
|
-
# creado_por_id :bigint
|
14
|
-
# user_id :bigint not null
|
15
|
-
#
|
16
|
-
# Indexes
|
17
|
-
#
|
18
|
-
# index_user_accounts_on_account_id (account_id)
|
19
|
-
# index_user_accounts_on_actualizado_por_id (actualizado_por_id)
|
20
|
-
# index_user_accounts_on_creado_por_id (creado_por_id)
|
21
|
-
# index_user_accounts_on_user_id (user_id)
|
11
|
+
# account_id :bigint not null, indexed
|
12
|
+
# actualizado_por_id :bigint indexed
|
13
|
+
# creado_por_id :bigint indexed
|
14
|
+
# user_id :bigint not null, indexed
|
22
15
|
#
|
23
16
|
# Foreign Keys
|
24
17
|
#
|
@@ -27,7 +20,6 @@
|
|
27
20
|
# fk_rails_... (creado_por_id => users.id)
|
28
21
|
# fk_rails_... (user_id => users.id)
|
29
22
|
#
|
30
|
-
# generado con pg_rails
|
31
23
|
|
32
24
|
class UserAccount < ApplicationRecord
|
33
25
|
audited
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module SimpleForm
|
2
|
+
module Components
|
3
|
+
module Errors
|
4
|
+
def error_text
|
5
|
+
text = has_custom_error? ? options[:error] : errors.reject(&:empty?).send(error_method)
|
6
|
+
return if text.blank?
|
7
|
+
|
8
|
+
"#{html_escape(options[:error_prefix])} #{html_escape(text)}".lstrip.html_safe
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -56,8 +56,7 @@ SimpleForm.setup do |config|
|
|
56
56
|
b.optional :readonly
|
57
57
|
b.use :label, class: 'form-label'
|
58
58
|
b.use :input, class: 'form-control', error_class: 'is-invalid'
|
59
|
-
b.use :
|
60
|
-
b.optional :error, wrap_with: { class: 'invalid-feedback' }
|
59
|
+
b.use :error, wrap_with: { class: 'invalid-feedback' }
|
61
60
|
b.use :hint, wrap_with: { class: 'form-text' }
|
62
61
|
end
|
63
62
|
|
@@ -66,8 +65,7 @@ SimpleForm.setup do |config|
|
|
66
65
|
b.optional :readonly
|
67
66
|
b.use :label, class: 'form-label'
|
68
67
|
b.use :input, class: 'form-select', error_class: 'is-invalid'
|
69
|
-
b.use :
|
70
|
-
b.optional :error, wrap_with: { class: 'invalid-feedback' }
|
68
|
+
b.use :error, wrap_with: { class: 'invalid-feedback' }
|
71
69
|
b.use :hint, wrap_with: { class: 'form-text' }
|
72
70
|
end
|
73
71
|
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# NOTE: only doing this in development as some production environments (Heroku)
|
2
2
|
# NOTE: are sensitive to local FS writes, and besides -- it's just not proper
|
3
3
|
# NOTE: to have a dev-mode tool do its thing in production.
|
4
|
+
Dotenv.load
|
5
|
+
|
4
6
|
if Rails.env.development?
|
5
7
|
require 'annotate'
|
6
8
|
task :set_annotation_options do
|
@@ -21,7 +23,8 @@ if Rails.env.development?
|
|
21
23
|
'show_complete_foreign_keys' => 'false',
|
22
24
|
'show_indexes' => 'false',
|
23
25
|
'simple_indexes' => 'true',
|
24
|
-
'model_dir' => ['
|
26
|
+
'model_dir' => ENV['MODEL_PATHS'],
|
27
|
+
# 'model_dir' => ['app/models', 'app/overrides'],
|
25
28
|
# 'model_dir' => 'app/models',
|
26
29
|
'root_dir' => '',
|
27
30
|
'include_version' => 'false',
|
@@ -29,4 +29,18 @@ describe PgFormBuilder do
|
|
29
29
|
it { expect(subject).to eq 'Por favor, revisá los campos obligatorios:' }
|
30
30
|
end
|
31
31
|
end
|
32
|
+
|
33
|
+
describe '#default_prefix' do
|
34
|
+
context 'cuando el atributo es masculino' do
|
35
|
+
subject { instancia.default_prefix(:nombre) }
|
36
|
+
|
37
|
+
it { expect(subject).to eq 'El nombre' }
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'cuando el atributo es femenino' do
|
41
|
+
subject { instancia.default_prefix(:fecha) }
|
42
|
+
|
43
|
+
it { expect(subject).to eq 'La fecha' }
|
44
|
+
end
|
45
|
+
end
|
32
46
|
end
|
@@ -3,6 +3,9 @@ export function round (value) {
|
|
3
3
|
}
|
4
4
|
|
5
5
|
export function printCurrency (value, simboloMoneda = '$') {
|
6
|
+
if (typeof value === 'string') {
|
7
|
+
value = parseFloat(value)
|
8
|
+
}
|
6
9
|
const decimals = (value % 1 > 0) ? 2 : 0
|
7
10
|
return simboloMoneda + ' ' + numberWithDots(value.toFixed(decimals).replace('.', ','))
|
8
11
|
}
|
@@ -1,15 +1,14 @@
|
|
1
1
|
<h2><%= t(".sign_up") %></h2>
|
2
2
|
|
3
3
|
<%= pg_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
|
4
|
-
<%= f.
|
4
|
+
<%= f.mensajes_de_error %>
|
5
5
|
|
6
6
|
<div class="form-inputs">
|
7
|
+
<%= f.input :nombre, required: true, autofocus: true %>
|
8
|
+
<%= f.input :apellido, required: true %>
|
7
9
|
<%= f.input :email,
|
8
10
|
required: true,
|
9
|
-
autofocus: true ,
|
10
11
|
input_html: { autocomplete: "email" }%>
|
11
|
-
<%= f.input :nombre, required: true %>
|
12
|
-
<%= f.input :apellido, required: true %>
|
13
12
|
<%= f.input :password,
|
14
13
|
required: true,
|
15
14
|
hint: (t('devise.shared.minimum_password_length', count: @minimum_password_length) if @minimum_password_length),
|
@@ -14,15 +14,16 @@ html
|
|
14
14
|
= stylesheet_link_tag 'application', 'data-turbo-track': 'reload'
|
15
15
|
= javascript_include_tag 'application', 'data-turbo-track': 'reload', type: 'module'
|
16
16
|
body
|
17
|
-
|
18
|
-
|
17
|
+
div class="#{ @sidebar == false ? '' : 'with-sidebar' }"
|
18
|
+
- unless @sidebar == false
|
19
|
+
= render partial: 'pg_layout/sidebar'
|
19
20
|
div
|
20
21
|
.position-relative.d-flex.justify-content-around
|
21
22
|
#flash.flash.position-absolute.z-1.mt-1
|
22
23
|
= render partial: 'pg_layout/flash'
|
23
24
|
= render partial: 'pg_layout/navbar'
|
24
25
|
div
|
25
|
-
- if user_signed_in?
|
26
|
+
- if user_signed_in? && @breadcrumb != false
|
26
27
|
.d-flex.align-items-center.justify-content-between.px-3.py-1.d-print-none[
|
27
28
|
style="min-height: 2.5em;"]
|
28
29
|
nav aria-label="breadcrumb"
|
@@ -1,8 +1,10 @@
|
|
1
1
|
<nav class="navbar navbar-expand-<%= @breakpoint_navbar_expand %> bg-light">
|
2
2
|
<div class="container-fluid">
|
3
|
-
|
4
|
-
<
|
5
|
-
|
3
|
+
<% unless @sidebar == false %>
|
4
|
+
<button data-controller="navbar" data-action="navbar#expandNavbar" class="btn btn-outline-primary me-2 d-none d-<%= @breakpoint_navbar_expand %>-inline-block">
|
5
|
+
<i class="bi bi-list"></i>
|
6
|
+
</button>
|
7
|
+
<% end %>
|
6
8
|
<!-- <a class="navbar-brand" href="#">Navbar</a> -->
|
7
9
|
<button class="navbar-toggler btn btn-outline-primary me-2" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
8
10
|
<i class="bi bi-list"></i>
|
data/pg_rails/lib/version.rb
CHANGED
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.
|
4
|
+
version: 7.0.8.pre.alpha.12
|
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-03-
|
11
|
+
date: 2024-03-14 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Rails goodies.
|
14
14
|
email:
|
@@ -53,6 +53,7 @@ files:
|
|
53
53
|
- pg_engine/app/helpers/pg_engine/flash_helper.rb
|
54
54
|
- pg_engine/app/helpers/pg_engine/form_helper.rb
|
55
55
|
- pg_engine/app/helpers/pg_engine/index_helper.rb
|
56
|
+
- pg_engine/app/helpers/pg_engine/pg_rails_helper.rb
|
56
57
|
- pg_engine/app/helpers/pg_engine/postgres_helper.rb
|
57
58
|
- pg_engine/app/helpers/pg_engine/print_helper.rb
|
58
59
|
- pg_engine/app/helpers/pg_engine/route_helper.rb
|
@@ -89,6 +90,7 @@ files:
|
|
89
90
|
- pg_engine/app/views/pg_engine/base/new.html.slim
|
90
91
|
- pg_engine/config/initializers/active_admin.rb
|
91
92
|
- pg_engine/config/initializers/devise.rb
|
93
|
+
- pg_engine/config/initializers/simple_form_monkey_patch.rb
|
92
94
|
- pg_engine/config/locales/devise.en.yml
|
93
95
|
- pg_engine/config/locales/es.yml
|
94
96
|
- pg_engine/config/routes.rb
|
@@ -102,6 +104,7 @@ files:
|
|
102
104
|
- pg_engine/db/migrate/20240211153049_create_user_accounts.rb
|
103
105
|
- pg_engine/db/migrate/20240222115722_create_active_storage_tables.active_storage.rb
|
104
106
|
- pg_engine/db/migrate/20240305200900_nombre_user.rb
|
107
|
+
- pg_engine/db/migrate/20240314114503_remove_hash_ids.rb
|
105
108
|
- pg_engine/db/seeds.rb
|
106
109
|
- pg_engine/lib/pg_engine.rb
|
107
110
|
- pg_engine/lib/pg_engine/configuracion.rb
|