base_editing_bootstrap 0.1.2
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 +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +13 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Dockerfile +57 -0
- data/LICENSE.txt +21 -0
- data/MIT-LICENSE +20 -0
- data/README.md +130 -0
- data/Rakefile +8 -0
- data/app/assets/config/base_editing_bootstrap_manifest.js +0 -0
- data/app/assets/images/base_editing_bootstrap/.keep +0 -0
- data/app/assets/stylesheets/base_editing_bootstrap/.keep +0 -0
- data/app/controllers/.keep +0 -0
- data/app/controllers/base_editing_controller.rb +209 -0
- data/app/controllers/concerns/.keep +0 -0
- data/app/controllers/restricted_area_controller.rb +26 -0
- data/app/helpers/.keep +0 -0
- data/app/helpers/base_editing_helper.rb +22 -0
- data/app/helpers/utilities/enum_helper.rb +24 -0
- data/app/helpers/utilities/form_helper.rb +61 -0
- data/app/helpers/utilities/modal_helper.rb +11 -0
- data/app/helpers/utilities/page_helper.rb +51 -0
- data/app/helpers/utilities/search_helper.rb +110 -0
- data/app/helpers/utilities/template_helper.rb +22 -0
- data/app/jobs/.keep +0 -0
- data/app/mailers/.keep +0 -0
- data/app/models/.keep +0 -0
- data/app/models/concerns/.keep +0 -0
- data/app/policies/base_model_policy.rb +42 -0
- data/app/views/.keep +0 -0
- data/app/views/base_editing/_edit_page_title_header.html.erb +3 -0
- data/app/views/base_editing/_editing_form_measure_unit.html.erb +15 -0
- data/app/views/base_editing/_form.html.erb +17 -0
- data/app/views/base_editing/_form_field.html.erb +6 -0
- data/app/views/base_editing/_form_field_header.html.erb +1 -0
- data/app/views/base_editing/_form_footer.html.erb +3 -0
- data/app/views/base_editing/_index_body.html.erb +17 -0
- data/app/views/base_editing/_index_main_buttons.html.erb +1 -0
- data/app/views/base_editing/_index_title_header.html.erb +10 -0
- data/app/views/base_editing/_navbar.html.erb +0 -0
- data/app/views/base_editing/_new_page_title_header.html.erb +3 -0
- data/app/views/base_editing/_search.html.erb +17 -0
- data/app/views/base_editing/_search_field.erb +4 -0
- data/app/views/base_editing/_search_footer.html.erb +1 -0
- data/app/views/base_editing/_search_result.html.erb +13 -0
- data/app/views/base_editing/_search_result_row.html.erb +8 -0
- data/app/views/base_editing/_tabs.html.erb +2 -0
- data/app/views/base_editing/cell_field/_base.html.erb +3 -0
- data/app/views/base_editing/cell_field/_timestamps.html.erb +3 -0
- data/app/views/base_editing/edit.html.erb +3 -0
- data/app/views/base_editing/form_field/_base.html.erb +7 -0
- data/app/views/base_editing/form_field/_date.html.erb +2 -0
- data/app/views/base_editing/form_field/_datetime.html.erb +2 -0
- data/app/views/base_editing/form_field/_decimal.html.erb +2 -0
- data/app/views/base_editing/form_field/_integer.html.erb +2 -0
- data/app/views/base_editing/index.html.erb +5 -0
- data/app/views/base_editing/new.html.erb +3 -0
- data/app/views/base_editing/show.html.erb +1 -0
- data/app/views/kaminari/_first_page.html.erb +3 -0
- data/app/views/kaminari/_gap.html.erb +3 -0
- data/app/views/kaminari/_last_page.html.erb +3 -0
- data/app/views/kaminari/_next_page.html.erb +3 -0
- data/app/views/kaminari/_page.html.erb +9 -0
- data/app/views/kaminari/_paginator.html.erb +17 -0
- data/app/views/kaminari/_prev_page.html.erb +3 -0
- data/base_editing_bootstrap.gemspec +39 -0
- data/cog.toml +26 -0
- data/config/initializers/base_field_error_proc.rb +1 -0
- data/config/locales/it.yml +67 -0
- data/config/routes.rb +2 -0
- data/docker-compose.yml +20 -0
- data/lib/base_editing_bootstrap/base_model.rb +30 -0
- data/lib/base_editing_bootstrap/engine.rb +15 -0
- data/lib/base_editing_bootstrap/forms/base.rb +101 -0
- data/lib/base_editing_bootstrap/is_validated.rb +20 -0
- data/lib/base_editing_bootstrap/searches/base.rb +47 -0
- data/lib/base_editing_bootstrap/searches/field.rb +18 -0
- data/lib/base_editing_bootstrap/version.rb +3 -0
- data/lib/base_editing_bootstrap.rb +26 -0
- data/lib/tasks/base_editing_bootstrap_tasks.rake +4 -0
- data/spec/support/external_shared/base_editing_controller_helpers.rb +154 -0
- data/spec/support/external_shared/base_model.rb +62 -0
- data/spec/support/external_shared/factory_bot.rb +28 -0
- data/spec/support/external_shared/pundit.rb +14 -0
- metadata +214 -0
@@ -0,0 +1,61 @@
|
|
1
|
+
module Utilities
|
2
|
+
module FormHelper
|
3
|
+
include TemplateHelper
|
4
|
+
##
|
5
|
+
# Metodo su cui eseguire override per i campi specifici rispetto all'oggetto gestito dal controller
|
6
|
+
# @deprecated Utilizza form_print_field(form, field) senza sovrascriverlo
|
7
|
+
# @param [Forms::Base] form
|
8
|
+
# @param [Symbol] field
|
9
|
+
def editing_form_print_field(form, field)
|
10
|
+
form_print_field(form, field)
|
11
|
+
end
|
12
|
+
|
13
|
+
##
|
14
|
+
# Metodo per il partial corretto per eseguire il render del campo della form
|
15
|
+
#
|
16
|
+
# @param [Forms::Base] form
|
17
|
+
# @param [Symbol] field
|
18
|
+
def form_print_field(form, field)
|
19
|
+
locals = {form:, field:}
|
20
|
+
case form.object.class.type_for_attribute(field).type
|
21
|
+
when :datetime
|
22
|
+
generic_field = "datetime"
|
23
|
+
when :date
|
24
|
+
generic_field = "date"
|
25
|
+
when :decimal
|
26
|
+
locals[:scale] = form.object.class.type_for_attribute(field).scale || 2
|
27
|
+
generic_field = "decimal"
|
28
|
+
when :float
|
29
|
+
locals[:scale] = 2 # usiamo il default dato che non abbiamo questa informazione negli attributes di rails
|
30
|
+
generic_field = "decimal"
|
31
|
+
when :integer
|
32
|
+
generic_field = "integer"
|
33
|
+
else
|
34
|
+
generic_field = "base"
|
35
|
+
end
|
36
|
+
|
37
|
+
template = find_template_with_fallbacks(
|
38
|
+
form.object,
|
39
|
+
field,
|
40
|
+
"form_field",
|
41
|
+
generic_field
|
42
|
+
)
|
43
|
+
Rails.logger.debug { "#{template}->#{ locals.inspect}" }
|
44
|
+
render template, **locals
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
BaseEditingBootstrap.deprecator.deprecate_methods(Utilities::FormHelper, editing_form_print_field: <<-MESSAGE
|
51
|
+
|
52
|
+
Non vogliamo utilizzare più il sistema degli helpers ma direttamente le view,
|
53
|
+
creare nella cartella del relativo modello la struttura di cartelle derivato
|
54
|
+
dal to_partial_path chiamato sull'oggetto del modello che stiamo generando
|
55
|
+
`nome_modello_plurale/nome_modello_singolare/form_field/_nomeField.html.erb`
|
56
|
+
a cui vengono passati i parametri form e field
|
57
|
+
|
58
|
+
<\%\# \locals: (form:, field:) -%\>
|
59
|
+
<\%\= form.check_box(:field_name, class: "form-control") \%\>
|
60
|
+
MESSAGE
|
61
|
+
)
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Utilities::ModalHelper
|
4
|
+
##
|
5
|
+
# Metodo speciale per l'inclusione del contenuto nelle modal, forzando il flush in modo da poter utilizzare
|
6
|
+
# più modal contemporaneamente
|
7
|
+
def content_for_modal(*args, &block)
|
8
|
+
opts = args.extract_options!
|
9
|
+
content_for(*args, opts.merge(flush: true), &block)
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Utilities::PageHelper
|
2
|
+
# @param [BaseModel] base_class
|
3
|
+
def title_mod_g(base_class)
|
4
|
+
"#{t("edit")} #{base_class.model_name.human}"
|
5
|
+
end
|
6
|
+
|
7
|
+
# @param [BaseModel] base_class
|
8
|
+
def title_new_g(base_class)
|
9
|
+
"#{t("new")} #{base_class.model_name.human}"
|
10
|
+
end
|
11
|
+
|
12
|
+
# Quando e se servirà verrà testato:
|
13
|
+
# - form_field dovrebbe essere il campo del modello che ha associato il has_one_attached
|
14
|
+
# def link_download(form_field)
|
15
|
+
# link_to rails_blob_path(form_field, disposition: 'attachment'), class: "btn btn-primary", style: "margin:5px;" do
|
16
|
+
# icon("fas", "eye") + content_tag(:span, " #{I18n.t('download')} #{form_field.filename.to_s}")
|
17
|
+
# end
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# def link_delete(form_field, delete_link)
|
21
|
+
# link_to delete_link, data: {turbo_method: :delete, turbo_confirm: t('are_you_sure')},
|
22
|
+
# class: "btn btn-danger", style: "margin:5px;" do
|
23
|
+
# icon("fas", "times") + content_tag(:span, " #{I18n.t('delete')} #{form_field.filename.to_s}")
|
24
|
+
# end
|
25
|
+
# end
|
26
|
+
|
27
|
+
# @param [TrueClass, FalseClass] valore
|
28
|
+
def boolean_to_icon(valore)
|
29
|
+
if valore
|
30
|
+
icon("check-lg", class: "text-success")
|
31
|
+
else
|
32
|
+
icon("x-lg", class: "text-danger")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# @param [String] path
|
37
|
+
# @param [Hash] options
|
38
|
+
def new_button(path, options = {})
|
39
|
+
options.merge!({class: 'btn btn-success btn-sm'})
|
40
|
+
link_to icon("plus-lg", I18n.t(:new)), path, options
|
41
|
+
end
|
42
|
+
|
43
|
+
# @param [BaseModel] obj instance
|
44
|
+
# @param [Symbol] field
|
45
|
+
def error_messages_for(obj, field)
|
46
|
+
if obj.errors.include?(field)
|
47
|
+
msg = obj.errors.full_messages_for(field).join(",")
|
48
|
+
content_tag(:div, icon("x-circle-fill", msg), class: "invalid-feedback")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
module Utilities
|
2
|
+
module SearchHelper
|
3
|
+
include TemplateHelper
|
4
|
+
|
5
|
+
##
|
6
|
+
# Per aggiungere bottoni:
|
7
|
+
# ES:
|
8
|
+
# def search_form_buttons(ransack_form, &block)
|
9
|
+
# super #<- questo serve per costruiri i bottoni definiti da super
|
10
|
+
# content_for(:search_form_buttons) do #<- questo serve per aggiungere al content_for un'altro bottone
|
11
|
+
# link_to "xls", admins_log_alarms_path(params: {q: params.permit(q:{})[:q]}, format: :xlsx), class: "btn btn-info", target: :_blank
|
12
|
+
# end
|
13
|
+
# end
|
14
|
+
# @return [ActiveSupport::SafeBuffer]
|
15
|
+
# @param [Ransack::Helpers::FormBuilder] ransack_form
|
16
|
+
def search_form_buttons(ransack_form)
|
17
|
+
content_for(:search_form_buttons) do
|
18
|
+
ransack_form.submit(I18n.translate('.search'), class: "btn btn-primary")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
##
|
23
|
+
# Renderizza la cella della tabella nella pagina della index
|
24
|
+
# @param [BaseModel] obj
|
25
|
+
# @param [Symbol] field
|
26
|
+
# @return [ActiveSupport::SafeBuffer]
|
27
|
+
def render_cell_field(obj, field)
|
28
|
+
generic_field = case field
|
29
|
+
when :created_at, :updated_at
|
30
|
+
"timestamps"
|
31
|
+
else
|
32
|
+
"base"
|
33
|
+
end
|
34
|
+
template = find_template_with_fallbacks(
|
35
|
+
obj,
|
36
|
+
field,
|
37
|
+
"cell_field",
|
38
|
+
generic_field
|
39
|
+
)
|
40
|
+
render template, obj:, field:
|
41
|
+
end
|
42
|
+
|
43
|
+
##
|
44
|
+
# Renderizza header della tabella della index
|
45
|
+
# @param [BaseModel] obj
|
46
|
+
# @param [Symbol] field
|
47
|
+
# @return [ActiveSupport::SafeBuffer]
|
48
|
+
def render_header_cell_field(obj, field)
|
49
|
+
content_tag(:th, obj.human_attribute_name(field))
|
50
|
+
end
|
51
|
+
|
52
|
+
##
|
53
|
+
# Restituisce il valore che vogliamo mostrare
|
54
|
+
def render_raw_field(obj, field)
|
55
|
+
case field
|
56
|
+
when :created_at, :updated_at
|
57
|
+
l(obj.read_attribute(field), format: :long)
|
58
|
+
else
|
59
|
+
obj[field]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def search_result_buttons(rec)
|
64
|
+
btns = ActiveSupport::SafeBuffer.new
|
65
|
+
|
66
|
+
if policy(rec).edit?
|
67
|
+
btns << link_to(icon("pencil-square"),
|
68
|
+
edit_custom_polymorphic_path(rec),
|
69
|
+
class: "btn btn-sm btn-primary me-1")
|
70
|
+
end
|
71
|
+
|
72
|
+
if policy(rec).show?
|
73
|
+
btns << link_to(icon(:eye),
|
74
|
+
show_custom_polymorphic_path(rec),
|
75
|
+
class: "btn btn-sm btn-primary me-1")
|
76
|
+
end
|
77
|
+
|
78
|
+
if policy(rec).destroy?
|
79
|
+
btns << link_to(icon(:trash),
|
80
|
+
destroy_custom_polymorphic_path(rec),
|
81
|
+
data: {
|
82
|
+
turbo_method: :delete,
|
83
|
+
turbo_confirm: t("are_you_sure")
|
84
|
+
},
|
85
|
+
class: "btn btn-sm btn-danger me-1")
|
86
|
+
end
|
87
|
+
btns
|
88
|
+
end
|
89
|
+
|
90
|
+
##
|
91
|
+
# Possibile override dei parametri da passare a ransack nella form
|
92
|
+
def search_form_for_params(ransack_instance)
|
93
|
+
[ransack_instance.ransack_query]
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
BaseEditingBootstrap.deprecator.deprecate_methods(Utilities::SearchHelper, render_raw_field: <<-MESSAGE
|
99
|
+
Abbiamo migrato ad un sistema di rendering tramite views,
|
100
|
+
è stato lasciato come memo per una migrazione semplificata
|
101
|
+
nel caso si voglia renderizzare un determinato campo in modo differente dal normale dato del DB
|
102
|
+
creare nalla path del modello la cartella cell_field e creare al suo interno il file con il nome
|
103
|
+
del _campo.html.erb e quindi inserire li il rendering (ES modello User, campo :name):
|
104
|
+
app/views/users/user/cell_field/_campo.html.erb
|
105
|
+
```
|
106
|
+
<%# locals: (obj:,field:) -%>
|
107
|
+
<td><%= obj.name.upcase %></td>
|
108
|
+
```
|
109
|
+
MESSAGE
|
110
|
+
)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Utilities::TemplateHelper
|
4
|
+
|
5
|
+
##
|
6
|
+
# Ricerca template con fallbacks.
|
7
|
+
# In ordine, cerca di trovare il partial per l'oggetto(tramite il metodo to_partial_path) e il campo specifico.
|
8
|
+
# In successione cerca poi per il partial con nome relativo al tipo di dato
|
9
|
+
# sempre nella cartella dell'oggetto
|
10
|
+
# ed infine nella cerca nella cartella del base editing
|
11
|
+
# @param [Object#to_partial_path] obj
|
12
|
+
# @param [Symbol] field
|
13
|
+
# @param [String] base_path
|
14
|
+
# @param [String] generic_field
|
15
|
+
def find_template_with_fallbacks(obj, field, base_path, generic_field)
|
16
|
+
obj_base_path = "#{obj.to_partial_path}/#{base_path}"
|
17
|
+
return "#{obj_base_path}/#{field}" if lookup_context.exists?(field, [obj_base_path], true)
|
18
|
+
return "#{obj_base_path}/#{generic_field}" if lookup_context.exists?(generic_field, [obj_base_path], true)
|
19
|
+
"base_editing/#{base_path}/#{generic_field}"
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
data/app/jobs/.keep
ADDED
File without changes
|
data/app/mailers/.keep
ADDED
File without changes
|
data/app/models/.keep
ADDED
File without changes
|
File without changes
|
@@ -0,0 +1,42 @@
|
|
1
|
+
class BaseModelPolicy < ApplicationPolicy
|
2
|
+
def index? = general_rule
|
3
|
+
|
4
|
+
def create? = general_rule
|
5
|
+
|
6
|
+
def update? = general_rule
|
7
|
+
|
8
|
+
def destroy? = general_rule
|
9
|
+
|
10
|
+
def show? = false
|
11
|
+
|
12
|
+
# Questo metodo può essere anche scritto specifico per azione:
|
13
|
+
# - permitted_attributes_for_create
|
14
|
+
# - permitted_attributes_for_update
|
15
|
+
def permitted_attributes = []
|
16
|
+
|
17
|
+
def editable_attributes = []
|
18
|
+
|
19
|
+
def permitted_attributes_for_ransack
|
20
|
+
record.class.column_names + record.class._ransackers.keys
|
21
|
+
end
|
22
|
+
|
23
|
+
def permitted_associations_for_ransack
|
24
|
+
[]
|
25
|
+
end
|
26
|
+
|
27
|
+
def search_fields = []
|
28
|
+
|
29
|
+
def search_result_fields = []
|
30
|
+
|
31
|
+
class Scope < Scope
|
32
|
+
def resolve
|
33
|
+
scope.all
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def general_rule
|
40
|
+
true
|
41
|
+
end
|
42
|
+
end
|
data/app/views/.keep
ADDED
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<%
|
2
|
+
# LOCALS disponibili per rendering del flag dell'unità di misura
|
3
|
+
# object: classe active_model che mi serve per cercare la traduzione dell'unità
|
4
|
+
# field: campo che dobbiamo tradurre
|
5
|
+
%>
|
6
|
+
<%# locals: (object:,field:) -%>
|
7
|
+
<%
|
8
|
+
translation = object.class.human_attribute_name("#{field}/unit", default: "")
|
9
|
+
unless translation.blank?
|
10
|
+
%>
|
11
|
+
<span class="input-group-text"><%= translation %></span>
|
12
|
+
<%
|
13
|
+
end
|
14
|
+
%>
|
15
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<div class="card" id="card_id">
|
2
|
+
<div class="card-header">
|
3
|
+
<%= form_for @object, builder: form_builder do |form| %>
|
4
|
+
|
5
|
+
<div class="card-body">
|
6
|
+
<%= render partial: "form_field_header", local: {form:} %>
|
7
|
+
<%= render collection: form_attributes(form.object),
|
8
|
+
partial: "form_field", locals: {form:} %>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<div class="card-footer">
|
12
|
+
<%= render partial: "form_footer", locals: {form: form} %>
|
13
|
+
</div>
|
14
|
+
|
15
|
+
<% end %>
|
16
|
+
</div>
|
17
|
+
</div>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<%= form.label(form_field, class: "form-label") %>
|
2
|
+
<div class="input-group mb-2 <%= form.object.validated? ? "has-validation" : "" %>">
|
3
|
+
<%= render partial: "editing_form_measure_unit", locals: {object: form.object, field: form_field} %>
|
4
|
+
<%= form_print_field(form, form_field) %>
|
5
|
+
<%= error_messages_for(form.object, form_field) %>
|
6
|
+
</div>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%# header degli elementi della form, nel caso dovessimo fare una testata %>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<div class="card">
|
2
|
+
<% if @search_instance.search_fields.count > 0 %>
|
3
|
+
<div class="card-header">
|
4
|
+
<%= render partial: "search" %>
|
5
|
+
</div>
|
6
|
+
<% end %>
|
7
|
+
|
8
|
+
<% if @search_instance.results.count > 0 %>
|
9
|
+
<div class="card-body table-responsive p-0">
|
10
|
+
<%= render partial: "search_result" %>
|
11
|
+
</div>
|
12
|
+
|
13
|
+
<div class="card-footer clearfix">
|
14
|
+
<%= render partial: "search_footer" %>
|
15
|
+
</div>
|
16
|
+
<% end %>
|
17
|
+
</div>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= new_button new_custom_polymorphic_path(base_class) if policy(base_class.new).create? %>
|
File without changes
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<%= search_form_for *search_form_for_params(@search_instance) do |f| %>
|
2
|
+
|
3
|
+
<div class="row g-2">
|
4
|
+
<%= render @search_instance.search_fields, ransack_form_builder: f %>
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<div class="row mt-4">
|
8
|
+
<div class="col-1">
|
9
|
+
<div class="btn-group mr-1">
|
10
|
+
<% search_form_buttons(f) %>
|
11
|
+
<%= content_for :search_form_buttons %>
|
12
|
+
</div>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
<% end %>
|
16
|
+
|
17
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= paginate @search_instance.results %>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<table class="table table-head-fixed text-nowrap <%= dom_class(@search_instance.model_klass,:search_results) %>">
|
2
|
+
<thead>
|
3
|
+
<tr>
|
4
|
+
<% @search_instance.search_result_fields.each do |srf| %>
|
5
|
+
<%= render_header_cell_field(@search_instance.model_klass, srf) %>
|
6
|
+
<% end %>
|
7
|
+
<th class="action_col"></th>
|
8
|
+
</tr>
|
9
|
+
</thead>
|
10
|
+
<tbody>
|
11
|
+
<%= render partial: 'search_result_row', collection: @search_instance.results, as: :obj %>
|
12
|
+
</tbody>
|
13
|
+
</table>
|
@@ -0,0 +1 @@
|
|
1
|
+
<h1>Show</h1>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<% if page.current? %>
|
2
|
+
<li class="page-item active">
|
3
|
+
<%= content_tag :a, page, data: {remote: remote}, rel: page.rel, class: 'page-link' %>
|
4
|
+
</li>
|
5
|
+
<% else %>
|
6
|
+
<li class="page-item">
|
7
|
+
<%= link_to page, url, remote: remote, rel: page.rel, class: 'page-link' %>
|
8
|
+
</li>
|
9
|
+
<% end %>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<%= paginator.render do %>
|
2
|
+
<nav>
|
3
|
+
<ul class="pagination">
|
4
|
+
<%= first_page_tag unless current_page.first? %>
|
5
|
+
<%= prev_page_tag unless current_page.first? %>
|
6
|
+
<% each_page do |page| %>
|
7
|
+
<% if page.left_outer? || page.right_outer? || page.inside_window? %>
|
8
|
+
<%= page_tag page %>
|
9
|
+
<% elsif !page.was_truncated? -%>
|
10
|
+
<%= gap_tag %>
|
11
|
+
<% end %>
|
12
|
+
<% end %>
|
13
|
+
<%= next_page_tag unless current_page.last? %>
|
14
|
+
<%= last_page_tag unless current_page.last? %>
|
15
|
+
</ul>
|
16
|
+
</nav>
|
17
|
+
<% end %>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative "lib/base_editing_bootstrap/version"
|
2
|
+
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = "base_editing_bootstrap"
|
5
|
+
spec.version = BaseEditingBootstrap::VERSION
|
6
|
+
spec.authors = ["Marino Bonetti"]
|
7
|
+
spec.email = ["marinobonetti@gmail.com"]
|
8
|
+
spec.summary = "BaseEditing: funzionalità di base per cms rails"
|
9
|
+
spec.description = "Raccolta di utility per semplificare costruzione cms in rails"
|
10
|
+
spec.homepage = "https://github.com/oniram88/BaseEditingBootstrap"
|
11
|
+
spec.license = "MIT"
|
12
|
+
spec.required_ruby_version = ">= 3.1"
|
13
|
+
|
14
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
15
|
+
spec.metadata["source_code_uri"] = "https://github.com/oniram88/BaseEditingBootstrap"
|
16
|
+
spec.metadata["changelog_uri"] = "https://github.com/oniram88/BaseEditingBootstrap/CHANGELOG"
|
17
|
+
|
18
|
+
# Specify which files should be added to the gem when it is released.
|
19
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
20
|
+
spec.files = Dir.chdir(__dir__) do
|
21
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
22
|
+
(File.expand_path(f) == __FILE__) ||
|
23
|
+
f.start_with?(*%w[bin/ test/ spec/ features/ .git .gitlab-ci.yml appveyor Gemfile])
|
24
|
+
end
|
25
|
+
end
|
26
|
+
spec.files += Dir['spec/support/external_shared/*.rb']
|
27
|
+
|
28
|
+
spec.add_dependency "rails", ">= 7.0"
|
29
|
+
spec.add_dependency "pundit", ">= 2.3.1"
|
30
|
+
|
31
|
+
# Search
|
32
|
+
spec.add_dependency 'ransack', '>= 4.0.0'
|
33
|
+
# Pagination
|
34
|
+
spec.add_dependency 'kaminari', '>= 1.2.2'
|
35
|
+
|
36
|
+
spec.add_development_dependency "rspec-rails"
|
37
|
+
spec.add_development_dependency "factory_bot_rails"
|
38
|
+
|
39
|
+
end
|
data/cog.toml
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
from_latest_tag = false
|
2
|
+
ignore_merge_commits = false
|
3
|
+
disable_changelog = false
|
4
|
+
generate_mono_repository_global_tag = true
|
5
|
+
branch_whitelist = []
|
6
|
+
skip_ci = "[skip ci]"
|
7
|
+
skip_untracked = false
|
8
|
+
pre_bump_hooks = []
|
9
|
+
post_bump_hooks = [
|
10
|
+
"git push",
|
11
|
+
"git push origin {{version}}"
|
12
|
+
]
|
13
|
+
pre_package_bump_hooks = []
|
14
|
+
post_package_bump_hooks = []
|
15
|
+
|
16
|
+
[git_hooks]
|
17
|
+
|
18
|
+
[commit_types]
|
19
|
+
|
20
|
+
[changelog]
|
21
|
+
path = "CHANGELOG.md"
|
22
|
+
authors = []
|
23
|
+
|
24
|
+
[bump_profiles]
|
25
|
+
|
26
|
+
[packages]
|
@@ -0,0 +1 @@
|
|
1
|
+
ActionView::Base.field_error_proc = Proc.new { |html_tag, instance| html_tag }
|