pg_rails 7.1.1.pre.5 → 7.1.1.pre.6

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: 8ed654c2ed0008b0a029aafcf59fbf1fb11d681b091852cdf91075eb59027b4e
4
- data.tar.gz: 8c5030277d34251d6e214697475c1e79121a40b1c5c9b757eb9ca95d04261bfb
3
+ metadata.gz: b95efca3ae2b2ec3c5779300bbfd6cc00ba9cac453b4fd07395803eb5010a726
4
+ data.tar.gz: 87811da5c11b5ec8bfb15e45e8b43ed5c606bceb23804bc473990f9f46ab13ed
5
5
  SHA512:
6
- metadata.gz: f2a334fbf6cf1e62e629bb231ab9ecca2300b30db6f04e1fb6360e7d9d2688a9399398d860cc0930418889b5960dfe900eb6e7bd8a7be8ff0e32d8e48513244b
7
- data.tar.gz: f3686b6c215d38d54147e1506d7645b36ccf29ed2fde0dae04574662a649550d952deb5bce503a6ff3403dc98c77235364485e04e3dc4171f39af7ee4db672cf
6
+ metadata.gz: 4da052d189d685cd90c2aed939bfebd8d3e4809f6e3db671d686a034d597b32b03a2f52f3b3413c9277566329822cbf4a520ab33531cc40ef8873a2b8c51850a
7
+ data.tar.gz: fddd0362fab8db6f74816b583372fbc10fbd4d6ad68f48adbbe635579b28339603e1f09358a16563d9d9e6909573009ec6111c84f50d9c28f109758e402f6495
@@ -53,7 +53,7 @@ module Admin
53
53
  end
54
54
 
55
55
  def atributos_para_buscar
56
- %i[email nombre apellido developer]
56
+ %i[email_cont nombre_cont apellido_cont developer]
57
57
  end
58
58
 
59
59
  def atributos_para_listar
@@ -5,7 +5,7 @@ module PgEngine
5
5
  clazz.helper_method :atributos_para_listar
6
6
  clazz.helper_method :atributos_para_mostrar
7
7
  clazz.helper_method :current_page_size
8
- clazz.helper_method :any_filter?
8
+ clazz.helper_method :show_filters?
9
9
  end
10
10
 
11
11
  # Public endpoints
@@ -19,6 +19,15 @@ module PgEngine
19
19
 
20
20
  def index
21
21
  @collection = filtros_y_policy atributos_para_buscar
22
+
23
+ shared_context = Ransack::Context.for(clase_modelo)
24
+
25
+ @q = @clase_modelo.ransack(params[:q], context: shared_context)
26
+ # @collection = @q.result(distinct: true)
27
+ @collection = @collection.joins(shared_context.join_sources)
28
+ vis = Ransack::Visitor.new.accept(@q.base)
29
+ @collection = @collection.where(vis)
30
+
22
31
  @collection = sort_collection(@collection)
23
32
  pg_respond_index
24
33
  end
@@ -53,8 +62,17 @@ module PgEngine
53
62
 
54
63
  protected
55
64
 
56
- def any_filter?
57
- params.keys.reject { |a| a.in? %w[controller action page page_size order_by order_direction] }.any?
65
+ def show_filters?
66
+ cur_route = pg_current_route
67
+ idtf = cur_route[:controller] + '#' + cur_route[:action] + '#open-filters'
68
+
69
+ if params[:ocultar_filtros]
70
+ session[idtf] = nil
71
+ elsif params[:mostrar_filtros]
72
+ session[idtf] = true
73
+ end
74
+
75
+ session[idtf]
58
76
  end
59
77
 
60
78
  def current_page_size
@@ -94,6 +94,7 @@ module PgEngine
94
94
  @notifications = Current.user.notifications.order(id: :desc)
95
95
  .where(type: 'SimpleUserNotifier::Notification')
96
96
  unseen = @notifications.unseen.any?
97
+ # FIXME: testear y fixear, buscar el primero que esté present
97
98
  tooltip = @notifications.unseen.map(&:tooltip).first
