pg_rails 7.0.8.pre.alpha.8 → 7.0.8.pre.alpha.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -0
  3. data/pg_engine/app/controllers/admin/users_controller.rb +16 -4
  4. data/pg_engine/app/controllers/{pg_engine/resource_helper.rb → concerns/pg_engine/resource.rb} +1 -1
  5. data/pg_engine/app/controllers/pg_engine/base_controller.rb +2 -2
  6. data/pg_engine/app/controllers/pg_engine/devise_controller.rb +16 -3
  7. data/pg_engine/app/helpers/pg_engine/print_helper.rb +4 -3
  8. data/pg_engine/app/lib/pg_engine/error_helper.rb +37 -0
  9. data/pg_engine/app/lib/pg_form_builder.rb +18 -3
  10. data/pg_engine/app/models/pg_engine/base_record.rb +12 -0
  11. data/pg_engine/app/models/user.rb +7 -4
  12. data/pg_engine/app/views/pg_engine/base/edit.html.slim +5 -0
  13. data/pg_engine/app/views/pg_engine/base/new.html.slim +5 -0
  14. data/pg_engine/config/locales/es.yml +4 -10
  15. data/pg_engine/config/routes.rb +1 -0
  16. data/pg_engine/config/simple_form/simple_form_bootstrap.rb +3 -1
  17. data/pg_engine/db/migrate/20240305200900_nombre_user.rb +6 -0
  18. data/pg_engine/db/seeds.rb +1 -1
  19. data/pg_engine/lib/pg_engine/engine.rb +12 -8
  20. data/pg_engine/lib/tasks/auto_anotar_modelos.rake +4 -3
  21. data/pg_engine/spec/controllers/concerns/pg_engine/error_helper_spec.rb +62 -0
  22. data/pg_engine/spec/controllers/devise/registrations_controller_spec.rb +33 -0
  23. data/pg_engine/spec/controllers/devise/sessions_controller_spec.rb +18 -0
  24. data/pg_engine/spec/factories/users.rb +2 -0
  25. data/pg_engine/spec/lib/pg_form_builder_spec.rb +32 -0
  26. data/pg_engine/spec/models/pg_engine/base_record_spec.rb +15 -0
  27. data/pg_layout/app/javascript/utils.ts +3 -21
  28. data/pg_layout/app/lib/navbar.rb +13 -3
  29. data/pg_layout/app/views/devise/registrations/edit.html.erb +2 -0
  30. data/pg_layout/app/views/devise/registrations/new.html.erb +2 -0
  31. data/pg_layout/app/views/devise/sessions/new.html.erb +11 -0
  32. data/pg_layout/app/views/pg_layout/_flash.html.slim +2 -1
  33. data/pg_layout/app/views/pg_layout/_navbar.html.erb +13 -2
  34. data/pg_rails/lib/version.rb +1 -1
  35. data/pg_scaffold/lib/generators/pg_slim/pg_slim_generator.rb +2 -2
  36. data/pg_scaffold/lib/generators/pg_slim/templates/_form.html.slim +1 -1
  37. metadata +12 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8b3571f15d522de34ce58f735dd40b7dd3b44bc2f8292233dbcc5e451dd49f7a
4
- data.tar.gz: 315e2de0d4c61085eaf12fb48bc2298d928e1909c2546a9bfda57e8e3e9c88ed
3
+ metadata.gz: d3efd952ef548d103ed1c4aea21b903f039792ed601fc66e93fb5b84dce4d39d
4
+ data.tar.gz: 148ae25de52ab06846c1b7b313f6f87db0d6d6ba502a9186104559e0e37ec114
5
5
  SHA512:
6
- metadata.gz: 305ac09bdf7ac2a6172f71979253e8dbf90123d5c4218d5ffda7ab7a035052271ea9c6c9f3f182a7b76064075294ba2e71e3b157b49461753b954a762f9d1de4
7
- data.tar.gz: 7d4744860de97968cd3e67710bd859a64e4610dcca69439daba8a05422fd6b8d092fbf56ef55eddee79aacc9a43154d7545b481bde7060c492694bdefebfb843
6
+ metadata.gz: 68b63352e0ac30ff6f3c7a22e3a2fb73f8918ee91dfefe51b2c8371915c9d7adde99eb114c1ba935387182fa10966d0c5776c672e477486cff17a82993ff68fb
7
+ data.tar.gz: 1fda6ee9f5416f813e811268f307b87638b69de4a3db4659a7259c6101dc6b8281d9b351e92998e517a0d492cc39eea71780add28b2c240c4971aa26f87a2000
data/README.md CHANGED
@@ -89,3 +89,5 @@ be rails pg_engine_engine:install:migrations
89
89
 
