pg_rails 7.0.3 → 7.0.5
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/pg_associable/app/assets/js/asociable_controller.js +3 -4
- data/pg_associable/app/assets/js/asociable_inline_controller.js +28 -27
- data/pg_associable/app/assets/js/modal_controller.js +31 -44
- data/pg_associable/app/helpers/pg_associable/helpers.rb +1 -1
- data/pg_associable/app/views/pg_engine/base/_pg_associable_modal.html.slim +4 -2
- data/pg_engine/lib/tasks/auto_anotar_modelos.rake +55 -30
- data/pg_layout/index.js +3 -2
- data/pg_rails/lib/version.rb +1 -1
- data/pg_scaffold/lib/generators/pg_resource_route/pg_resource_route_generator.rb +1 -1
- data/pg_scaffold/lib/generators/pg_scaffold/pg_scaffold_generator.rb +4 -2
- data/pg_scaffold/lib/generators/pg_scaffold/templates/controller.rb +6 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d63547ea3619de2194b7906e2344df8fe1ff049cd3b066ba1adcb61cf1ae8102
|
4
|
+
data.tar.gz: 5845c9d534c94be6ddb71823271d21f3d2c28615ba5d70d5a874478799d48eeb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b7611fd24a756c4a7c6e8573f67b48dd0e9598839065feef9ac6345e8e09e0b71087db795647524f6f8bd9734fe67c6da54d4305391306441eddcaf6b0120937
|
7
|
+
data.tar.gz: 204dc0788a96e724b67038d0c89e1a8cecf69a1a4fd8f8ada7d105289ed0615641eed73e8353cf85acea3be573332d05583070650740c37ed53d891c2ec30579
|
@@ -26,21 +26,20 @@ export default class extends Controller {
|
|
26
26
|
}
|
27
27
|
}
|
28
28
|
const input = this.element.querySelector('input[type=text]')
|
29
|
-
if(input.value) {
|
29
|
+
if (input.value) {
|
30
30
|
this.element.classList.add('filled')
|
31
31
|
}
|
32
|
-
|
33
32
|
}
|
34
33
|
|
35
|
-
|
36
34
|
selectItem (e) {
|
37
35
|
// TODO: text en data
|
38
36
|
this.completarCampo(e.target.dataset.id, e.target.text)
|
39
37
|
}
|
38
|
+
|
40
39
|
completarCampo (id, text) {
|
41
40
|
const textField = this.element.querySelector('input[type=text]')
|
42
41
|
const hiddenField = this.element.querySelector('input[type=hidden]')
|
43
|
-
if(
|
42
|
+
if (id === undefined) {
|
44
43
|
id = null
|
45
44
|
}
|
46
45
|
hiddenField.value = id
|
@@ -22,86 +22,88 @@ export default class extends Controller {
|
|
22
22
|
this.element.querySelector('.pencil').onclick = (e) => {
|
23
23
|
that.input.focus()
|
24
24
|
}
|
25
|
-
if(this.input.value) {
|
25
|
+
if (this.input.value) {
|
26
26
|
this.element.classList.add('filled')
|
27
27
|
}
|
28
28
|
|
29
|
-
|
30
|
-
let timerId
|
29
|
+
const debounce = function (callback, wait) {
|
30
|
+
let timerId
|
31
31
|
return (...args) => {
|
32
|
-
clearTimeout(timerId)
|
32
|
+
clearTimeout(timerId)
|
33
33
|
timerId = setTimeout(() => {
|
34
|
-
callback(...args)
|
35
|
-
}, wait)
|
36
|
-
}
|
34
|
+
callback(...args)
|
35
|
+
}, wait)
|
36
|
+
}
|
37
37
|
}
|
38
38
|
const doSearchBounce = debounce((force) => {
|
39
39
|
that.doSearch(force)
|
40
40
|
}, 200)
|
41
41
|
|
42
42
|
this.input.addEventListener('blur', (e) => {
|
43
|
-
this.input.placeholder =
|
43
|
+
this.input.placeholder = ''
|
44
44
|
})
|
45
45
|
this.input.onfocus = (e) => {
|
46
46
|
this.input.select()
|
47
|
-
if(this.input.value.length
|
47
|
+
if (this.input.value.length === 0) {
|
48
48
|
this.escribiAlgo()
|
49
49
|
}
|
50
50
|
}
|
51
51
|
this.input.onkeyup = (e) => {
|
52
|
-
if(this.input.value.length
|
52
|
+
if (this.input.value.length === 0) {
|
53
53
|
this.escribiAlgo()
|
54
54
|
}
|
55
|
-
if(e.keyCode
|
55
|
+
if (e.keyCode === 13) {
|
56
56
|
doSearchBounce(true)
|
57
57
|
} else {
|
58
58
|
doSearchBounce()
|
59
59
|
}
|
60
60
|
}
|
61
61
|
this.input.onkeydown = (e) => {
|
62
|
-
if(e.keyCode
|
63
|
-
e.preventDefault()
|
64
|
-
return false
|
62
|
+
if (e.keyCode === 13) {
|
63
|
+
e.preventDefault()
|
64
|
+
return false
|
65
65
|
}
|
66
66
|
}
|
67
67
|
}
|
68
|
-
|
68
|
+
|
69
|
+
buscando () {
|
69
70
|
this.result.innerHTML = `
|
70
71
|
<div class="resultados" tabindex="-1">
|
71
72
|
<div class="fst-italic text-secondary">Buscando...</div>
|
72
73
|
</div>
|
73
74
|
`
|
74
75
|
}
|
75
|
-
|
76
|
-
|
76
|
+
|
77
|
+
escribiAlgo () {
|
78
|
+
this.input.placeholder = 'Escribí algo para buscar'
|
77
79
|
}
|
78
80
|
|
79
|
-
doSearch(force = false) {
|
80
|
-
if(!force && this.input.value.length < 3) {
|
81
|
+
doSearch (force = false) {
|
82
|
+
if (!force && this.input.value.length < 3) {
|
81
83
|
return
|
82
84
|
}
|
83
|
-
if(!force && this.input.value
|
85
|
+
if (!force && this.input.value === this.lastValue) {
|
84
86
|
return
|
85
87
|
}
|
86
88
|
this.lastValue = this.input.value
|
87
89
|
|
88
|
-
|
90
|
+
const timerId = setTimeout(() => {
|
89
91
|
this.buscando()
|
90
92
|
}, 200)
|
91
|
-
document.addEventListener(
|
93
|
+
document.addEventListener('turbo:before-stream-render', function (e) {
|
92
94
|
clearTimeout(timerId)
|
93
95
|
})
|
94
|
-
|
96
|
+
const url = `${this.input.dataset.url}?id=${this.elemId}`
|
95
97
|
const form = document.createElement('form')
|
96
98
|
form.setAttribute('method', 'post')
|
97
99
|
form.setAttribute('action', url)
|
98
100
|
form.setAttribute('data-turbo-stream', true)
|
99
|
-
|
101
|
+
const partial = document.createElement('input')
|
100
102
|
partial.setAttribute('type', 'hidden')
|
101
103
|
partial.setAttribute('name', 'partial')
|
102
104
|
partial.setAttribute('value', 'pg_associable/resultados_inline')
|
103
105
|
form.appendChild(partial)
|
104
|
-
|
106
|
+
const query = document.createElement('input')
|
105
107
|
query.setAttribute('type', 'hidden')
|
106
108
|
query.setAttribute('name', 'query')
|
107
109
|
query.setAttribute('value', this.input.value)
|
@@ -114,7 +116,7 @@ export default class extends Controller {
|
|
114
116
|
completarCampo (id, text) {
|
115
117
|
const textField = this.element.querySelector('input[type=text]')
|
116
118
|
const hiddenField = this.element.querySelector('input[type=hidden]')
|
117
|
-
if(
|
119
|
+
if (id === undefined) {
|
118
120
|
id = null
|
119
121
|
}
|
120
122
|
hiddenField.value = id
|
@@ -134,7 +136,6 @@ export default class extends Controller {
|
|
134
136
|
this.result.innerHTML = ''
|
135
137
|
}
|
136
138
|
|
137
|
-
|
138
139
|
disconnect (e) {
|
139
140
|
console.log('disconnect asociable_inline')
|
140
141
|
}
|
@@ -3,10 +3,9 @@ import * as bootstrap from 'bootstrap'
|
|
3
3
|
|
4
4
|
export default class extends Controller {
|
5
5
|
static outlets = ['asociable']
|
6
|
-
static targets = ['response', 'result']
|
6
|
+
static targets = ['response', 'result', 'searchInput', 'searchForm']
|
7
7
|
|
8
8
|
modalPuntero = null
|
9
|
-
input = null
|
10
9
|
lastValue = ''
|
11
10
|
|
12
11
|
connect (e) {
|
@@ -15,28 +14,33 @@ export default class extends Controller {
|
|
15
14
|
this.modalPuntero = new bootstrap.Modal(modal)
|
16
15
|
this.modalPuntero.show()
|
17
16
|
|
18
|
-
this.
|
17
|
+
if (this.searchInputTargets.length > 0) {
|
18
|
+
this.bindSearchInput()
|
19
|
+
}
|
20
|
+
}
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
};
|
22
|
+
debounce (callback, wait) {
|
23
|
+
let timerId
|
24
|
+
return (...args) => {
|
25
|
+
clearTimeout(timerId)
|
26
|
+
timerId = setTimeout(() => {
|
27
|
+
callback(...args)
|
28
|
+
}, wait)
|
28
29
|
}
|
29
|
-
|
30
|
+
}
|
31
|
+
|
32
|
+
bindSearchInput () {
|
33
|
+
const doSearchBounce = this.debounce((force) => {
|
30
34
|
this.doSearch(force)
|
31
35
|
}, 200)
|
32
|
-
this.
|
33
|
-
if(e.keyCode
|
34
|
-
e.preventDefault()
|
35
|
-
return false
|
36
|
+
this.searchInputTarget.onkeydown = (e) => {
|
37
|
+
if (e.keyCode === 13) {
|
38
|
+
e.preventDefault()
|
39
|
+
return false
|
36
40
|
}
|
37
41
|
}
|
38
|
-
this.
|
39
|
-
if(e.keyCode
|
42
|
+
this.searchInputTarget.onkeyup = (e) => {
|
43
|
+
if (e.keyCode === 13) {
|
40
44
|
doSearchBounce(true)
|
41
45
|
} else {
|
42
46
|
doSearchBounce()
|
@@ -44,7 +48,7 @@ export default class extends Controller {
|
|
44
48
|
}
|
45
49
|
}
|
46
50
|
|
47
|
-
buscando() {
|
51
|
+
buscando () {
|
48
52
|
this.resultTarget.innerHTML = `
|
49
53
|
<ul class="resultados list-group list-group-flush" tabindex="-1">
|
50
54
|
<li class="list-group-item">
|
@@ -53,40 +57,23 @@ export default class extends Controller {
|
|
53
57
|
</ul>
|
54
58
|
`
|
55
59
|
}
|
56
|
-
|
57
|
-
|
60
|
+
|
61
|
+
doSearch (force = false) {
|
62
|
+
if (!force && this.searchInputTarget.value.length < 3) {
|
58
63
|
return
|
59
64
|
}
|
60
|
-
if(!force && this.
|
65
|
+
if (!force && this.searchInputTarget.value === this.lastValue) {
|
61
66
|
return
|
62
67
|
}
|
63
|
-
this.lastValue = this.
|
68
|
+
this.lastValue = this.searchInputTarget.value
|
64
69
|
|
65
|
-
|
70
|
+
const timerId = setTimeout(() => {
|
66
71
|
this.buscando()
|
67
72
|
}, 200)
|
68
|
-
document.addEventListener(
|
73
|
+
document.addEventListener('turbo:before-stream-render', function (e) {
|
69
74
|
clearTimeout(timerId)
|
70
75
|
})
|
71
|
-
this.
|
72
|
-
// let url = `${this.input.dataset.url}?id=${this.elemId}`
|
73
|
-
// const form = document.createElement('form')
|
74
|
-
// form.setAttribute('method', 'post')
|
75
|
-
// form.setAttribute('action', url)
|
76
|
-
// form.setAttribute('data-turbo-stream', true)
|
77
|
-
// let partial = document.createElement('input')
|
78
|
-
// partial.setAttribute('type', 'hidden')
|
79
|
-
// partial.setAttribute('name', 'partial')
|
80
|
-
// partial.setAttribute('value', 'pg_associable/resultados_inline')
|
81
|
-
// form.appendChild(partial)
|
82
|
-
// let query = document.createElement('input')
|
83
|
-
// query.setAttribute('type', 'hidden')
|
84
|
-
// query.setAttribute('name', 'query')
|
85
|
-
// query.setAttribute('value', this.input.value)
|
86
|
-
// form.appendChild(query)
|
87
|
-
// document.body.prepend(form)
|
88
|
-
// form.requestSubmit()
|
89
|
-
// form.remove()
|
76
|
+
this.searchFormTarget.requestSubmit()
|
90
77
|
}
|
91
78
|
|
92
79
|
selectItem (e) {
|
@@ -10,7 +10,7 @@ module PgAssociable
|
|
10
10
|
|
11
11
|
def pg_respond_buscar
|
12
12
|
partial = params[:partial] || 'pg_associable/resultados'
|
13
|
-
@collection = policy_scope(@clase_modelo).query(params[:query]).limit(6)
|
13
|
+
@collection = policy_scope(@clase_modelo).kept.query(params[:query]).limit(6)
|
14
14
|
render turbo_stream:
|
15
15
|
turbo_stream.update("resultados-#{params[:id]}",
|
16
16
|
partial:, locals: { collection: @collection })
|
@@ -11,17 +11,19 @@
|
|
11
11
|
a.btn-close[type="button" data-bs-dismiss="modal" aria-label="Close"]
|
12
12
|
.modal-body
|
13
13
|
.show-on-select-item
|
14
|
-
- if @clase_modelo.count.zero?
|
14
|
+
- if policy_scope(@clase_modelo).kept.count.zero?
|
15
15
|
p No hay #{@clase_modelo.nombre_plural.downcase} aún
|
16
16
|
= link_to "Crear el primer #{@clase_modelo.nombre_singular.downcase}",
|
17
17
|
'javascript:void(0)', data: { action: 'modal#toggleCrearElegir' }
|
18
18
|
- else
|
19
19
|
= form_tag namespaced_path(@clase_modelo, prefix: :buscar),
|
20
|
+
data: { 'modal-target': 'searchForm' },
|
20
21
|
method: :post, class: 'pg-form buscar' do
|
21
22
|
= hidden_field_tag :id, params[:id]
|
22
23
|
= text_field_tag :query, '', class: 'form-control',
|
23
24
|
placeholder: 'Escribí algo para buscar',
|
24
|
-
autocomplete: 'off'
|
25
|
+
autocomplete: 'off',
|
26
|
+
data: { 'modal-target': 'searchInput' }
|
25
27
|
/ = button_tag 'Buscar'
|
26
28
|
.resultados-wrapper id="resultados-#{params[:id]}" data-modal-target="result"
|
27
29
|
#pg-associable-form.show-on-new-item
|
@@ -1,34 +1,59 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
#
|
4
|
-
|
1
|
+
# NOTE: only doing this in development as some production environments (Heroku)
|
2
|
+
# NOTE: are sensitive to local FS writes, and besides -- it's just not proper
|
3
|
+
# NOTE: to have a dev-mode tool do its thing in production.
|
5
4
|
if Rails.env.development?
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
5
|
+
require 'annotate'
|
6
|
+
task :set_annotation_options do
|
7
|
+
# You can override any of these by setting an environment variable of the
|
8
|
+
# same name.
|
9
|
+
Annotate.set_defaults(
|
10
|
+
'active_admin' => 'false',
|
11
|
+
'additional_file_patterns' => [],
|
12
|
+
'routes' => 'true',
|
13
|
+
'models' => 'true',
|
14
|
+
'position_in_routes' => 'before',
|
15
|
+
'position_in_class' => 'before',
|
16
|
+
'position_in_test' => 'before',
|
17
|
+
'position_in_fixture' => 'before',
|
18
|
+
'position_in_factory' => 'before',
|
19
|
+
'position_in_serializer' => 'before',
|
20
|
+
'show_foreign_keys' => 'true',
|
21
|
+
'show_complete_foreign_keys' => 'false',
|
22
|
+
'show_indexes' => 'true',
|
23
|
+
'simple_indexes' => 'false',
|
24
|
+
'model_dir' => 'app/models',
|
25
|
+
'root_dir' => '',
|
26
|
+
'include_version' => 'false',
|
27
|
+
'require' => '',
|
28
|
+
'exclude_tests' => 'true',
|
29
|
+
'exclude_fixtures' => 'true',
|
30
|
+
'exclude_factories' => 'true',
|
31
|
+
'exclude_serializers' => 'true',
|
32
|
+
'exclude_scaffolds' => 'true',
|
33
|
+
'exclude_controllers' => 'true',
|
34
|
+
'exclude_helpers' => 'true',
|
35
|
+
'exclude_sti_subclasses' => 'false',
|
36
|
+
'ignore_model_sub_dir' => 'false',
|
37
|
+
'ignore_columns' => nil,
|
38
|
+
'ignore_routes' => nil,
|
39
|
+
'ignore_unknown_models' => 'false',
|
40
|
+
# 'hide_limit_column_types' => '<%= AnnotateModels::NO_LIMIT_COL_TYPES.join(",") %>',
|
41
|
+
# 'hide_default_column_types' => '<%= AnnotateModels::NO_DEFAULT_COL_TYPES.join(",") %>',
|
42
|
+
'skip_on_db_migrate' => 'false',
|
43
|
+
'format_bare' => 'true',
|
44
|
+
'format_rdoc' => 'false',
|
45
|
+
'format_yard' => 'false',
|
46
|
+
'format_markdown' => 'false',
|
47
|
+
'sort' => 'false',
|
48
|
+
'force' => 'false',
|
49
|
+
'frozen' => 'false',
|
50
|
+
'classified_sort' => 'true',
|
51
|
+
'trace' => 'false',
|
52
|
+
'wrapper_open' => nil,
|
53
|
+
'wrapper_close' => nil,
|
54
|
+
'with_comment' => 'true'
|
55
|
+
)
|
23
56
|
end
|
24
57
|
|
25
|
-
|
26
|
-
# and db:rollback tasks
|
27
|
-
Rake::Task['db:migrate'].enhance do
|
28
|
-
Rake::Task['annotate'].invoke
|
29
|
-
end
|
30
|
-
|
31
|
-
Rake::Task['db:rollback'].enhance do
|
32
|
-
Rake::Task['annotate'].invoke
|
33
|
-
end
|
58
|
+
Annotate.load_tasks
|
34
59
|
end
|
data/pg_layout/index.js
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
// Controllers
|
2
2
|
import NavbarController from './app/javascript/navbar_controller'
|
3
|
-
window.Stimulus.register('navbar', NavbarController)
|
4
|
-
|
5
3
|
// Bootstrap's toasts
|
6
4
|
import * as bootstrap from 'bootstrap'
|
5
|
+
|
6
|
+
window.Stimulus.register('navbar', NavbarController)
|
7
|
+
|
7
8
|
document.addEventListener('turbo:load', function () {
|
8
9
|
const toastElList = document.querySelectorAll('.toast:not(.hide):not(.show)')
|
9
10
|
Array.from(toastElList).map(toastEl => new bootstrap.Toast(toastEl).show())
|
data/pg_rails/lib/version.rb
CHANGED
@@ -20,7 +20,7 @@ class PgResourceRouteGenerator < Rails::Generators::NamedBase
|
|
20
20
|
return if options[:actions].present?
|
21
21
|
|
22
22
|
route_s = <<~RUBY
|
23
|
-
|
23
|
+
pg_resource(:#{file_name.pluralize})
|
24
24
|
RUBY
|
25
25
|
route route_s, namespace: regular_class_path
|
26
26
|
end
|
@@ -57,9 +57,11 @@ class PgScaffoldGenerator < Rails::Generators::NamedBase
|
|
57
57
|
|
58
58
|
def parent_controller
|
59
59
|
parts = controller_class_name.split('::')
|
60
|
-
|
60
|
+
namesp = namespace.present? ? "#{namespace}::" : ''
|
61
|
+
cont_name = "#{namesp}#{parts.first}Controller"
|
62
|
+
return cont_name if parts.length > 1 && get_class(cont_name)
|
61
63
|
|
62
|
-
raise "#{
|
64
|
+
raise "#{cont_name} not exists"
|
63
65
|
end
|
64
66
|
|
65
67
|
def atributos_a_filtrar
|
@@ -2,19 +2,20 @@
|
|
2
2
|
|
3
3
|
# generado con pg_rails
|
4
4
|
|
5
|
-
<% if namespaced? -%>
|
5
|
+
<% if false && namespaced? -%>
|
6
6
|
require_dependency "<%= namespaced_path %>/application_controller"
|
7
7
|
|
8
8
|
<% end -%>
|
9
|
+
<% module_namespacing do -%>
|
9
10
|
<% module_namespacing_2 do -%>
|
10
11
|
class <%= controller_class_name.split('::').last %>Controller < <%= parent_controller %>
|
11
|
-
before_action { @clase_modelo = <%= class_name %> }
|
12
|
+
before_action { @clase_modelo = <%= class_name.split('::').last %> }
|
12
13
|
|
13
|
-
before_action(only: :index) { authorize <%= class_name %> }
|
14
|
+
before_action(only: :index) { authorize <%= class_name.split('::').last %> }
|
14
15
|
|
15
16
|
before_action :set_instancia_modelo, only: %i[new create show edit update destroy]
|
16
17
|
|
17
|
-
add_breadcrumb <%= class_name %>.nombre_plural, :<%= plural_route_name %>_path
|
18
|
+
add_breadcrumb <%= class_name.split('::').last %>.nombre_plural, :<%= plural_route_name %>_path
|
18
19
|
|
19
20
|
private
|
20
21
|
|
@@ -35,3 +36,4 @@ class <%= controller_class_name.split('::').last %>Controller < <%= parent_contr
|
|
35
36
|
end
|
36
37
|
end
|
37
38
|
<% end -%>
|
39
|
+
<% 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.
|
4
|
+
version: 7.0.5
|
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-
|
11
|
+
date: 2024-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Rails goodies.
|
14
14
|
email:
|