pg_rails 7.0.8.pre.alpha.26 → 7.0.8.pre.alpha.28

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 67cb2b4ac12dba97e33e5d859a101b7d38502c9be7366122c52e3c67102e26f5
4
- data.tar.gz: 18426e296a8ac94c30540ac0ce01e6152e0b0cd4aa7ca0750d4f671d24bc3aa6
3
+ metadata.gz: c2090fbe898d25e227b13261a788564b15149cc5e732bd73609b9fa1ca7dd2f0
4
+ data.tar.gz: 5024586aeba0ceaa65887565aa638762e70807e8db8518094b2f3f5085941902
5
5
  SHA512:
6
- metadata.gz: 202ce67c321c3614f84ebae1be41329300ea76be4629381288e11658e58d374d7afcb990f9742dc30071f229dd47d04f610902228238af3f97da31dc62cd77a0
7
- data.tar.gz: 8c97bc615beb0888ecc9f98636bba1ea7a181aa6c5723c80d29e4b8a40a4a6219cd2c0ef652be3e4c7548c0685e8daeb8f453425f6829410181b69b5debd2062
6
+ metadata.gz: 0b97d2de94a3db6ab66be03341ce2df03c1632fa7e13a7435619202a5f3cb0d71ffa537d30add4f997112d2680b87839d26bde254c997c46fd660a8abdae40ee
7
+ data.tar.gz: 4cf0d683b00d0a3e548c823c16b273cb2e9e12206d8baf6b2b821f09f9a031b1eebadd37abf962297310ddc70fd2092fdab081a6acabf9bd7e3471aecb753c73
@@ -21,6 +21,7 @@ module PgEngine
21
21
  @collection = filtros_y_policy atributos_para_buscar
22
22
  @collection = sort_collection(@collection)
23
23
  @records_filtered = policy_scope(clase_modelo).any? if @collection.empty?
24
+ # FIXME: si hay pero en páginas anteriores, mostrar texto correspondiente
24
25
  pg_respond_index
25
26
  end
26
27
 
@@ -54,6 +54,10 @@ module PgEngine
54
54
  'opened'
55
55
  end
56
56
  @navbar = Navbar.new(current_user)
57
+
58
+ if Rollbar.configuration.enabled && Rails.application.credentials.rollbar.present?
59
+ @rollbar_token = Rails.application.credentials.rollbar.access_token_client
60
+ end
57
61
  end
58
62
 
59
63
  def mobile_device?
@@ -2,6 +2,8 @@ module PgEngine
2
2
  module ErrorHelper
3
3
  extend ActiveSupport::Concern
4
4
 
5
+ # pg_engine/config/initializers/simple_form_monkey_patch.rb
6
+
5
7
  def merge_association_errors(object, details, assoc_key)
6
8
  details = details.except(assoc_key)
7
9
  assoc_items = object.send(assoc_key).map(&:errors).map(&:details)
@@ -26,11 +26,28 @@ class PgFormBuilder < SimpleForm::FormBuilder
26
26
  end
27
27
 
28
28
  def mensajes_de_error
29
+ title = error_notification(message: mensaje, class: 'text-danger mb-2 error-title') if mensaje
30
+
29
31
  base_errors = object.errors[:base]
30
32
  base_message = (base_errors.map(&:to_s).join('<br>') if base_errors.present?)
31
- title = error_notification(message: mensaje, class: 'text-danger mb-2') if mensaje
32
33
  base_tag = error_notification(message: base_message, class: 'alert alert-danger') if base_message
33
- (title || '') + (base_tag || '')
34
+
35
+ all_errors_tag = build_all_errors_tag unless base_tag
36
+
37
+ "#{title}#{base_tag}#{all_errors_tag}".html_safe # rubocop:disable Rails/OutputSafety
38
+ end
39
+
40
+ def build_all_errors_tag
41
+ details = object.errors.details.dup
42
+ details.delete(:base)
43
+ not_base_errors = details.any?
44
+
45
+ return unless not_base_errors
46
+
47
+ # TODO!: poder pasar un block para que no se ejecute si no se va a loguear por el log level
48
+ pg_warn "Not base errors en pg_form: #{object.errors.details}. Record: #{object.inspect}", :debug
49
+
50
+ "<span class='not_base_errors' data-errors='#{object.errors.details.to_json}'></span>"
34
51
  end
35
52
 
36
53
  def mensaje
@@ -29,7 +29,7 @@ describe PgEngine::ErrorHelper do
29
29
 
30
30
  context 'cuando solo tiene otros errores' do