90
90
  ruby-vips
91
91
  pdftoppm
92
+
93
+ atributos no pueden terminar en _text
@@ -26,22 +26,34 @@ module Admin
26
26
  pg_respond_update
27
27
  end
28
28
 
29
+ skip_before_action :authenticate_user!, only: [:login_as]
30
+
31
+ # :nocov:
32
+ def login_as
33
+ if current_user&.developer? || Rails.env.development?
34
+ usuario = User.find(params[:id])
35
+ sign_in(:user, usuario)
36
+ end
37
+ redirect_to '/'
38
+ end
39
+ # :nocov:
40
+
29
41
  private
30
42
 
31
43
  def atributos_permitidos
32
- %i[email password developer]
44
+ %i[email nombre apellido password developer]
33
45
  end
34
46
 
35
47
  def atributos_para_buscar
36
- %i[email developer]
48
+ %i[email nombre apellido developer]
37
49
  end
38
50
 
39
51
  def atributos_para_listar
40
- %i[email developer]
52
+ %i[email nombre apellido developer]
41
53
  end
42
54
 
43
55
  def atributos_para_mostrar
44
- %i[email developer]
56
+ %i[email nombre apellido developer]
45
57
  end
46
58
  end
47
59
  end
@@ -1,5 +1,5 @@
1
1
  module PgEngine
2
- module ResourceHelper
2
+ module Resource
3
3
  def self.included(clazz)
4
4
  clazz.before_action :authenticate_user!
5
5
  clazz.helper_method :atributos_para_listar
@@ -74,8 +74,8 @@ module PgEngine
74
74
  end
75
75
  end
76
76
 
77
- def go_back(message)
78
- flash[:alert] = message
77
+ def go_back(message = nil, type: :alert)
78
+ flash[type] = message if message.present?
79
79
  redirect_back fallback_location: root_path
80
80
  end
81
81
  end
@@ -1,9 +1,22 @@
1
1
  module PgEngine
2
2
  class DeviseController < ApplicationController
3
- layout 'pg_layout/devise'
3
+ before_action :configure_permitted_parameters
4
4
 
5
- before_action do
6
- render(layout: 'pg_layout/layout') if controller_name == 'registrations' && action_name == 'edit'
5
+ layout :layout_by_resource
6
+
7
+ def layout_by_resource
8
+ if controller_name == 'registrations' && action_name.in?(%w[edit update])
9
+ 'pg_layout/layout'
10
+ else
11
+ 'pg_layout/devise'
12
+ end
13
+ end
14
+
15
+ protected
16
+
17
+ def configure_permitted_parameters
18
+ devise_parameter_sanitizer.permit(:sign_up, keys: %i[nombre apellido])
19
+ devise_parameter_sanitizer.permit(:account_update, keys: %i[nombre apellido])
7
20
  end
8
21
  end
9
22
  end
@@ -98,11 +98,12 @@ module PgEngine
98
98
  'No'
99
99
  end
100
100
 
101
- def print_currency(number, moneda = 'pesos')
101
+ def print_currency(number, simbolo: '$')
102
102
  return if number.blank?
103
103
 
104
- "#{simbolo_moneda(moneda)} #{number_with_precision(number, delimiter: '.', separator: ',',
105
- precision: 2)}"
104
+ precision = (number % 1).positive? ? 2 : 0
105
+ "#{simbolo} #{number_with_precision(number, delimiter: '.', separator: ',',
106
+ precision:)}"
106
107
  end
107
108
 
108
109
  def simbolo_moneda(moneda)