98
99
  @notifications_bell = NotificationsBellComponent.new(
99
100
  unseen:,
@@ -16,11 +16,15 @@ module PgEngine
16
16
  end
17
17
  end
18
18
 
19
+ def self.current_route(context)
20
+ req = request(context)
21
+ Rails.application.routes.recognize_path(req.path, method: req.env['REQUEST_METHOD'])
22
+ end
23
+
19
24
  def self.namespace(context)
20
25
  return Current.namespace if Current.namespace.present?
21
26
 
22
- req = request(context)
23
- route = Rails.application.routes.recognize_path(req.path, method: req.env['REQUEST_METHOD'])
27
+ route = current_route(context)
24
28
  parts = route[:controller].split('/')
25
29
  return unless parts.length > 1
26
30
 
@@ -30,6 +34,10 @@ module PgEngine
30
34
  end
31
35
  end
32
36
 
37
+ def pg_current_route
38
+ NamespaceDeductor.current_route(self)
39
+ end
40
+
33
41
  def pg_namespace
34
42
  NamespaceDeductor.namespace(self)
35
43
  end
@@ -186,6 +186,9 @@ module PgEngine
186
186
  end
187
187
 
188
188
  def filtros_html(options = {})
189
+ @form = options[:form]
190
+ raise PgEngine::Error, 'se debe setear el form' if @form.blank?
191
+
189
192
  res = ''
190
193
  @filtros.each do |campo, opciones|
191
194
  if opciones[:oculto] ||
@@ -253,42 +256,35 @@ module PgEngine
253
256
 
254
257
  map = scope.map { |o| [o.to_s, o.id] }
255
258
 
256
- unless @filtros[campo.to_sym].present? && @filtros[campo.to_sym][:include_blank] == false
257
- map.unshift ["Seleccionar #{@clase_modelo.human_attribute_name(campo.to_sym).downcase}",
258
- nil]
259
- end
260
-
261
- default = parametros_controller[campo].nil? ? nil : parametros_controller[campo]
262
259
  content_tag :div, class: 'col-auto' do
263
260
  content_tag :div, class: 'filter' do
264
261
  if multiple
265
- select_tag campo, options_for_select(map, default), multiple: true,
266
- class: 'form-select form-select-sm selectize pg-input-lg'
262
+ @form.select campo, map, { multiple: true }, 'data-controller': 'selectize',
263
+ class: 'form-select form-select-sm pg-input-lg'
267
264
  else
268
- select_tag campo, options_for_select(map, default),
269
- class: 'form-select form-select-sm chosen-select pg-input-lg'
265
+ campo = campo.to_s + '_id_in'
266
+ placeholder = ransack_placeholder(campo)
267
+ @form.select campo, map, { multiple: true }, placeholder:, 'data-controller': 'selectize',
268
+ class: 'form-control form-control-sm pg-input-lg'
270
269
  end
271
270
  end
272
271
  end
273
272
  end
274
273
 
275
274
  def filtro_select(campo, placeholder = '')
276
- map = @clase_modelo.send(campo).values.map do |key|
275
+ map = @clase_modelo.send(sin_sufijo(campo)).values.map do |key|
277
276
  [I18n.t("#{@clase_modelo.to_s.underscore}.#{campo}.#{key}", default: key.humanize),
278
277
  key.value]
279
278
  end
280
- unless @filtros[campo.to_sym].present? && @filtros[campo.to_sym][:include_blank] == false
281
- map.unshift ["Seleccionar #{placeholder.downcase}",
282
- nil]
283
- end
284
- default = parametros_controller[campo].nil? ? nil : parametros_controller[campo]
285
279
  content_tag :div, class: 'col-auto' do
286
280
  content_tag :div, class: 'filter' do
287
- select_tag campo, options_for_select(map, default), class: 'form-select form-select-sm pg-input-lg'
281
+ placeholder = ransack_placeholder(campo)
282
+ @form.select(campo, map, { multiple: true }, placeholder:, class: 'form-control form-control-sm pg-input-lg', 'data-controller': 'selectize')
288
283
  end
289
284
  end
290
285
  end
291
286
 
287
+ # DEPRECADO
292
288
  def filtro_select_custom(campo, placeholder = '')
293
289
  map = @filtros[campo.to_sym][:opciones]
294
290
  unless @filtros[campo.to_sym].present? && @filtros[campo.to_sym][:include_blank] == false
@@ -306,8 +302,9 @@ module PgEngine
306
302
  def filtro_texto(campo, placeholder = '')
307
303
  content_tag :div, class: 'col-auto' do
308
304
  content_tag :div, class: 'filter' do
309
- text_field_tag(
310
- campo, parametros_controller[campo], class: 'form-control form-control-sm allow-enter-submit', placeholder:, autocomplete: 'off'
305
+ placeholder = ransack_placeholder(campo)
306
+ @form.search_field(
307
+ campo, class: 'form-control form-control-sm allow-enter-submit', placeholder:, autocomplete: 'off'
311
308
  )
312
309
  end
313
310
  end
@@ -330,14 +327,19 @@ module PgEngine
330
327
  def filtro_fecha(campo, placeholder = '')
331
328
  content_tag :div, class: 'col-auto' do
332
329
  content_tag :div, class: 'filter' do
330
+ placeholder = ransack_placeholder(campo)
333
331
  label_tag(nil, placeholder, class: 'text-body-secondary') +
334
- date_field_tag(
335
- campo, parametros_controller[campo], class: 'form-control form-control-sm d-inline-block w-auto ms-1', placeholder:, autocomplete: 'off'
332
+ @form.date_field(
333
+ campo, class: 'form-control form-control-sm d-inline-block w-auto ms-1', placeholder:, autocomplete: 'off'
336
334
  )
337
335
  end
338
336
  end
339
337
  end
340
338
 
339
+ def ransack_placeholder(campo)
340
+ @form.object.translate(campo, include_associations: true)
341
+ end
342
+
341
343
  def parametros_controller
342
344
  params
343
345
  end
@@ -3,37 +3,34 @@
3
3
  - @actions&.each do |link_args|
4
4
  = link_to(*link_args)
5
5
  - if @filtros.present?
6
- button.btn.btn-sm.btn-outline-primary[
7
- type="button" data-bs-toggle="collapse"
8
- data-bs-target="#filtros" aria-expanded="#{any_filter? ? 'true' : 'false'}"
9
- aria-controls="filtros" data-controller="filtros" data-expanded-text="Ocultar filtros"
10
- ]
11
- span.bi.bi-funnel-fill
12
- span.d-none.d-sm-inline
13
- | &nbsp
14
- span.text Filtrar
6
+ - if show_filters?
7
+ = link_to namespaced_path(@clase_modelo, ocultar_filtros: 1),
8
+ class: 'btn btn-sm btn-outline-primary col-auto' do
9
+ | Ocultar filtros
10
+ - else
11
+ = link_to namespaced_path(@clase_modelo, mostrar_filtros: 1),
12
+ class: 'btn btn-sm btn-outline-primary col-auto' do
13
+ | Filtrar
15
14
  .ms-1
16
15
  = @clase_modelo.new.decorate.new_link
17
16
 
18
- - if @filtros.present?
19
- .collapse.border-bottom#filtros class="#{ 'show' if any_filter? }"
17
+ - if @filtros.present? && show_filters?
18
+ .border-bottom#filtros
20
19
  .d-flex.align-items-center.p-2
21
20
  .px-2.d-none.d-sm-inline-block
22
21
  span.bi.bi-funnel-fill
23
- = form_tag nil, class: '', method: :get do
22
+ = search_form_for @q, url: namespaced_path(@clase_modelo) do |f|
24
23
  .row.g-1
25
- = @filtros.filtros_html
26
- .col-auto
24
+ = @filtros.filtros_html(form: f)
25
+ .col-auto.gap-1.d-flex.align-items-start
27
26
  = button_tag class: 'btn btn-sm btn-primary col-auto' do
28
27
  span.bi.bi-search
29
28
  span.d-none.d-sm-inline
30
29
  | &nbsp
31
30
  span.text Buscar
32
- .col-auto
33
- = link_to namespaced_path(@clase_modelo, clean: true),
31
+ = link_to namespaced_path(@clase_modelo, mostrar_filtros: 1),
34
32
  class: 'btn btn-sm btn-secondary col-auto' do
35
33
  | Limpiar
36
-
37
34
  div
38
35
  - if @collection.any?
39
36
  .table-responsive
@@ -67,7 +64,7 @@ div
67
64
  = t(i18n_key, default: :'.empty_but_filtered', model: @clase_modelo.nombre_plural.downcase)
68
65
  | :
69
66
  span.ms-2
70
- = link_to namespaced_path(@clase_modelo, clean: true) do
67
+ = link_to namespaced_path(@clase_modelo, mostrar_filtros: 1) do
71
68
  | Limpiar búsqueda
72
69
  - else
73
70
  - i18n_key = "#{controller_key}.#{action_name}.index.empty"
@@ -1,4 +1,9 @@
1
1
  es:
2
+ ransack:
3
+ predicates:
4
+ cont: ''
5
+ in: ''
6
+ eq: ''
2
7
  pg_engine:
3
8
  base:
4
9
  index:
@@ -1,5 +1,7 @@
1
1
  import { Controller } from '@hotwired/stimulus'
2
2
 
3
+ // DEPRECATED.
4
+ //
3
5
  // Connects to data-controller="switcher"
4
6
  export default class extends Controller {
5
7
  originalText = null
@@ -8,6 +8,7 @@ import ClearTimeoutController from './clear_timeout_controller'
8
8
  import SwitcherController from './switcher_controller'
9
9
  import FiltrosController from './filtros_controller'
10
10
  import NotificationsController from './notifications_controller'
11
+ import SelectizeController from './selectize_controller'
11
12
 
12
13
  application.register('navbar', NavbarController)
13
14
  application.register('nested', NestedController)
@@ -17,5 +18,6 @@ application.register('clear-timeout', ClearTimeoutController)
17
18
  application.register('switcher', SwitcherController)
18
19
  application.register('filtros', FiltrosController)
19
20
  application.register('notifications', NotificationsController)
21
+ application.register('selectize', SelectizeController)
20
22
 
21
23
  // TODO: testear con capybara todo lo que se pueda
@@ -0,0 +1,10 @@
1
+ import { Controller } from '@hotwired/stimulus'
2
+ import TomSelect from 'tom-select'
3
+
4
+ // Connects to data-controller="selectize"
5
+ export default class extends Controller {
6
+ connect () {
7
+ /* eslint no-new: 0 */
8
+ new TomSelect(this.element)
9
+ }
10
+ }
@@ -74,6 +74,7 @@ html
74
74
  = render FlashContainerComponent.new
75
75
  / TODO: si hay varios flashes toast, se superponen. habría que
76
76
  hacer un container con position absolute para los toasts
77
+ / FIXME: el yield(filtros)
77
78
  = content
78
79
  div style="width:100%; height: 10em"
79
80
  = render partial: 'layouts/footer'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PgRails
4
- VERSION = '7.1.1-5'
4
+ VERSION = '7.1.1-6'
5
5
  end
@@ -39,7 +39,20 @@ $alert-margin-bottom: 0.5rem;
39
39
  @import 'bootstrap-icons/font/bootstrap-icons';
40
40
 
41
41
  @import 'trix/dist/trix';
42
+ @import 'tom-select/dist/scss/tom-select.bootstrap5';
42
43
 
44
+ .ts-control {
45
+ padding-top: 2px!important;
46
+ padding-bottom: 2px!important;
47
+ display: flex;
48
+ gap: 4px;
49
+ }
50
+ .input-group-sm > .ts-wrapper.multi.has-items .ts-control, .ts-wrapper.form-select-sm.multi.has-items .ts-control, .ts-wrapper.form-control-sm.multi.has-items .ts-control {
51
+ padding-top: 2px!important;
52
+ }
53
+ .ts-wrapper.multi .ts-control > div {
54
+ margin: 0!important;
55
+ }
43
56
  $warning-border-emphasis: shade-color($yellow, 60%);
44
57
  .bg-primary-subtle .btn-warning {
45
58
  border: 1px solid $warning-border-emphasis;
@@ -26,6 +26,7 @@ class <%= controller_class_name.split('::').last %>Controller < <%= parent_contr
26
26
  end
27
27
 
28
28
  def atributos_para_buscar
29
+ # FIXME: append _cont
29
30
  %i[<%= atributos_a_filtrar.map(&:name).join(' ') %>]
30
31
  end
31
32
 
@@ -9,7 +9,8 @@
9
9
  = @clase_modelo.new.decorate.new_link
10
10
  .ms-1
11
11
  = @clase_modelo.new.decorate.export_link(request.url)
12
- .collapse.p-2.border-bottom#filtros class="#{ 'show' if any_filter? }"
12
+ / FIXME: update
13
+ .collapse.p-2.border-bottom#filtros class="#{ 'show' if show_filters? }"
13
14
  .d-flex.align-items-center
14
15
  .px-2.d-none.d-sm-inline-block
15
16
  span.bi.bi-funnel-fill
@@ -20,7 +21,7 @@
20
21
  = button_tag class: 'btn btn-sm btn-primary col-auto' do
21
22
  span.bi.bi-search
22
23
  .col-auto
23
- = link_to <%= plural_route_name %>_path(clean: true),
24
+ = link_to <%= plural_route_name %>_path(mostrar_filtros: true),
24
25
  class: 'btn btn-sm btn-secondary col-auto' do
25
26
  | Limpiar
26
27
 
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.1.1.pre.5
4
+ version: 7.1.1.pre.6
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-07-22 00:00:00.000000000 Z
11
+ date: 2024-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -814,6 +814,7 @@ files:
814
814
  - pg_layout/app/javascript/controllers/nested_controller.js
815
815
  - pg_layout/app/javascript/controllers/notifications_controller.js
816
816
  - pg_layout/app/javascript/controllers/pg_form_controller.js
817
+ - pg_layout/app/javascript/controllers/selectize_controller.js
817
818
  - pg_layout/app/javascript/controllers/switcher_controller.js
818
819
  - pg_layout/app/javascript/utils/cookies.js
819
820
  - pg_layout/app/javascript/utils/utils.ts