31
31
  before do
32
- categoria.validate_aux = true
32
+ categoria.validate_base = true
33
33
  end
34
34
 
35
35
  it do
@@ -39,7 +39,7 @@ describe PgEngine::ErrorHelper do
39
39
 
40
40
  context 'cuando tiene multiples errores' do
41
41
  before do
42
- categoria.validate_aux = true
42
+ categoria.validate_base = true
43
43
  categoria.nombre = nil
44
44
  end
45
45
 
@@ -2,11 +2,43 @@ require 'rails_helper'
2
2
 
3
3
  describe PgFormBuilder do
4
4
  let(:categoria) { create :categoria_de_cosa }
5
- let(:template) { double }
5
+ let(:template) do
6
+ klass = Class.new
7
+ klass.include ActionView::Helpers::TagHelper
8
+ klass.new
9
+ end
10
+
6
11
  let(:instancia) { described_class.new('bla', categoria, template, {}) }
7
12
 
8
13
  before { create_list :cosa, 2, categoria_de_cosa: categoria }
9
14
 
15
+ describe '#mensajes_de_error' do
16
+ subject { instancia.mensajes_de_error }
17
+
18
+ # expect(subject)
19
+ # it { expect(subject).to eq 'Por favor, revisá los campos obligatorios:' }
20
+
21
+ context 'cuando solo tiene errores de presencia' do
22
+ before do
23
+ categoria.nombre = nil
24
+ categoria.validate
25
+ end
26
+
27
+ it { expect(subject).to include 'Por favor, revisá los campos obligatorios:' }
28
+ it { expect(subject).to include 'not_base_errors' }
29
+ end
30
+
31
+ context 'cuando solo tiene errores de :base' do
32
+ before do
33
+ categoria.validate_base = true
34
+ categoria.validate
35
+ end
36
+
37
+ it { expect(subject).to include 'Por favor, revisá los siguientes errores' }
38
+ it { expect(subject).not_to include 'not_base_errors' }
39
+ end
40
+ end
41
+
10
42
  describe '#mensaje' do
11
43
  subject { instancia.mensaje }
12
44
 
@@ -1,3 +1,5 @@
1
+ import Rollbar from 'rollbar'
2
+
1
3
  import './config'
2
4
  import './channels'
3
5
  import './controllers'
@@ -5,6 +7,32 @@ import './controllers'
5
7
  // Bootstrap's toasts
6
8
  import * as bootstrap from 'bootstrap'
7
9
 
10
+ let rollbarToken = document.head.querySelector('meta[name=rollbar-token]')
11
+ rollbarToken = rollbarToken && rollbarToken.content
12
+ if (rollbarToken) {
13
+ let rollbarEnv = document.head.querySelector('meta[name=rollbar-env]')
14
+ rollbarEnv = rollbarEnv && rollbarEnv.content
15
+ rollbarEnv = rollbarEnv || 'unknown'
16
+
17
+ window.Rollbar = Rollbar
18
+
19
+ Rollbar.init()
20
+
21
+ Rollbar.global({
22
+ itemsPerMinute: 2,
23
+ maxItems: 5
24
+ })
25
+ Rollbar.configure({
26
+ accessToken: rollbarToken,
27
+ captureUncaught: true,
28
+ captureUnhandledRejections: true,
29
+ reportLevel: 'warning',
30
+ payload: {
31
+ environment: rollbarEnv
32
+ }
33
+ })
34
+ }
35
+
8
36
  document.addEventListener('turbo:load', bindToasts)
9
37
  document.addEventListener('turbo:render', bindToasts)
10
38
 
@@ -1,4 +1,5 @@
1
1
  import { Controller } from '@hotwired/stimulus'
2
+ import Rollbar from 'rollbar'
2
3
 
3
4
  export default class extends Controller {
4
5
  connect () {
@@ -9,5 +10,16 @@ export default class extends Controller {
9
10
  }
10
11
  })
11
12
  })
13
+ const notBaseErrors = this.element.querySelector('.not_base_errors')
14
+
15
+ if (notBaseErrors) {
16
+ const invalidFields = document.querySelector('.form-control.is-invalid,.form-select.is-invalid')
17
+ if (!invalidFields) {
18
+ console.error(notBaseErrors.dataset.errors)
19
+ Rollbar.error(notBaseErrors.dataset.errors)
20
+ const errorTitle = this.element.querySelector('.error-title')
21
+ errorTitle.innerText = 'Lo lamentamos mucho pero ocurrió algo inesperado'
22
+ }
23
+ }
12
24
  }