@@ -0,0 +1,37 @@
1
+ module PgEngine
2
+ module ErrorHelper
3
+ extend ActiveSupport::Concern
4
+
5
+ def merge_association_errors(object, details, assoc_key)
6
+ details = details.except(assoc_key)
7
+ assoc_items = object.send(assoc_key).map(&:errors).map(&:details)
8
+ merged = assoc_items.inject({}) { |acc, el| acc.merge(el) }
9
+ merged = merged.transform_values { |errs| errs.pluck(:error) }
10
+ details.merge(merged)
11
+ end
12
+
13
+ def error_types(object, associations: [])
14
+ details = object.errors.details.transform_values do |errs|
15
+ errs.pluck(:error)
16
+ end
17
+ associations.each do |assoc_key|
18
+ next unless details.key? assoc_key
19
+
20
+ details = merge_association_errors(object, details, assoc_key)
21
+ end
22
+ details.values.flatten.uniq
23
+ end
24
+
25
+ def error_message_for(object, associations: [])
26
+ types = error_types(object, associations:)
27
+
28
+ if types == [:blank]
29
+ :only_presence_errors
30
+ elsif types.include? :blank
31
+ :multiple_error_types
32
+ elsif types.present?
33
+ :not_presence_errors
34
+ end
35
+ end
36
+ end
37
+ end
@@ -2,12 +2,27 @@
2
2
 
3
3
  class PgFormBuilder < SimpleForm::FormBuilder
4
4
  include PgAssociable::FormBuilderMethods
5
+ include PgEngine::ErrorHelper
5
6
 
6
7
  def mensajes_de_error
7
- errors_to_show = object.errors[:base]
8
- message = (errors_to_show.map(&:to_s).join('<br>') if errors_to_show.present?)
8
+ base_errors = object.errors[:base]
9
+ base_message = (base_errors.map(&:to_s).join('<br>') if base_errors.present?)
10
+ title = error_notification(message: mensaje, class: 'text-danger mb-2') if mensaje
11
+ base_tag = error_notification(message: base_message, class: 'alert alert-danger') if base_message
12
+ (title || '') + (base_tag || '')
13
+ end
14
+
15
+ def mensaje
16
+ scope = error_message_for(object, associations:)
17
+ return if scope.blank?
18
+
19
+ I18n.t("simple_form.error_notification.#{scope}")
20
+ end
9
21
 
10
- error_notification(message:)
22
+ def associations
23
+ object.class.reflect_on_all_associations
24
+ .select { |a| a.instance_of? ActiveRecord::Reflection::HasManyReflection }
25
+ .map(&:name)
11
26
  end
12
27
 
13
28
  map_type :date, to: PgEngine::FechaInput
@@ -33,6 +33,18 @@ module PgEngine
33
33
  model_name.human(count: 1)
34
34
  end
35
35
 
36
+ def self.human_attribute_name(attribute, options = {})
37
+ if attribute.to_s.ends_with?('_text')
38
+ # Si es un enumerized
39
+ super(attribute[0..-6], options)
40
+ elsif attribute.to_s.ends_with?('_f')
41
+ # Si es un decorated method
42
+ super(attribute[0..-3], options)
43
+ else
44
+ super(attribute, options)
45
+ end
46
+ end
47
+
36
48
  def to_s
37
49
  %i[nombre name].each do |campo|
38
50
  return "#{send(campo)} ##{id}" if try(campo).present?
@@ -36,10 +36,9 @@ class User < ApplicationRecord
36
36
  # ApplicationRecord should be defined on Application
37
37
 
38
38
  # Include default devise modules. Others available are:
39
- # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
40
39
  devise :database_authenticatable, :registerable,
41
40
  :recoverable, :rememberable, :validatable,
42
- :confirmable, :lockable, :timeoutable, :trackable
41
+ :lockable, :timeoutable, :trackable, :confirmable
43
42
 
44
43
  audited
45
44
  include Discard::Model
@@ -47,12 +46,16 @@ class User < ApplicationRecord
47
46
  has_many :user_accounts
48
47
  has_many :accounts, through: :user_accounts
49
48
 
50
- validates :email, presence: true
49
+ validates :email, :nombre, :apellido, presence: true
51
50
 
52
51
  scope :query, ->(param) { where('email ILIKE ?', "%#{param}%") }
53
52
 
54
53
  def to_s
55
- email
54
+ nombre_completo
55
+ end
56
+
57
+ def nombre_completo
58
+ "#{nombre} #{apellido}"
56
59
  end
57
60
 
58
61
  def current_account
@@ -0,0 +1,5 @@
1
+ - content_for :title do
2
+ | Modificar #{@clase_modelo.nombre_singular.downcase}
3
+
4
+ .p-3
5
+ = render 'form'
@@ -0,0 +1,5 @@
1
+ - content_for :title do
2
+ | Crear #{@clase_modelo.nombre_singular.downcase}
3
+
4
+ .p-3
5
+ = render 'form'
@@ -7,15 +7,6 @@ es:
7
7
  creado_por: Creado por
