pg_rails 7.0.6 → 7.0.8.pre.alpha
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +13 -0
- data/pg_associable/app/assets/{css → stylesheets}/pg_associable.scss +1 -1
- data/pg_associable/app/helpers/pg_associable/form_builder_methods.rb +2 -19
- data/pg_associable/app/helpers/pg_associable/helpers.rb +2 -1
- data/pg_associable/app/inputs/pg_associable_input.rb +53 -0
- data/pg_associable/app/javascript/asociable_controller.tsx +171 -0
- data/pg_associable/app/{assets/js → javascript}/modal_controller.js +6 -3
- data/pg_associable/app/views/pg_associable/_resultados.html.slim +3 -1
- data/pg_associable/app/views/pg_associable/_resultados_inline.html.slim +5 -2
- data/pg_associable/index.js +2 -4
- data/pg_associable/lib/pg_associable/engine.rb +0 -8
- data/pg_associable/spec/pg_associable/helpers_spec.rb +4 -3
- data/pg_engine/app/admin/accounts.rb +25 -0
- data/pg_engine/{lib/templates/activeadmin → app/admin}/audits.rb +3 -3
- data/pg_engine/app/admin/dashboard.rb +34 -0
- data/pg_engine/app/admin/user_accounts.rb +26 -0
- data/pg_engine/{lib/templates/activeadmin → app/admin}/users.rb +1 -2
- data/pg_engine/app/assets/javascripts/active_admin.js +1 -0
- data/pg_engine/app/assets/stylesheets/active_admin.scss +17 -0
- data/pg_engine/app/controllers/admin/accounts_controller.rb +33 -0
- data/pg_engine/app/controllers/admin/user_accounts_controller.rb +33 -0
- data/pg_engine/app/controllers/admin/users_controller.rb +47 -0
- data/pg_engine/app/controllers/pg_engine/resource_helper.rb +1 -0
- data/pg_engine/app/decorators/account_decorator.rb +16 -0
- data/pg_engine/app/decorators/user_account_decorator.rb +19 -0
- data/pg_engine/app/decorators/user_decorator.rb +20 -0
- data/pg_engine/app/helpers/pg_engine/flash_helper.rb +1 -1
- data/pg_engine/app/models/account.rb +39 -0
- data/pg_engine/app/models/user.rb +61 -0
- data/pg_engine/app/models/user_account.rb +46 -0
- data/pg_engine/app/policies/account_policy.rb +31 -0
- data/pg_engine/app/policies/pg_engine/application_policy.rb +1 -1
- data/pg_engine/app/policies/user_account_policy.rb +31 -0
- data/pg_engine/app/policies/user_policy.rb +31 -0
- data/pg_engine/app/views/admin/accounts/_account.html.slim +1 -0
- data/pg_engine/app/views/admin/accounts/_form.html.slim +12 -0
- data/pg_engine/app/views/admin/accounts/edit.html.slim +5 -0
- data/pg_engine/app/views/admin/accounts/new.html.slim +5 -0
- data/pg_engine/app/views/admin/accounts/show.html.slim +27 -0
- data/pg_engine/app/views/admin/user_accounts/_form.html.slim +12 -0
- data/pg_engine/app/views/admin/user_accounts/_user_account.html.slim +1 -0
- data/pg_engine/app/views/admin/user_accounts/edit.html.slim +5 -0
- data/pg_engine/app/views/admin/user_accounts/new.html.slim +5 -0
- data/pg_engine/app/views/admin/user_accounts/show.html.slim +24 -0
- data/pg_engine/app/views/admin/users/_form.html.slim +12 -0
- data/pg_engine/app/views/admin/users/_user.html.slim +1 -0
- data/pg_engine/app/views/admin/users/edit.html.slim +5 -0
- data/pg_engine/app/views/admin/users/new.html.slim +5 -0
- data/pg_engine/app/views/admin/users/show.html.slim +27 -0
- data/pg_engine/config/initializers/active_admin.rb +352 -0
- data/pg_engine/config/initializers/devise.rb +313 -0
- data/pg_engine/config/locales/devise.en.yml +65 -0
- data/pg_engine/config/routes.rb +11 -0
- data/pg_engine/db/migrate/20240205194218_devise_create_users.rb +47 -0
- data/pg_engine/db/migrate/20240208234111_unaccent.rb +5 -0
- data/pg_engine/db/migrate/20240208234901_install_audited.rb +32 -0
- data/pg_engine/db/migrate/20240210025702_create_active_admin_comments.rb +16 -0
- data/pg_engine/db/migrate/20240211152951_create_accounts.rb +24 -0
- data/pg_engine/db/migrate/20240211153049_create_user_accounts.rb +20 -0
- data/pg_engine/db/seeds.rb +8 -0
- data/pg_engine/lib/pg_engine/engine.rb +16 -2
- data/pg_engine/lib/tasks/auto_anotar_modelos.rake +1 -1
- data/pg_engine/spec/controllers/admin/accounts_controller_spec.rb +206 -0
- data/pg_engine/spec/controllers/admin/user_accounts_controller_spec.rb +189 -0
- data/pg_engine/spec/controllers/admin/users_controller_spec.rb +180 -0
- data/pg_engine/spec/factories/accounts.rb +11 -0
- data/pg_engine/spec/factories/user_accounts.rb +21 -0
- data/pg_engine/spec/factories/users.rb +59 -0
- data/pg_engine/spec/models/account_spec.rb +13 -0
- data/pg_engine/spec/models/user_account_spec.rb +13 -0
- data/pg_engine/spec/models/user_spec.rb +13 -0
- data/pg_layout/app/views/layouts/pg_layout/layout.html.slim +1 -0
- data/pg_layout/app/views/pg_layout/_flash.html.slim +1 -1
- data/pg_layout/lib/pg_layout/engine.rb +0 -1
- data/pg_rails/lib/version.rb +1 -1
- data/pg_rails/scss/pg_rails.scss +1 -1
- data/pg_scaffold/lib/generators/pg_pundit/templates/policy.rb +1 -1
- data/pg_scaffold/lib/generators/pg_rspec/scaffold/templates/controller_spec.rb +4 -4
- data/pg_scaffold/lib/generators/pg_slim/templates/_form.html.slim +1 -1
- data/pg_scaffold/spec/generators_spec.rb +1 -1
- metadata +62 -14
- data/pg_associable/app/assets/js/asociable_controller.js +0 -58
- data/pg_associable/app/assets/js/asociable_inline_controller.js +0 -142
- data/pg_associable/app/inputs/pg_associable/pg_associable_inline_input.rb +0 -39
- data/pg_associable/app/inputs/pg_associable/pg_associable_input.rb +0 -41
- data/pg_associable/lib/pg_associable/simple_form_initializer.rb +0 -34
- data/pg_associable/lib/tasks/pg_associable_tasks.rake +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6d74fa06142003ba7e436907908f3f7ca491e8ab6367796424de5af92d19217
|
4
|
+
data.tar.gz: a8a7545e0881a3fb79d3d2185314619341286488d7b1eeacb265c0adacb1b371
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f27603a1c050b0c5aada27652696a5b5cff62041d51b31ad99e4b09494a5b5f6b3f2376ce56bf725ae7bc7a3effcbb10d2851e5c9df7530902dec5a2d885f09
|
7
|
+
data.tar.gz: ce9641619c78d375984b774fd007c7054e8ac6fe605d0f2c95c0f71bddfe498b081f64589c8a566a4da48d82f60b332d20f1359c937aa8cb34c137fa7a497014
|
data/README.md
CHANGED
@@ -73,3 +73,16 @@ Acceder a la app en <http://localhost:3000/>.
|
|
73
73
|
4. `bundle exec rails g pg_scaffold Admin/CategoriaDeCosa nombre:string{required} "tipo:integer{enum,required}" fecha:date tiempo:datetime --model-name=CategoriaDeCosa --discard --activeadmin`
|
74
74
|
5. `bundle exec rails g pg_scaffold Admin/Cosa nombre:string{required} "tipo:integer{enum,required}" categoria_de_cosa:references{required} --model-name=Cosa --discard --activeadmin`
|
75
75
|
6. Setup asociacion creable en cosas/_form
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
be rake app:pg_engine_engine:install:migrations
|
80
|
+
|
81
|
+
be rails pg_engine_engine:install:migrations
|
82
|
+
|
83
|
+
|
84
|
+
"build": "esbuild pg_rails/js/index.js --bundle --sourcemap --format=esm --outdir=pg_rails/builds --public-path=/assets",
|
85
|
+
"build:css:compile": "sass ./pg_rails/scss/pg_rails.scss:./pg_rails/builds/application.css --no-source-map --load-path=node_modules",
|
86
|
+
"build:css:prefix": "postcss ./pg_rails/builds/application.css --use=autoprefixer --output=./pg_rails/builds/application.css",
|
87
|
+
"build:css": "yarn build:css:compile && yarn build:css:prefix",
|
88
|
+
|
@@ -6,26 +6,9 @@ module PgAssociable
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def pg_associable(atributo, options = {})
|
9
|
-
|
10
|
-
options[:
|
11
|
-
options[:wrapper] = :pg_associable
|
12
|
-
options[:url_modal] = url_modal
|
9
|
+
options[:as] = 'pg_associable'
|
10
|
+
options[:wrapper_html] = { data: { controller: 'asociable', 'asociable-modal-outlet': '.modal' } }
|
13
11
|
association atributo, options
|
14
12
|
end
|
15
|
-
|
16
|
-
def pg_associable_inline(atributo, options = {})
|
17
|
-
url_search = namespaced_path(clase_asociacion(atributo), prefix: :buscar)
|
18
|
-
options[:as] = 'pg_associable/pg_associable_inline'
|
19
|
-
options[:wrapper] = :pg_associable_inline
|
20
|
-
options[:url_search] = url_search
|
21
|
-
association atributo, options
|
22
|
-
end
|
23
|
-
|
24
|
-
def clase_asociacion(atributo)
|
25
|
-
asociacion = object.class.reflect_on_all_associations.find { |a| a.name == atributo.to_sym }
|
26
|
-
nombre_clase = asociacion.options[:class_name]
|
27
|
-
nombre_clase = asociacion.name.to_s.camelize if nombre_clase.nil?
|
28
|
-
Object.const_get(nombre_clase)
|
29
|
-
end
|
30
13
|
end
|
31
14
|
end
|
@@ -10,9 +10,10 @@ module PgAssociable
|
|
10
10
|
|
11
11
|
def pg_respond_buscar
|
12
12
|
partial = params[:partial] || 'pg_associable/resultados'
|
13
|
+
resultados = params[:resultados] || 'resultados'
|
13
14
|
@collection = policy_scope(@clase_modelo).kept.query(params[:query]).limit(6)
|
14
15
|
render turbo_stream:
|
15
|
-
turbo_stream.update("resultados-#{params[:id]}",
|
16
|
+
turbo_stream.update("#{resultados}-#{params[:id]}",
|
16
17
|
partial:, locals: { collection: @collection })
|
17
18
|
end
|
18
19
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class PgAssociableInput < SimpleForm::Inputs::StringInput
|
4
|
+
include ActionView::Helpers::FormTagHelper
|
5
|
+
include Rails.application.routes.url_helpers
|
6
|
+
include PgEngine::RouteHelper
|
7
|
+
|
8
|
+
def hidden_input(_wrapper_options = {})
|
9
|
+
@builder.hidden_field(attribute_name)
|
10
|
+
end
|
11
|
+
|
12
|
+
def controller
|
13
|
+
# Para que no rompa polymorphic_url en NamespaceDeductor
|
14
|
+
end
|
15
|
+
|
16
|
+
def input(wrapper_options = nil)
|
17
|
+
atributo = attribute_name.to_s.gsub('_id', '')
|
18
|
+
url_modal = namespaced_path(clase_asociacion(atributo), prefix: :abrir_modal)
|
19
|
+
url_search = namespaced_path(clase_asociacion(atributo), prefix: :buscar)
|
20
|
+
|
21
|
+
input_html_options[:data] = { url_search:, url_modal: }
|
22
|
+
input_html_options[:type] = 'text'
|
23
|
+
|
24
|
+
merged_input_options = merge_wrapper_options(input_html_options, wrapper_options)
|
25
|
+
|
26
|
+
build_input(merged_input_options)
|
27
|
+
end
|
28
|
+
|
29
|
+
def clase_asociacion(atributo)
|
30
|
+
asociacion = object.class.reflect_on_all_associations.find { |a| a.name == atributo.to_sym }
|
31
|
+
nombre_clase = asociacion.options[:class_name]
|
32
|
+
nombre_clase = asociacion.name.to_s.camelize if nombre_clase.nil?
|
33
|
+
Object.const_get(nombre_clase)
|
34
|
+
end
|
35
|
+
|
36
|
+
def build_input(input_options)
|
37
|
+
content_tag('div', class: 'position-relative') do
|
38
|
+
hidden_input + text_field_tag(nil, object.send(reflection.name).to_s,
|
39
|
+
input_options) + limpiar + pencil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def limpiar(_wrapper_options = nil)
|
44
|
+
content_tag('a', href: 'javascript:void(0)', class: 'limpiar', title: 'Limpiar', tabindex: '0',
|
45
|
+
data: { action: 'asociable#selectItem' }) do
|
46
|
+
'<i class="bi bi-x-lg"></i>'.html_safe
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def pencil(_wrapper_options = nil)
|
51
|
+
'<i tabindex="-1" class="bi bi-pencil pencil"></i>'.html_safe
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,171 @@
|
|
1
|
+
import { Controller } from '@hotwired/stimulus'
|
2
|
+
import * as React from 'react'
|
3
|
+
import { renderToStaticMarkup } from 'react-dom/server'
|
4
|
+
|
5
|
+
export default class extends Controller {
|
6
|
+
static outlets = ['modal']
|
7
|
+
|
8
|
+
lastValue = null
|
9
|
+
result = null
|
10
|
+
elemId = null
|
11
|
+
input = null
|
12
|
+
|
13
|
+
connect () {
|
14
|
+
console.log('connect asociable')
|
15
|
+
|
16
|
+
// ID único para identificar el campo y el modal
|
17
|
+
this.elemId = Math.trunc(Math.random() * 1000000000)
|
18
|
+
|
19
|
+
this.input = this.element.querySelector('input[type=text]')
|
20
|
+
|
21
|
+
this.element.setAttribute('data-asociable-modal-outlet', `.modal-${this.elemId}`)
|
22
|
+
this.element.classList.add(`asociable-${this.elemId}`)
|
23
|
+
|
24
|
+
this.result = document.createElement('div')
|
25
|
+
this.result.setAttribute('id', `resultados-inline-${this.elemId}`)
|
26
|
+
this.result.classList.add('resultados-wrapper')
|
27
|
+
this.input.parentNode.appendChild(this.result)
|
28
|
+
|
29
|
+
const input = this.element.querySelector('input[type=text]')
|
30
|
+
if (input.value) {
|
31
|
+
this.element.classList.add('filled')
|
32
|
+
}
|
33
|
+
this.element.querySelector('.pencil').onclick = () => {
|
34
|
+
input.focus()
|
35
|
+
}
|
36
|
+
|
37
|
+
const debounce = function (callback, wait) {
|
38
|
+
let timerId
|
39
|
+
return (...args) => {
|
40
|
+
clearTimeout(timerId)
|
41
|
+
timerId = setTimeout(() => {
|
42
|
+
callback(...args)
|
43
|
+
}, wait)
|
44
|
+
}
|
45
|
+
}
|
46
|
+
const doSearchBounce = debounce((force) => {
|
47
|
+
this.doSearch(force)
|
48
|
+
}, 200)
|
49
|
+
|
50
|
+
this.input.addEventListener('blur', () => {
|
51
|
+
this.input.placeholder = ''
|
52
|
+
})
|
53
|
+
this.input.onfocus = () => {
|
54
|
+
this.input.select()
|
55
|
+
if (this.input.value.length === 0) {
|
56
|
+
this.escribiAlgo()
|
57
|
+
}
|
58
|
+
}
|
59
|
+
this.input.onkeyup = (e) => {
|
60
|
+
if (this.input.value.length === 0) {
|
61
|
+
this.escribiAlgo()
|
62
|
+
}
|
63
|
+
if (e.keyCode === 13) {
|
64
|
+
doSearchBounce(true)
|
65
|
+
} else {
|
66
|
+
doSearchBounce()
|
67
|
+
}
|
68
|
+
}
|
69
|
+
this.input.onkeydown = (e) => {
|
70
|
+
if (e.keyCode === 13) {
|
71
|
+
e.preventDefault()
|
72
|
+
return false
|
73
|
+
}
|
74
|
+
}
|
75
|
+
}
|
76
|
+
|
77
|
+
crearItem () {
|
78
|
+
// Si ya hay un modal abierto lo abro y retorno
|
79
|
+
if (this.modalOutlets.length > 0) {
|
80
|
+
this.modalOutlet.openModal()
|
81
|
+
return
|
82
|
+
}
|
83
|
+
|
84
|
+
const elem = (
|
85
|
+
<form method="get" action={this.input.dataset.url_modal} data-turbo-stream="true">
|
86
|
+
<input type="hidden" name="id" value={this.elemId} />
|
87
|
+
</form>
|
88
|
+
)
|
89
|
+
const form = document.createElement('div')
|
90
|
+
form.innerHTML = renderToStaticMarkup(elem)
|
91
|
+
document.body.prepend(form)
|
92
|
+
form.childNodes[0].requestSubmit()
|
93
|
+
form.remove()
|
94
|
+
}
|
95
|
+
|
96
|
+
escribiAlgo () {
|
97
|
+
this.input.placeholder = 'Escribí algo para buscar'
|
98
|
+
}
|
99
|
+
|
100
|
+
buscando () {
|
101
|
+
this.result.innerHTML = renderToStaticMarkup(
|
102
|
+
<div className="resultados" tabIndex={-1}>
|
103
|
+
<div className="fst-italic text-secondary">Buscando...</div>
|
104
|
+
</div>
|
105
|
+
)
|
106
|
+
}
|
107
|
+
|
108
|
+
selectItem (e) {
|
109
|
+
if (e.target.dataset.object) {
|
110
|
+
this.completarCampo(JSON.parse(e.target.dataset.object))
|
111
|
+
} else {
|
112
|
+
this.completarCampo(null)
|
113
|
+
}
|
114
|
+
this.result.innerHTML = ''
|
115
|
+
}
|
116
|
+
|
117
|
+
doSearch (force = false) {
|
118
|
+
if (!force && this.input.value.length < 3) {
|
119
|
+
return
|
120
|
+
}
|
121
|
+
if (!force && this.input.value === this.lastValue) {
|
122
|
+
return
|
123
|
+
}
|
124
|
+
this.lastValue = this.input.value
|
125
|
+
|
126
|
+
const timerId = setTimeout(() => {
|
127
|
+
this.buscando()
|
128
|
+
}, 200)
|
129
|
+
document.addEventListener('turbo:before-stream-render', function () {
|
130
|
+
clearTimeout(timerId)
|
131
|
+
})
|
132
|
+
const elem = (
|
133
|
+
<form method="post" action={this.input.dataset.url_search} data-turbo-stream="true">
|
134
|
+
<input type="hidden" name="id" value={this.elemId} />
|
135
|
+
<input type="hidden" name="partial" value="pg_associable/resultados_inline" />
|
136
|
+
<input type="hidden" name="resultados" value="resultados-inline" />
|
137
|
+
<input type="hidden" name="query" value={this.input.value} />
|
138
|
+
</form>
|
139
|
+
)
|
140
|
+
const form = document.createElement('div')
|
141
|
+
form.innerHTML = renderToStaticMarkup(elem)
|
142
|
+
document.body.prepend(form)
|
143
|
+
form.childNodes[0].requestSubmit()
|
144
|
+
form.remove()
|
145
|
+
}
|
146
|
+
|
147
|
+
completarCampo (object) {
|
148
|
+
const textField = this.element.querySelector('input[type=text]')
|
149
|
+
const hiddenField = this.element.querySelector('input[type=hidden]')
|
150
|
+
if (object) {
|
151
|
+
hiddenField.value = object.id
|
152
|
+
textField.value = object.to_s
|
153
|
+
this.element.classList.add('filled')
|
154
|
+
this.element.dataset.object = object
|
155
|
+
const event = new CustomEvent('pg_associable:changed', { detail: object })
|
156
|
+
this.element.dispatchEvent(event)
|
157
|
+
} else {
|
158
|
+
textField.value = null
|
159
|
+
hiddenField.value = null
|
160
|
+
this.element.classList.remove('filled')
|
161
|
+
this.element.dataset.object = null
|
162
|
+
const event = new CustomEvent('pg_associable:changed')
|
163
|
+
this.element.dispatchEvent(event)
|
164
|
+
}
|
165
|
+
this.result.innerHTML = ''
|
166
|
+
}
|
167
|
+
|
168
|
+
disconnect () {
|
169
|
+
console.log('disconnect asociable')
|
170
|
+
}
|
171
|
+
}
|
@@ -78,15 +78,18 @@ export default class extends Controller {
|
|
78
78
|
|
79
79
|
selectItem (e) {
|
80
80
|
const asociable = this.asociableOutlet
|
81
|
-
|
82
|
-
|
81
|
+
if (e.target.dataset.object) {
|
82
|
+
asociable.completarCampo(JSON.parse(e.target.dataset.object))
|
83
|
+
} else {
|
84
|
+
asociable.completarCampo(null)
|
85
|
+
}
|
83
86
|
this.remove()
|
84
87
|
}
|
85
88
|
|
86
89
|
responseTargetConnected (e) {
|
87
90
|
const newObject = JSON.parse(e.dataset.response)
|
88
91
|
const asociable = this.asociableOutlet
|
89
|
-
asociable.completarCampo(newObject
|
92
|
+
asociable.completarCampo(newObject)
|
90
93
|
this.remove()
|
91
94
|
}
|
92
95
|
|
@@ -3,7 +3,9 @@
|
|
3
3
|
.list-group.list-group-flush
|
4
4
|
- collection.each do |object|
|
5
5
|
= link_to object.to_s, 'javascript:void(0)',
|
6
|
-
class: 'list-group-item',
|
6
|
+
class: 'list-group-item',
|
7
|
+
data: { action: 'modal#selectItem', id: object.id, \
|
8
|
+
object: object.decorate.to_json }
|
7
9
|
- else
|
8
10
|
ul.list-group.list-group-flush
|
9
11
|
li.list-group-item No hay resultados para "#{params[:query]}"
|
@@ -1,12 +1,15 @@
|
|
1
1
|
.resultados tabindex="-1"
|
2
2
|
- if collection.any?
|
3
3
|
.list-group.list-group-flush
|
4
|
+
= link_to 'Crear', 'javascript:void(0)',
|
5
|
+
class: 'list-group-item', data: { action: 'asociable#crearItem' }
|
4
6
|
= link_to 'Ninguno', 'javascript:void(0)',
|
5
|
-
class: 'list-group-item', data: { action: '
|
7
|
+
class: 'list-group-item', data: { action: 'asociable#selectItem' }
|
6
8
|
- collection.each do |object|
|
7
9
|
= link_to object.to_s, 'javascript:void(0)',
|
8
10
|
class: 'list-group-item',
|
9
|
-
data: { action: '
|
11
|
+
data: { action: 'asociable#selectItem',
|
12
|
+
id: object.id, object: object.decorate.to_json }
|
10
13
|
- else
|
11
14
|
ul.list-group.list-group-flush
|
12
15
|
li.list-group-item No hay resultados para "#{params[:query]}"
|
data/pg_associable/index.js
CHANGED
@@ -1,7 +1,5 @@
|
|
1
|
-
import
|
2
|
-
import
|
3
|
-
import ModalController from './app/assets/js/modal_controller'
|
1
|
+
import AsociableController from './app/javascript/asociable_controller'
|
2
|
+
import ModalController from './app/javascript/modal_controller'
|
4
3
|
|
5
|
-
window.Stimulus.register('asociable_inline', AsociableInlineController)
|
6
4
|
window.Stimulus.register('asociable', AsociableController)
|
7
5
|
window.Stimulus.register('modal', ModalController)
|
@@ -1,12 +1,4 @@
|
|
1
|
-
require "#{__dir__}/../../app/helpers/pg_associable/helpers"
|
2
|
-
require "#{__dir__}/../../app/helpers/pg_associable/form_builder_methods"
|
3
|
-
|
4
1
|
module PgAssociable
|
5
2
|
class Engine < ::Rails::Engine
|
6
|
-
isolate_namespace PgAssociable
|
7
|
-
# initializer 'configurar_simple_form', after: 'factory_bot.set_fixture_replacement' do
|
8
|
-
initializer 'configurar_pg_scaffold' do
|
9
|
-
require 'pg_associable/simple_form_initializer'
|
10
|
-
end
|
11
3
|
end
|
12
4
|
end
|
@@ -2,10 +2,11 @@ require 'rails_helper'
|
|
2
2
|
|
3
3
|
describe PgAssociable::Helpers do
|
4
4
|
describe '#pg_respond_buscar' do
|
5
|
-
let(:user) { create :user }
|
5
|
+
let(:user) { create :user, :developer }
|
6
6
|
let(:ctrl) do
|
7
|
-
clazz = Class.new(
|
8
|
-
clazz.new
|
7
|
+
# clazz = Class.new(Admin::CosasController)
|
8
|
+
# clazz.new
|
9
|
+
Admin::CosasController.new
|
9
10
|
end
|
10
11
|
let!(:cosa) { create :cosa }
|
11
12
|
|
@@ -0,0 +1,25 @@
|
|
1
|
+
ActiveAdmin.register Account do
|
2
|
+
permit_params :plan, :nombre, :hashid
|
3
|
+
|
4
|
+
index do
|
5
|
+
selectable_column
|
6
|
+
id_column
|
7
|
+
column :plan
|
8
|
+
column :nombre
|
9
|
+
column :hashid
|
10
|
+
actions
|
11
|
+
end
|
12
|
+
|
13
|
+
filter :plan
|
14
|
+
filter :nombre
|
15
|
+
filter :hashid
|
16
|
+
|
17
|
+
form do |f|
|
18
|
+
f.inputs do
|
19
|
+
f.input :plan
|
20
|
+
f.input :nombre
|
21
|
+
f.input :hashid
|
22
|
+
end
|
23
|
+
f.actions
|
24
|
+
end
|
25
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
ActiveAdmin.register Audited::Audit do
|
2
|
-
permit_params [
|
3
|
-
|
4
|
-
|
2
|
+
permit_params %i[auditable_id auditable_type associated_id associated_type user_id
|
3
|
+
user_type username action audited_changes version comment
|
4
|
+
remote_address request_uuid created_at]
|
5
5
|
|
6
6
|
# :id
|
7
7
|
# :discarded_at, :fecha, :nombre, :tiempo, :tipo, :created_at, :updated_at, :actualizado_por_id, :creado_por_id
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
ActiveAdmin.register_page 'Dashboard' do
|
4
|
+
menu priority: 1, label: proc { I18n.t('active_admin.dashboard') }
|
5
|
+
|
6
|
+
content title: proc { I18n.t('active_admin.dashboard') } do
|
7
|
+
div class: 'blank_slate_container', id: 'dashboard_default_message' do
|
8
|
+
span class: 'blank_slate' do
|
9
|
+
span I18n.t('active_admin.dashboard_welcome.welcome')
|
10
|
+
small I18n.t('active_admin.dashboard_welcome.call_to_action')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# Here is an example of a simple dashboard with columns and panels.
|
15
|
+
#
|
16
|
+
# columns do
|
17
|
+
# column do
|
18
|
+
# panel "Recent Posts" do
|
19
|
+
# ul do
|
20
|
+
# Post.recent(5).map do |post|
|
21
|
+
# li link_to(post.title, admin_post_path(post))
|
22
|
+
# end
|
23
|
+
# end
|
24
|
+
# end
|
25
|
+
# end
|
26
|
+
|
27
|
+
# column do
|
28
|
+
# panel "Info" do
|
29
|
+
# para "Welcome to ActiveAdmin."
|
30
|
+
# end
|
31
|
+
# end
|
32
|
+
# end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
ActiveAdmin.register UserAccount do
|
2
|
+
decorate_with UserAccountDecorator
|
3
|
+
permit_params :user_id, :account_id, profiles: []
|
4
|
+
|
5
|
+
index do
|
6
|
+
selectable_column
|
7
|
+
id_column
|
8
|
+
column :user
|
9
|
+
column :account
|
10
|
+
column :profiles
|
11
|
+
actions
|
12
|
+
end
|
13
|
+
|
14
|
+
filter :user
|
15
|
+
filter :account
|
16
|
+
filter :profiles
|
17
|
+
|
18
|
+
form do |f|
|
19
|
+
f.inputs do
|
20
|
+
f.input :user
|
21
|
+
f.input :account
|
22
|
+
f.input :profiles, as: :select
|
23
|
+
end
|
24
|
+
f.actions
|
25
|
+
end
|
26
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
ActiveAdmin.register User do
|
2
2
|
decorate_with UserDecorator
|
3
|
-
permit_params :email, :password, :password_confirmation, :confirmed_at
|
3
|
+
permit_params :email, :password, :password_confirmation, :confirmed_at
|
4
4
|
|
5
5
|
index do
|
6
6
|
selectable_column
|
@@ -19,7 +19,6 @@ ActiveAdmin.register User do
|
|
19
19
|
else
|
20
20
|
f.input :email
|
21
21
|
f.input :password unless f.object.persisted?
|
22
|
-
f.input :profiles, as: :select
|
23
22
|
end
|
24
23
|
end
|
25
24
|
f.actions
|
@@ -0,0 +1 @@
|
|
1
|
+
//= require active_admin/base
|
@@ -0,0 +1,17 @@
|
|
1
|
+
// Sass variable overrides must be declared before loading up Active Admin's styles.
|
2
|
+
//
|
3
|
+
// To view the variables that Active Admin provides, take a look at
|
4
|
+
// `app/assets/stylesheets/active_admin/mixins/_variables.scss` in the
|
5
|
+
// Active Admin source.
|
6
|
+
//
|
7
|
+
// For example, to change the sidebar width:
|
8
|
+
// $sidebar-width: 242px;
|
9
|
+
|
10
|
+
// Active Admin's got SASS!
|
11
|
+
@import "active_admin/mixins";
|
12
|
+
@import "active_admin/base";
|
13
|
+
|
14
|
+
// Overriding any non-variable Sass must be done after the fact.
|
15
|
+
// For example, to change the default status-tag color:
|
16
|
+
//
|
17
|
+
// .status_tag { background: #6090DB; }
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# generado con pg_rails
|
4
|
+
|
5
|
+
module Admin
|
6
|
+
class AccountsController < AdminController
|
7
|
+
before_action { @clase_modelo = Account }
|
8
|
+
|
9
|
+
before_action(only: :index) { authorize Account }
|
10
|
+
|
11
|
+
before_action :set_instancia_modelo, only: %i[new create show edit update destroy]
|
12
|
+
|
13
|
+
add_breadcrumb Account.nombre_plural, :admin_accounts_path
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def atributos_permitidos
|
18
|
+
%i[plan nombre hashid]
|
19
|
+
end
|
20
|
+
|
21
|
+
def atributos_para_buscar
|
22
|
+
%i[plan nombre hashid]
|
23
|
+
end
|
24
|
+
|
25
|
+
def atributos_para_listar
|
26
|
+
%i[plan nombre hashid]
|
27
|
+
end
|
28
|
+
|
29
|
+
def atributos_para_mostrar
|
30
|
+
%i[plan nombre hashid]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# generado con pg_rails
|
4
|
+
|
5
|
+
module Admin
|
6
|
+
class UserAccountsController < AdminController
|
7
|
+
before_action { @clase_modelo = UserAccount }
|
8
|
+
|
9
|
+
before_action(only: :index) { authorize UserAccount }
|
10
|
+
|
11
|
+
before_action :set_instancia_modelo, only: %i[new create show edit update destroy]
|
12
|
+
|
13
|
+
add_breadcrumb UserAccount.nombre_plural, :admin_user_accounts_path
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def atributos_permitidos
|
18
|
+
%i[user_id account_id profiles]
|
19
|
+
end
|
20
|
+
|
21
|
+
def atributos_para_buscar
|
22
|
+
%i[user account profiles]
|
23
|
+
end
|
24
|
+
|
25
|
+
def atributos_para_listar
|
26
|
+
%i[user account profiles]
|
27
|
+
end
|
28
|
+
|
29
|
+
def atributos_para_mostrar
|
30
|
+
%i[user account profiles]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# generado con pg_rails
|
4
|
+
|
5
|
+
module Admin
|
6
|
+
class UsersController < AdminController
|
7
|
+
before_action { @clase_modelo = User }
|
8
|
+
|
9
|
+
before_action(only: :index) { authorize User }
|
10
|
+
|
11
|
+
before_action only: %i[update] do
|
12
|
+
params[:user].delete(:password) if params[:user][:password].blank?
|
13
|
+
end
|
14
|
+
|
15
|
+
before_action :set_instancia_modelo, only: %i[new create show edit update destroy]
|
16
|
+
|
17
|
+
add_breadcrumb User.nombre_plural, :admin_users_path
|
18
|
+
|
19
|
+
def create
|
20
|
+
@user.skip_confirmation!
|
21
|
+
pg_respond_create
|
22
|
+
end
|
23
|
+
|
24
|
+
def update
|
25
|
+
@user.skip_reconfirmation!
|
26
|
+
pg_respond_update
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def atributos_permitidos
|
32
|
+
%i[email password developer]
|
33
|
+
end
|
34
|
+
|
35
|
+
def atributos_para_buscar
|
36
|
+
%i[email developer]
|
37
|
+
end
|
38
|
+
|
39
|
+
def atributos_para_listar
|
40
|
+
%i[email developer]
|
41
|
+
end
|
42
|
+
|
43
|
+
def atributos_para_mostrar
|
44
|
+
%i[email developer]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -225,6 +225,7 @@ module PgEngine
|
|
225
225
|
authorize instancia_modelo
|
226
226
|
|
227
227
|
# TODO: problema en create y update cuando falla la validacion
|
228
|
+
# Reproducir el error antes de arreglarlo
|
228
229
|
self.instancia_modelo = instancia_modelo.decorate if action_name.in? %w[show edit new]
|
229
230
|
end
|
230
231
|
|