13
25
  }
@@ -30,6 +30,9 @@ class Navbar
30
30
  path: eval(item['path']),
31
31
  show: item['policy'] ? eval(item['policy']) : true
32
32
  }
33
+ rescue StandardError
34
+ # FIXME: testear
35
+ pg_err item
33
36
  end
34
37
  # rubocop:enable Security/Eval
35
38
  end
@@ -16,7 +16,9 @@ html
16
16
 
17
17
  = stylesheet_link_tag 'application', 'data-turbo-track': 'reload'
18
18
  = javascript_include_tag 'application', 'data-turbo-track': 'reload', type: 'module'
19
- = render partial: 'pg_layout/rollbar'
19
+ - if @rollbar_token.present?
20
+ meta name="rollbar-token" content="#{@rollbar_token}"
21
+ meta name="rollbar-env" content="#{Rails.env}"
20
22
  body
21
23
  div class="#{ @sidebar == false ? '' : 'with-sidebar' }"
22
24
  - unless @sidebar == false
@@ -54,16 +54,16 @@
54
54
  </a>
55
55
  </li>
56
56
  <% end %>
57
-
58
- <% else %>
59
- <li class="nav-item">
60
- <%= link_to t("devise.sign_up"), new_user_registration_path, class: 'btn btn-success' %>
61
- </li>
57
+ <% end %>
58
+ </ul>
59
+ <% unless user_signed_in? %>
60
+ <%= link_to t("devise.sign_up"), new_user_registration_path, class: 'btn btn-success' %>
61
+ <ul class="navbar-nav mb-2 mb-lg-0">
62
62
  <li class="nav-item">
63
63
  <%= link_to t("devise.sign_in"), new_user_session_path, class: 'nav-link' %>
64
64
  </li>
65
- <% end %>
66
- </ul>
65
+ </ul>
66
+ <% end %>
67
67
  <% @navbar.extensiones.each do |extension| %>
68
68
  <%= extension %>
69
69
  <% end %>
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PgRails
4
- VERSION = '7.0.8-alpha.26'
4
+ VERSION = '7.0.8-alpha.28'
5
5
  end
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.26
4
+ version: 7.0.8.pre.alpha.28
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-04-05 00:00:00.000000000 Z
11
+ date: 2024-04-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -200,7 +200,6 @@ files:
200
200
  - pg_layout/app/views/pg_layout/_flash.html.slim
201
201
  - pg_layout/app/views/pg_layout/_flash_alert.html.slim
202
202
  - pg_layout/app/views/pg_layout/_navbar.html.erb
203
- - pg_layout/app/views/pg_layout/_rollbar.html.erb
204
203
  - pg_layout/app/views/pg_layout/_sidebar.html.erb
205
204
  - pg_layout/lib/pg_layout.rb
206
205
  - pg_layout/lib/pg_layout/engine.rb