8
8
  ancestry:
9
9
  exclude_self: No puede ser hijx de si mismx
10
- simple_form:
11
- # labels:
12
- # user:
13
- # username: 'User name'
14
- # password: 'Password'
15
- # hints:
16
- error_notification:
17
- default_message: "hubo algunos errores:"
18
-
19
10
  simple_form:
20
11
  "yes": 'Sí'
21
12
  "no": 'No'
@@ -26,7 +17,10 @@ es:
26
17
  # When using html, text and mark won't be used.
27
18
  # html: '<abbr title="required">*</abbr>'
28
19
  error_notification:
29
- default_message: "Por favor, revisá los errores debajo:"
20
+ default_message: "Por favor, revisá los siguientes errores:"
21
+ not_presence_errors: "Por favor, revisá los siguientes errores:"
22
+ only_presence_errors: 'Por favor, revisá los campos obligatorios:'
23
+ multiple_error_types: 'Por favor, revisá los campos obligatorios y otros errores:'
30
24
  # Examples
31
25
  # labels:
32
26
  # defaults:
@@ -6,6 +6,7 @@ Rails.application.routes.draw do
6
6
  pg_resource(:users)
7
7
  pg_resource(:accounts)
8
8
  pg_resource(:user_accounts)
9
+ get 'login_as', to: 'users#login_as'
9
10
  end
10
11
  ActiveAdmin.routes(self)
11
12
  end
@@ -32,7 +32,7 @@ SimpleForm.setup do |config|
32
32
  config.include_default_input_wrapper_class = false
33
33
 
34
34
  # CSS class to add for error notification helper.
35
- config.error_notification_class = 'alert alert-danger'
35
+ config.error_notification_class = ''
36
36
 
37
37
  # Method used to tidy up errors. Specify any Rails Array method.
38
38
  # :first lists the first message for each field.
@@ -57,6 +57,7 @@ SimpleForm.setup do |config|
57
57
  b.use :label, class: 'form-label'
58
58
  b.use :input, class: 'form-control', error_class: 'is-invalid'
59
59
  b.use :full_error, wrap_with: { class: 'invalid-feedback' }
60
+ b.optional :error, wrap_with: { class: 'invalid-feedback' }
60
61
  b.use :hint, wrap_with: { class: 'form-text' }
61
62
  end
62
63
 
@@ -66,6 +67,7 @@ SimpleForm.setup do |config|
66
67
  b.use :label, class: 'form-label'
67
68
  b.use :input, class: 'form-select', error_class: 'is-invalid'
68
69
  b.use :full_error, wrap_with: { class: 'invalid-feedback' }
70
+ b.optional :error, wrap_with: { class: 'invalid-feedback' }
69
71
  b.use :hint, wrap_with: { class: 'form-text' }
70
72
  end
71
73
 
@@ -0,0 +1,6 @@
1
+ class NombreUser < ActiveRecord::Migration[7.1]
2
+ def change
3
+ add_column :users, :nombre, :string, null: false
4
+ add_column :users, :apellido, :string, null: false
5
+ end
6
+ end
@@ -3,6 +3,6 @@ DatabaseCleaner.clean_with(:truncation, except: %w(ar_internal_metadata users ac
3
3
  MAIL = 'mrosso10@gmail.com'
4
4
 
5
5
  unless User.where(email: MAIL).exists?
6
- FactoryBot.create :user, email: MAIL, password: 'admin123',
6
+ FactoryBot.create :user, email: MAIL, nombre: 'Martín', apellido: 'Rosso', password: 'admin123',
7
7
  confirmed_at: Time.now, developer: true
8
8
  end
@@ -47,16 +47,20 @@ module PgEngine
47
47
  initializer 'byebug_bullet' do
48
48
  if Rails.env.local?
49
49
  # Byebug
50
- require 'byebug/core'
51
- begin
52
- Byebug.start_server 'localhost', ENV.fetch('BYEBUG_SERVER_PORT', 8989).to_i
53
- if ENV.fetch('SLEEP_AFTER_BYEBUG', false)
54
- puts 'waiting 3 secs after starting byebug server for connections'
55
- sleep 3
50
+ # :nocov:
51
+ if ENV['RUBY_DEBUG_OPEN']
52
+ require 'byebug/core'
53
+ begin
54
+ Byebug.start_server 'localhost', ENV.fetch('BYEBUG_SERVER_PORT', 8989).to_i
55
+ if ENV.fetch('SLEEP_AFTER_BYEBUG', false)
56
+ puts 'waiting 3 secs after starting byebug server for connections'
57
+ sleep 3
58
+ end
59
+ rescue Errno::EADDRINUSE
60
+ Rails.logger.debug 'Byebug server already running'
56
61
  end
57
- rescue Errno::EADDRINUSE
58
- Rails.logger.debug 'Byebug server already running'
59
62
  end
63
+ # :nocov:
60
64
 
61
65
  # Bullet
62
66
  Bullet.enable = true
@@ -19,9 +19,10 @@ if Rails.env.development?
19
19
  'position_in_serializer' => 'before',
20
20
  'show_foreign_keys' => 'true',
21
21
  'show_complete_foreign_keys' => 'false',
22
- 'show_indexes' => 'true',
23
- 'simple_indexes' => 'false',
24
- 'model_dir' => 'app/models',
22
+ 'show_indexes' => 'false',
23
+ 'simple_indexes' => 'true',
24
+ 'model_dir' => ['app/models', 'app/overrides'],
25
+ # 'model_dir' => 'app/models',
25
26
  'root_dir' => '',
26
27
  'include_version' => 'false',
27
28
  'require' => '',
@@ -0,0 +1,62 @@
1
+ require 'rails_helper'
2
+
3
+ describe PgEngine::ErrorHelper do
4
+ let(:dummy) { Class.new { include PgEngine::ErrorHelper }.new }
5
+
6
+ describe '#error_message_for' do
7
+ subject do
8
+ categoria.validate
9
+ dummy.error_message_for(categoria, associations: [:cosas])
10
+ end
11
+
12
+ let!(:categoria) { create :categoria_de_cosa }
13
+
14
+ before { create_list :cosa, 2, categoria_de_cosa: categoria }
15
+
16
+ it do
17
+ expect(subject).to be_nil
18
+ end
19
+
20
+ context 'cuando solo tiene errores de presencia' do
21
+ before do
22
+ categoria.nombre = nil
23
+ end
24
+
25
+ it do
26
+ expect(subject).to eq :only_presence_errors
27
+ end
28
+ end
29
+
30
+ context 'cuando solo tiene otros errores' do
31
+ before do
32
+ categoria.validate_aux = true
33
+ end
34
+
35
+ it do
36
+ expect(subject).to eq :not_presence_errors
37
+ end
38
+ end
39
+
40
+ context 'cuando tiene multiples errores' do
41
+ before do
42
+ categoria.validate_aux = true
43
+ categoria.nombre = nil
44
+ end
45
+
46
+ it do
47
+ expect(subject).to eq :multiple_error_types
48
+ end
49
+ end
50
+
51
+ context 'cuando tiene errores anidados' do
52
+ before do
53
+ categoria.reload
54
+ categoria.cosas[0].nombre = nil
55
+ end
56
+
57
+ it do
58
+ expect(subject).to eq :only_presence_errors
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,33 @@
1
+ require 'rails_helper'
2
+
3
+ describe Devise::RegistrationsController do
4
+ before do
5
+ # rubocop:disable RSpec/InstanceVariable
6
+ @request.env['devise.mapping'] = Devise.mappings[:user]
7
+ # rubocop:enable RSpec/InstanceVariable
8
+ end
9
+
10
+ describe '#new' do
11
+ subject { get :new }
12
+
13
+ it do
14
+ subject
15
+ expect(response).to have_http_status(:ok)
16
+ end
17
+ end
18
+
19
+ describe '#edit' do
20
+ subject { get :edit }
21
+
22
+ let(:logger_user) { create :user, :admin }
23
+
24
+ before do
25
+ sign_in logger_user
26
+ end
27
+
28
+ it do
29
+ subject
30
+ expect(response).to have_http_status(:ok)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,18 @@
1
+ require 'rails_helper'
2
+
3
+ describe Devise::SessionsController do
4
+ before do
5
+ # rubocop:disable RSpec/InstanceVariable
6
+ @request.env['devise.mapping'] = Devise.mappings[:user]
7
+ # rubocop:enable RSpec/InstanceVariable
8
+ end
9
+
10
+ describe '#new' do
11
+ subject { get :new }
12
+
13
+ it do
14
+ subject
15
+ expect(response).to have_http_status(:ok)
16
+ end
17
+ end
18
+ end
@@ -37,6 +37,8 @@
37
37
 
38
38
  FactoryBot.define do
39
39
  factory :orphan_user, class: 'User' do
40
+ nombre { Faker::Name.name }
41
+ apellido { Faker::Name.name }
40
42
  email { Faker::Internet.email }
41
43
  password { "password#{rand(99_999)}" }
42
44
  confirmed_at { Faker::Date.backward }
@@ -0,0 +1,32 @@
1
+ require 'rails_helper'
2
+
3
+ describe PgFormBuilder do
4
+ let(:categoria) { create :categoria_de_cosa }
5
+ let(:template) { double }
6
+ let(:instancia) { described_class.new('bla', categoria, template, {}) }
7
+
8
+ before { create_list :cosa, 2, categoria_de_cosa: categoria }
9
+
10
+ describe '#mensaje' do
11
+ subject { instancia.mensaje }
12
+
13
+ context 'cuando solo tiene errores de presencia' do
14
+ before do
15
+ categoria.nombre = nil
16
+ categoria.validate
17
+ end
18
+
19
+ it { expect(subject).to eq 'Por favor, revisá los campos obligatorios:' }
20
+ end
21
+
22
+ context 'cuando solo tiene errores de presencia en nested' do
23
+ before do
24
+ categoria.reload
25
+ categoria.cosas[0].nombre = nil
26
+ categoria.validate
27
+ end
28
+
29
+ it { expect(subject).to eq 'Por favor, revisá los campos obligatorios:' }
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,15 @@
1
+ require 'rails_helper'
2
+
3
+ describe PgEngine::BaseRecord do
4
+ describe '#human_attribute_name' do
5
+ it do
6
+ obj = described_class.human_attribute_name('bla_text')
7
+ expect(obj).to eq described_class.human_attribute_name('bla')
8
+ end
9
+
10
+ it do
11
+ obj = described_class.human_attribute_name('bla_f')
12
+ expect(obj).to eq described_class.human_attribute_name('bla')
13
+ end
14
+ end
15
+ end
@@ -2,33 +2,15 @@ export function round (value) {
2
2
  return Math.round(value * 100) / 100
3
3
  }
4
4
 
5
- export function printCurrency (value, moneda) {
6
- return monedaSimbolo(moneda) + numberWithDots(round(value).toFixed(2).replace('.', ','))
5
+ export function printCurrency (value, simboloMoneda = '$') {
6
+ const decimals = (value % 1 > 0) ? 2 : 0
7
+ return simboloMoneda + ' ' + numberWithDots(value.toFixed(decimals).replace('.', ','))
7
8
  }
8
9
 
9
10
  export function showPercentage (value) {
10
11
  return '% ' + value
11
12
  }
12
13
 
13
- export function monedaSimbolo (moneda) {
14
- switch (moneda) {
15
- case 'pesos':
16
- return '$ '
17
- case 'dolares':
18
- return 'U$S '
19
- case 'euros':
20
- return '€ '
21
- case 'reales':
22
- return 'R$ '
23
- case 'pesos_chilenos':
24
- return 'CLP '
25
- case 'pesos_mexicanos':
26
- return 'MXN '
27
- default:
28
- return '$ '
29
- }
30
- }
31
-
32
14
  export function numberWithDots (x) {
33
15
  return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.')
34
16
  }
@@ -5,15 +5,25 @@ class Navbar
5
5
  @user = user
6
6
  end
7
7
 
8
+ def topbar
9
+ bar('topbar')
10
+ end
11
+
8
12
  def sidebar
13
+ bar('sidebar')
14
+ end
15
+
16
+ def bar(key)
9
17
  yaml_data = YAML.load_file("#{Rails.application.root}/config/pg_rails.yml")
10
- sidebar = ActiveSupport::HashWithIndifferentAccess.new(yaml_data)['sidebar']
18
+ bar_data = ActiveSupport::HashWithIndifferentAccess.new(yaml_data)[key]
19
+ return [] if bar_data.blank?
20
+
11
21
  # rubocop:disable Security/Eval
12
- sidebar.map do |item|
22
+ bar_data.map do |item|
13
23
  {
14
24
  title: item['name'],
15
25
  path: eval(item['path']),
16
- show: true
26
+ show: item['policy'] ? eval(item['policy']) : true
17
27
  }
18
28
  end
19
29
  # rubocop:enable Security/Eval
@@ -5,6 +5,8 @@
5
5
 
6
6
  <div class="form-inputs">
7
7
  <%= f.input :email, required: true, autofocus: true %>
8
+ <%= f.input :nombre, required: true %>
9
+ <%= f.input :apellido, required: true %>
8
10
 
9
11
  <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
10
12
  <p><%= t(".currently_waiting_confirmation_for_email", email: resource.unconfirmed_email) %></p>
@@ -8,6 +8,8 @@
8
8
  required: true,
9
9
  autofocus: true ,
10
10
  input_html: { autocomplete: "email" }%>
11
+ <%= f.input :nombre, required: true %>
12
+ <%= f.input :apellido, required: true %>
11
13
  <%= f.input :password,
12
14
  required: true,
13
15
  hint: (t('devise.shared.minimum_password_length', count: @minimum_password_length) if @minimum_password_length),
@@ -18,3 +18,14 @@
18
18
  <% end %>
19
19
 
20
20
  <%= render "devise/shared/links" %>
21
+
22
+ <% if Rails.env.development? %>
23
+ <br>
24
+ <br>
25
+ <br>
26
+ <ul>
27
+ <% User.all.each do |user| %>
28
+ <li><%= link_to user, admin_login_as_path(id: user.id) %></li>
29
+ <% end %>
30
+ </ul>
31
+ <% end %>
@@ -3,8 +3,9 @@
3
3
  - flash_to_show = flash.select { |flash_message| flash_message[0].to_sym.in? ApplicationController._flash_types }
4
4
  / slim-lint:enable LineLength
5
5
 
6
+ / TODO: data-turbo-temporary, setear al activar toast?
6
7
  - flash_to_show.each do |flash_type, message|
7
8
  .toast(class="bg-#{flash_type_to_class(flash_type)}-subtle" role="alert" data-bs-autohide="true"
8
- data-turbo-temporary="true" aria-live="assertive" aria-atomic="true")
9
+ data-xturbo-temporary="true" aria-live="assertive" aria-atomic="true")
9
10
  .toast-body
10
11
  = message
@@ -9,16 +9,25 @@
9
9
  <!-- <span class="navbar-toggler-icon"></span> -->
10
10
  </button>
11
11
  <div class="collapse navbar-collapse" id="navbarSupportedContent">
12
- <ul class="navbar-nav me-auto mb-2 mb-lg-0">
12
+ <ul class="navbar-nav xme-auto mb-2 mb-lg-0">
13
13
  <% if user_signed_in? %>
14
14
  <li class="nav-item dropdown">
15
15
  <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
16
- <%= current_user.email %>
16
+ <%= current_user %>
17
17
  </a>
18
18
  <ul class="dropdown-menu">
19
19
  <li>
20
20
  <%= link_to "Mi perfil", edit_user_registration_path, class: 'dropdown-item' %>
21
21
  </li>
22
+ <% @navbar.topbar.each do |entry| %>
23
+ <% next if @navbar.hide_entry?(entry) %>
24
+ <li>
25
+ <a class="dropdown-item" href="<%= entry[:path] %>">
26
+ <%= entry[:title] %>
27
+ </a>
28
+ </li>
29
+ <% end %>
30
+
22
31
  <li>
23
32
  <%= link_to "Cerrar sesión", destroy_user_session_path, data: { 'turbo-method': 'delete' }, class: 'dropdown-item' %>
24
33
  </li>
@@ -40,6 +49,8 @@
40
49
  </li>
41
50
  <% end %>
42
51
  </ul>
52
+ <%= content_for :navbar_ext %>
53
+
43
54
  </div>
44
55
  </div>
45
56
  </nav>
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PgRails
4
- VERSION = '7.0.8-alpha.8'
4
+ VERSION = '7.0.8-alpha.10'
5
5
  end
@@ -23,9 +23,9 @@ class PgSlimGenerator < Slim::Generators::ScaffoldGenerator
23
23
 
24
24
  def available_views
25
25
  if options[:index_file]
26
- %w[index edit show new _form]
26
+ %w[index show _form]
27
27
  else
28
- %w[edit show new _form]
28
+ %w[show _form]
29
29
  end
30
30
  end
31
31
  end
@@ -1,7 +1,7 @@
1
1
  / # locals: (object: nil, asociable: false)
2
2
 
3
3
  div style="max-width: 22em" data-controller="pg_form"
4
- = pg_form_for(@<%= singular_name %> || object, asociable:)) do |f|
4
+ = pg_form_for(@<%= singular_name %> || object, asociable:) do |f|
5
5
  = f.mensajes_de_error
6
6
 
7
7
  = hidden_field_tag :asociable, true if asociable
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.8
4
+ version: 7.0.8.pre.alpha.10
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-02-28 00:00:00.000000000 Z
11
+ date: 2024-03-05 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Rails goodies.
14
14
  email:
@@ -42,10 +42,10 @@ files:
42
42
  - pg_engine/app/controllers/admin/accounts_controller.rb
43
43
  - pg_engine/app/controllers/admin/user_accounts_controller.rb
44
44
  - pg_engine/app/controllers/admin/users_controller.rb
45
+ - pg_engine/app/controllers/concerns/pg_engine/resource.rb
45
46
  - pg_engine/app/controllers/pg_engine/base_controller.rb
46
47
  - pg_engine/app/controllers/pg_engine/devise_controller.rb
47
48
  - pg_engine/app/controllers/pg_engine/require_sign_in.rb
48
- - pg_engine/app/controllers/pg_engine/resource_helper.rb
49
49
  - pg_engine/app/decorators/account_decorator.rb
50
50
  - pg_engine/app/decorators/pg_engine/base_decorator.rb
51
51
  - pg_engine/app/decorators/user_account_decorator.rb
@@ -57,6 +57,7 @@ files:
57
57
  - pg_engine/app/helpers/pg_engine/print_helper.rb
58
58
  - pg_engine/app/helpers/pg_engine/route_helper.rb
59
59
  - pg_engine/app/inputs/pg_engine/fecha_input.rb
60
+ - pg_engine/app/lib/pg_engine/error_helper.rb
60
61
  - pg_engine/app/lib/pg_engine/filtros_builder.rb
61
62
  - pg_engine/app/lib/pg_form_builder.rb
62
63
  - pg_engine/app/models/account.rb
@@ -83,7 +84,9 @@ files:
83
84
  - pg_engine/app/views/admin/users/new.html.slim
84
85
  - pg_engine/app/views/admin/users/show.html.slim
85
86
  - pg_engine/app/views/pg_engine/base/download.xlsx.axlsx
87
+ - pg_engine/app/views/pg_engine/base/edit.html.slim
86
88
  - pg_engine/app/views/pg_engine/base/index.html.slim
89
+ - pg_engine/app/views/pg_engine/base/new.html.slim
87
90
  - pg_engine/config/initializers/active_admin.rb
88
91
  - pg_engine/config/initializers/devise.rb
89
92
  - pg_engine/config/locales/devise.en.yml
@@ -98,6 +101,7 @@ files:
98
101
  - pg_engine/db/migrate/20240211152951_create_accounts.rb
99
102
  - pg_engine/db/migrate/20240211153049_create_user_accounts.rb
100
103
  - pg_engine/db/migrate/20240222115722_create_active_storage_tables.active_storage.rb
104
+ - pg_engine/db/migrate/20240305200900_nombre_user.rb
101
105
  - pg_engine/db/seeds.rb
102
106
  - pg_engine/lib/pg_engine.rb
103
107
  - pg_engine/lib/pg_engine/configuracion.rb
@@ -110,11 +114,16 @@ files:
110
114
  - pg_engine/spec/controllers/admin/accounts_controller_spec.rb
111
115
  - pg_engine/spec/controllers/admin/user_accounts_controller_spec.rb
112
116
  - pg_engine/spec/controllers/admin/users_controller_spec.rb
117
+ - pg_engine/spec/controllers/concerns/pg_engine/error_helper_spec.rb
118
+ - pg_engine/spec/controllers/devise/registrations_controller_spec.rb
119
+ - pg_engine/spec/controllers/devise/sessions_controller_spec.rb
113
120
  - pg_engine/spec/factories/accounts.rb
114
121
  - pg_engine/spec/factories/user_accounts.rb
115
122
  - pg_engine/spec/factories/users.rb
116
123
  - pg_engine/spec/fixtures/test.pdf
124
+ - pg_engine/spec/lib/pg_form_builder_spec.rb
117
125
  - pg_engine/spec/models/account_spec.rb
126
+ - pg_engine/spec/models/pg_engine/base_record_spec.rb
118
127
  - pg_engine/spec/models/user_account_spec.rb
119
128
  - pg_engine/spec/models/user_spec.rb
120
129
  - pg_engine/spec/pg_engine/pdf_preview_generator_spec.rb