@@ -1,28 +0,0 @@
1
- <% if Rollbar.configuration.enabled && Rails.application.credentials.rollbar.present? %>
2
- <script>
3
- var _rollbarConfig = {
4
- accessToken: '<%= Rails.application.credentials.rollbar.access_token_client %>',
5
- captureUncaught: true,
6
- captureUnhandledRejections: true,
7
- payload: {
8
- environment: <%= Rails.env %>,
9
- //trace_id: 'abc',
10
- client: {
11
- javascript: {
12
- code_version: '1.0.0',
13
- //source_map_enabled: true,
14
- //guess_uncaught_frames: true
15
- }
16
- },
17
- //server: {
18
- //root: 'http://localhost:8000/demo/',
19
- //host: 'host-1',
20
- //branch: 'HEAD',
21
- //},
22
- }
23
- };
24
- // Rollbar Snippet
25
- !function(r){var e={};function o(n){if(e[n])return e[n].exports;var t=e[n]={i:n,l:!1,exports:{}};return r[n].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=e,o.d=function(r,e,n){o.o(r,e)||Object.defineProperty(r,e,{enumerable:!0,get:n})},o.r=function(r){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(r,"__esModule",{value:!0})},o.t=function(r,e){if(1&e&&(r=o(r)),8&e)return r;if(4&e&&"object"==typeof r&&r&&r.__esModule)return r;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:r}),2&e&&"string"!=typeof r)for(var t in r)o.d(n,t,function(e){return r[e]}.bind(null,t));return n},o.n=function(r){var e=r&&r.__esModule?function(){return r.default}:function(){return r};return o.d(e,"a",e),e},o.o=function(r,e){return Object.prototype.hasOwnProperty.call(r,e)},o.p="",o(o.s=0)}([function(r,e,o){"use strict";var n=o(1),t=o(5);_rollbarConfig=_rollbarConfig||{},_rollbarConfig.rollbarJsUrl=_rollbarConfig.rollbarJsUrl||"https://cdn.rollbar.com/rollbarjs/refs/tags/v2.26.3/rollbar.min.js",_rollbarConfig.async=void 0===_rollbarConfig.async||_rollbarConfig.async;var a=n.setupShim(window,_rollbarConfig),l=t(_rollbarConfig);window.rollbar=n.Rollbar,a.loadFull(window,document,!_rollbarConfig.async,_rollbarConfig,l)},function(r,e,o){"use strict";var n=o(2),t=o(3);function a(r){return function(){try{return r.apply(this,arguments)}catch(r){try{console.error("[Rollbar]: Internal error",r)}catch(r){}}}}var l=0;function i(r,e){this.options=r,this._rollbarOldOnError=null;var o=l++;this.shimId=function(){return o},"undefined"!=typeof window&&window._rollbarShims&&(window._rollbarShims[o]={handler:e,messages:[]})}var s=o(4),d=function(r,e){return new i(r,e)},c=function(r){return new s(d,r)};function u(r){return a((function(){var e=this,o=Array.prototype.slice.call(arguments,0),n={shim:e,method:r,args:o,ts:new Date};window._rollbarShims[this.shimId()].messages.push(n)}))}i.prototype.loadFull=function(r,e,o,n,t){var l=!1,i=e.createElement("script"),s=e.getElementsByTagName("script")[0],d=s.parentNode;i.crossOrigin="",i.src=n.rollbarJsUrl,o||(i.async=!0),i.onload=i.onreadystatechange=a((function(){if(!(l||this.readyState&&"loaded"!==this.readyState&&"complete"!==this.readyState)){i.onload=i.onreadystatechange=null;try{d.removeChild(i)}catch(r){}l=!0,function(){var e;if(void 0===r._rollbarDidLoad){e=new Error("rollbar.js did not load");for(var o,n,a,l,i=0;o=r._rollbarShims[i++];)for(o=o.messages||[];n=o.shift();)for(a=n.args||[],i=0;i<a.length;++i)if("function"==typeof(l=a[i])){l(e);break}}"function"==typeof t&&t(e)}()}})),d.insertBefore(i,s)},i.prototype.wrap=function(r,e,o){try{var n;if(n="function"==typeof e?e:function(){return e||{}},"function"!=typeof r)return r;if(r._isWrap)return r;if(!r._rollbar_wrapped&&(r._rollbar_wrapped=function(){o&&"function"==typeof o&&o.apply(this,arguments);try{return r.apply(this,arguments)}catch(o){var e=o;throw e&&("string"==typeof e&&(e=new String(e)),e._rollbarContext=n()||{},e._rollbarContext._wrappedSource=r.toString(),window._rollbarWrappedError=e),e}},r._rollbar_wrapped._isWrap=!0,r.hasOwnProperty))for(var t in r)r.hasOwnProperty(t)&&(r._rollbar_wrapped[t]=r[t]);return r._rollbar_wrapped}catch(e){return r}};for(var p="log,debug,info,warn,warning,error,critical,global,configure,handleUncaughtException,handleAnonymousErrors,handleUnhandledRejection,captureEvent,captureDomContentLoaded,captureLoad".split(","),f=0;f<p.length;++f)i.prototype[p[f]]=u(p[f]);r.exports={setupShim:function(r,e){if(r){var o=e.globalAlias||"Rollbar";if("object"==typeof r[o])return r[o];r._rollbarShims={},r._rollbarWrappedError=null;var l=new c(e);return a((function(){e.captureUncaught&&(l._rollbarOldOnError=r.onerror,n.captureUncaughtExceptions(r,l,!0),e.wrapGlobalEventHandlers&&t(r,l,!0)),e.captureUnhandledRejections&&n.captureUnhandledRejections(r,l,!0);var a=e.autoInstrument;return!1!==e.enabled&&(void 0===a||!0===a||function(r){return!("object"!=typeof r||void 0!==r.page&&!r.page)}(a))&&r.addEventListener&&(r.addEventListener("load",l.captureLoad.bind(l)),r.addEventListener("DOMContentLoaded",l.captureDomContentLoaded.bind(l))),r[o]=l,l}))()}},Rollbar:c}},function(r,e,o){"use strict";function n(r,e,o,n){r._rollbarWrappedError&&(n[4]||(n[4]=r._rollbarWrappedError),n[5]||(n[5]=r._rollbarWrappedError._rollbarContext),r._rollbarWrappedError=null);var t=e.handleUncaughtException.apply(e,n);o&&o.apply(r,n),"anonymous"===t&&(e.anonymousErrorsPending+=1)}r.exports={captureUncaughtExceptions:function(r,e,o){if(r){var t;if("function"==typeof e._rollbarOldOnError)t=e._rollbarOldOnError;else if(r.onerror){for(t=r.onerror;t._rollbarOldOnError;)t=t._rollbarOldOnError;e._rollbarOldOnError=t}e.handleAnonymousErrors();var a=function(){var o=Array.prototype.slice.call(arguments,0);n(r,e,t,o)};o&&(a._rollbarOldOnError=t),r.onerror=a}},captureUnhandledRejections:function(r,e,o){if(r){"function"==typeof r._rollbarURH&&r._rollbarURH.belongsToShim&&r.removeEventListener("unhandledrejection",r._rollbarURH);var n=function(r){var o,n,t;try{o=r.reason}catch(r){o=void 0}try{n=r.promise}catch(r){n="[unhandledrejection] error getting `promise` from event"}try{t=r.detail,!o&&t&&(o=t.reason,n=t.promise)}catch(r){}o||(o="[unhandledrejection] error getting `reason` from event"),e&&e.handleUnhandledRejection&&e.handleUnhandledRejection(o,n)};n.belongsToShim=o,r._rollbarURH=n,r.addEventListener("unhandledrejection",n)}}}},function(r,e,o){"use strict";function n(r,e,o){if(e.hasOwnProperty&&e.hasOwnProperty("addEventListener")){for(var n=e.addEventListener;n._rollbarOldAdd&&n.belongsToShim;)n=n._rollbarOldAdd;var t=function(e,o,t){n.call(this,e,r.wrap(o),t)};t._rollbarOldAdd=n,t.belongsToShim=o,e.addEventListener=t;for(var a=e.removeEventListener;a._rollbarOldRemove&&a.belongsToShim;)a=a._rollbarOldRemove;var l=function(r,e,o){a.call(this,r,e&&e._rollbar_wrapped||e,o)};l._rollbarOldRemove=a,l.belongsToShim=o,e.removeEventListener=l}}r.exports=function(r,e,o){if(r){var t,a,l="EventTarget,Window,Node,ApplicationCache,AudioTrackList,ChannelMergerNode,CryptoOperation,EventSource,FileReader,HTMLUnknownElement,IDBDatabase,IDBRequest,IDBTransaction,KeyOperation,MediaController,MessagePort,ModalWindow,Notification,SVGElementInstance,Screen,TextTrack,TextTrackCue,TextTrackList,WebSocket,WebSocketWorker,Worker,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload".split(",");for(t=0;t<l.length;++t)r[a=l[t]]&&r[a].prototype&&n(e,r[a].prototype,o)}}},function(r,e,o){"use strict";function n(r,e){this.impl=r(e,this),this.options=e,function(r){for(var e=function(r){return function(){var e=Array.prototype.slice.call(arguments,0);if(this.impl[r])return this.impl[r].apply(this.impl,e)}},o="log,debug,info,warn,warning,error,critical,global,configure,handleUncaughtException,handleAnonymousErrors,handleUnhandledRejection,_createItem,wrap,loadFull,shimId,captureEvent,captureDomContentLoaded,captureLoad".split(","),n=0;n<o.length;n++)r[o[n]]=e(o[n])}(n.prototype)}n.prototype._swapAndProcessMessages=function(r,e){var o,n,t;for(this.impl=r(this.options);o=e.shift();)n=o.method,t=o.args,this[n]&&"function"==typeof this[n]&&("captureDomContentLoaded"===n||"captureLoad"===n?this[n].apply(this,[t[0],o.ts]):this[n].apply(this,t));return this},r.exports=n},function(r,e,o){"use strict";r.exports=function(r){return function(e){if(!e&&!window._rollbarInitialized){for(var o,n,t=(r=r||{}).globalAlias||"Rollbar",a=window.rollbar,l=function(r){return new a(r)},i=0;o=window._rollbarShims[i++];)n||(n=o.handler),o.handler._swapAndProcessMessages(l,o.messages);window[t]=n,window._rollbarInitialized=!0}}}}]);
26
- // End Rollbar Snippet
27
- </script>
28
- <% end %>