matestack-ui-bootstrap 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +8 -0
- data/README.md +26 -0
- data/Rakefile +43 -0
- data/app/assets/images/avatar-placeholder.png +0 -0
- data/app/assets/images/icons/bootstrap-icons.svg +1 -0
- data/app/concepts/matestack/ui/bootstrap/apps/admin_template.rb +85 -0
- data/app/concepts/matestack/ui/bootstrap/components/accordion.rb +53 -0
- data/app/concepts/matestack/ui/bootstrap/components/alert.js +53 -0
- data/app/concepts/matestack/ui/bootstrap/components/alert.rb +34 -0
- data/app/concepts/matestack/ui/bootstrap/components/avatar.rb +27 -0
- data/app/concepts/matestack/ui/bootstrap/components/badge.rb +30 -0
- data/app/concepts/matestack/ui/bootstrap/components/breadcrumb.rb +46 -0
- data/app/concepts/matestack/ui/bootstrap/components/button.rb +54 -0
- data/app/concepts/matestack/ui/bootstrap/components/button_group.rb +36 -0
- data/app/concepts/matestack/ui/bootstrap/components/card.rb +100 -0
- data/app/concepts/matestack/ui/bootstrap/components/carousel.js +79 -0
- data/app/concepts/matestack/ui/bootstrap/components/carousel.rb +85 -0
- data/app/concepts/matestack/ui/bootstrap/components/chart.js +232 -0
- data/app/concepts/matestack/ui/bootstrap/components/chart.rb +71 -0
- data/app/concepts/matestack/ui/bootstrap/components/close.rb +30 -0
- data/app/concepts/matestack/ui/bootstrap/components/collapse.js +84 -0
- data/app/concepts/matestack/ui/bootstrap/components/collapse.rb +43 -0
- data/app/concepts/matestack/ui/bootstrap/components/dropdown.js +14 -0
- data/app/concepts/matestack/ui/bootstrap/components/dropdown.rb +116 -0
- data/app/concepts/matestack/ui/bootstrap/components/icon.rb +19 -0
- data/app/concepts/matestack/ui/bootstrap/components/list_group.rb +83 -0
- data/app/concepts/matestack/ui/bootstrap/components/modal.js +90 -0
- data/app/concepts/matestack/ui/bootstrap/components/modal.rb +106 -0
- data/app/concepts/matestack/ui/bootstrap/components/navbar.rb +120 -0
- data/app/concepts/matestack/ui/bootstrap/components/page_heading.rb +28 -0
- data/app/concepts/matestack/ui/bootstrap/components/pagination.rb +40 -0
- data/app/concepts/matestack/ui/bootstrap/components/popover.js +26 -0
- data/app/concepts/matestack/ui/bootstrap/components/popover.rb +92 -0
- data/app/concepts/matestack/ui/bootstrap/components/progress.rb +65 -0
- data/app/concepts/matestack/ui/bootstrap/components/scrollspy.rb +33 -0
- data/app/concepts/matestack/ui/bootstrap/components/section_card.rb +31 -0
- data/app/concepts/matestack/ui/bootstrap/components/spinner.rb +31 -0
- data/app/concepts/matestack/ui/bootstrap/components/tab_nav.rb +81 -0
- data/app/concepts/matestack/ui/bootstrap/components/tab_nav_content.rb +32 -0
- data/app/concepts/matestack/ui/bootstrap/components/toast.js +79 -0
- data/app/concepts/matestack/ui/bootstrap/components/toast.rb +99 -0
- data/app/concepts/matestack/ui/bootstrap/components/tooltip.js +26 -0
- data/app/concepts/matestack/ui/bootstrap/components/tooltip.rb +82 -0
- data/app/concepts/matestack/ui/bootstrap/content/collection/collection.rb +112 -0
- data/app/concepts/matestack/ui/bootstrap/content/collection/collection.scss +10 -0
- data/app/concepts/matestack/ui/bootstrap/content/collection/content.rb +101 -0
- data/app/concepts/matestack/ui/bootstrap/content/collection/filter.rb +33 -0
- data/app/concepts/matestack/ui/bootstrap/content/collection/paginate.rb +92 -0
- data/app/concepts/matestack/ui/bootstrap/content/figure.rb +7 -0
- data/app/concepts/matestack/ui/bootstrap/form/checkbox.rb +90 -0
- data/app/concepts/matestack/ui/bootstrap/form/date.js +38 -0
- data/app/concepts/matestack/ui/bootstrap/form/date.rb +98 -0
- data/app/concepts/matestack/ui/bootstrap/form/input.rb +123 -0
- data/app/concepts/matestack/ui/bootstrap/form/radio.rb +65 -0
- data/app/concepts/matestack/ui/bootstrap/form/select.haml +11 -0
- data/app/concepts/matestack/ui/bootstrap/form/select.rb +74 -0
- data/app/concepts/matestack/ui/bootstrap/form/submit.rb +20 -0
- data/app/concepts/matestack/ui/bootstrap/form/switch.rb +90 -0
- data/app/concepts/matestack/ui/bootstrap/layout/column.rb +47 -0
- data/app/concepts/matestack/ui/bootstrap/layout/container.rb +25 -0
- data/app/concepts/matestack/ui/bootstrap/layout/row.rb +15 -0
- data/app/concepts/matestack/ui/bootstrap/layout/sidebar.js +64 -0
- data/app/concepts/matestack/ui/bootstrap/layout/sidebar.rb +45 -0
- data/app/concepts/matestack/ui/bootstrap/layout/sidebar.scss +57 -0
- data/app/concepts/matestack/ui/bootstrap/pages/devise/sign_in.rb +40 -0
- data/app/concepts/matestack/ui/bootstrap/registry.rb +63 -0
- data/app/helpers/matestack/ui/bootstrap/application_helper.rb +13 -0
- data/app/javascript/matestack-ui-bootstrap/index.js +26 -0
- data/app/javascript/matestack-ui-bootstrap/stylesheets/matestack-ui-bootstrap.scss +65 -0
- data/app/javascript/packs/matestack-ui-bootstrap.js +2 -0
- data/config/routes.rb +2 -0
- data/config/webpack/development.js +5 -0
- data/config/webpack/environment.js +29 -0
- data/config/webpack/production.js +33 -0
- data/config/webpack/test.js +5 -0
- data/config/webpacker.yml +96 -0
- data/lib/matestack/ui/bootstrap.rb +27 -0
- data/lib/matestack/ui/bootstrap/engine.rb +26 -0
- data/lib/matestack/ui/bootstrap/version.rb +7 -0
- data/lib/tasks/matestack/ui/bootstrap_tasks.rake +66 -0
- metadata +137 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
import * as bootstrap from 'bootstrap'
|
2
|
+
|
3
|
+
MatestackUiCore.Vue.component('matestack-ui-bootstrap-tooltip', {
|
4
|
+
|
5
|
+
mixins: [MatestackUiCore.componentMixin],
|
6
|
+
data() {
|
7
|
+
return {
|
8
|
+
// tooltipInstance: undefined
|
9
|
+
|
10
|
+
};
|
11
|
+
},
|
12
|
+
methods: {
|
13
|
+
|
14
|
+
},
|
15
|
+
mounted: function() {
|
16
|
+
const self = this;
|
17
|
+
var tooltip = self.$el
|
18
|
+
self.tooltipInstance = new bootstrap.Tooltip(tooltip)
|
19
|
+
}
|
20
|
+
// created: function() {
|
21
|
+
// },
|
22
|
+
|
23
|
+
// beforeDestroy: function() {
|
24
|
+
|
25
|
+
// },
|
26
|
+
});
|
@@ -0,0 +1,82 @@
|
|
1
|
+
class Matestack::Ui::Bootstrap::Components::Tooltip < Matestack::Ui::VueJsComponent
|
2
|
+
vue_js_component_name "matestack-ui-bootstrap-tooltip"
|
3
|
+
|
4
|
+
DATA_ALIAS_ATTRIBUTES = %i[container delay selector html template fallback_placement]
|
5
|
+
|
6
|
+
DATA_ALIAS_ATTRIBUTES.each do |attribute|
|
7
|
+
optional "#{attribute}": { as: :"bs_#{attribute}"}
|
8
|
+
end
|
9
|
+
|
10
|
+
# TODO:
|
11
|
+
# for security reasons the sanitize, sanitizeFn and whiteList options cannot be supplied using data attributes.
|
12
|
+
# sanitize sanitize_fn white_list
|
13
|
+
# optional :content
|
14
|
+
optional :tag
|
15
|
+
optional class: { as: :bs_class }
|
16
|
+
optional id: { as: :bs_id }
|
17
|
+
DATA_ATTRIBUTES = %i[title text variant animation placement tabindex trigger boundary offset popper_config]
|
18
|
+
optional *DATA_ATTRIBUTES
|
19
|
+
|
20
|
+
def response
|
21
|
+
case tag
|
22
|
+
when :div
|
23
|
+
div tooltip_attributes do
|
24
|
+
element_partial
|
25
|
+
end
|
26
|
+
when :span
|
27
|
+
span tooltip_attributes do
|
28
|
+
element_partial
|
29
|
+
end
|
30
|
+
when :link
|
31
|
+
link tooltip_attributes
|
32
|
+
else
|
33
|
+
bs_btn tooltip_attributes
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
protected
|
38
|
+
|
39
|
+
def element_partial
|
40
|
+
if options[:slots] && options[:slots][:element]
|
41
|
+
slot options[:slots][:element]
|
42
|
+
else
|
43
|
+
bs_btn variant: variant, attributes: { 'style': "pointer-events: none;" }, text: text
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def tooltip_attributes
|
48
|
+
attributes = {}.tap do |hash|
|
49
|
+
hash[:class] = tooltip_classes
|
50
|
+
hash[:style] = variant if (tag == :button or !tag.present?)
|
51
|
+
|
52
|
+
hash[:attributes] = { role: "button", title: "#{title}", tabindex: "#{tabindex}" } if (tag == :link or tag == :a)
|
53
|
+
|
54
|
+
hash[:text] = text if text.present?
|
55
|
+
|
56
|
+
hash[:data] = {}.tap do |hash|
|
57
|
+
DATA_ALIAS_ATTRIBUTES.each do |attribute|
|
58
|
+
hash["bs-#{attribute}"] = self.send(:"bs_#{attribute}") if self.send(:"bs_#{attribute}")
|
59
|
+
end
|
60
|
+
DATA_ATTRIBUTES.each do |attribute|
|
61
|
+
hash["bs-#{attribute}"] = self.send(:"#{attribute}") if self.send(:"#{attribute}")
|
62
|
+
end
|
63
|
+
hash["bs-toggle"] = "tooltip"
|
64
|
+
hash["bs-type"] = tag
|
65
|
+
# hash[:'original-title'] = content
|
66
|
+
end
|
67
|
+
end
|
68
|
+
html_attributes.merge(
|
69
|
+
attributes
|
70
|
+
)
|
71
|
+
end
|
72
|
+
|
73
|
+
def tooltip_classes
|
74
|
+
[].tap do |classes|
|
75
|
+
classes << "d-inline-block" if (tag == :span or tag == :div)
|
76
|
+
classes << "btn btn-#{variant || 'link'}" if (tag == :link or !tag.present?)
|
77
|
+
|
78
|
+
classes << bs_class
|
79
|
+
end.join(' ').strip
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
class Matestack::Ui::Bootstrap::Content::Collection::Collection < Matestack::Ui::Component
|
2
|
+
include Matestack::Ui::Core::Collection::Helper
|
3
|
+
include Matestack::Ui::Bootstrap::Content::Collection::Content
|
4
|
+
include Matestack::Ui::Bootstrap::Content::Collection::Filter
|
5
|
+
include Matestack::Ui::Bootstrap::Content::Collection::Paginate
|
6
|
+
|
7
|
+
# html attributes
|
8
|
+
optional id: { as: :bs_id }
|
9
|
+
|
10
|
+
# table configuration
|
11
|
+
optional :items
|
12
|
+
optional :columns
|
13
|
+
optional :filters
|
14
|
+
optional :footer
|
15
|
+
optional :paginate
|
16
|
+
optional :rerender_on
|
17
|
+
optional :item_actions_proc
|
18
|
+
optional :collection_rendering_proc
|
19
|
+
optional :slots
|
20
|
+
|
21
|
+
# bootstrap settings
|
22
|
+
optional :responsive
|
23
|
+
optional :variant
|
24
|
+
optional :striped
|
25
|
+
optional :hoverable
|
26
|
+
optional :border_variant
|
27
|
+
optional :borderless
|
28
|
+
|
29
|
+
attr_accessor :processed_filters
|
30
|
+
|
31
|
+
def response
|
32
|
+
div class: "smart-collection" do
|
33
|
+
filter_partial
|
34
|
+
content
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def collection
|
42
|
+
return @collection if @collection
|
43
|
+
settings = {}.tap do |h|
|
44
|
+
h[:id] = bs_id || "smartcollection"
|
45
|
+
h[:data] = filtered_query
|
46
|
+
h[:base_count] = items.count
|
47
|
+
h[:init_limit] = paginate if paginate
|
48
|
+
h[:filtered_count] = filtered_query.count if paginate
|
49
|
+
end
|
50
|
+
@collection = set_collection(settings)
|
51
|
+
end
|
52
|
+
|
53
|
+
def collection_id
|
54
|
+
collection.config[:id]
|
55
|
+
end
|
56
|
+
|
57
|
+
def filtered_query
|
58
|
+
return @filtered_query if @filtered_query
|
59
|
+
@filtered_query = items
|
60
|
+
filters.select { |key, value| '.'.in? key.to_s }.each do |key, value|
|
61
|
+
associated_name = key.to_s.split(".").first
|
62
|
+
@filtered_query = @filtered_query.joins(associated_name.to_sym).all
|
63
|
+
if value.is_a?(Hash)
|
64
|
+
processed_filters[key] = value
|
65
|
+
@filtered_query = add_query_filter(@filtered_query, associated_name, key, value)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
filters.reject { |key, value| '.'.in? key.to_s }.each do |key, value|
|
69
|
+
if value.is_a?(Hash)
|
70
|
+
processed_filters[key] = value
|
71
|
+
@filtered_query = add_query_filter(@filtered_query, nil, key, value)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
@filtered_query
|
75
|
+
end
|
76
|
+
|
77
|
+
def add_query_filter(query, associated_name, key, filter_config)
|
78
|
+
value = get_collection_filter(collection_id)[key.to_sym]
|
79
|
+
if value.present?
|
80
|
+
if associated_name.present?
|
81
|
+
table_name = items.klass.reflections[associated_name].table_name
|
82
|
+
key = key.to_s.gsub(associated_name, table_name)
|
83
|
+
else
|
84
|
+
table_name = items.klass.table_name
|
85
|
+
key = key.to_s
|
86
|
+
end
|
87
|
+
case filter_config[:match]
|
88
|
+
when :equals
|
89
|
+
query = query.where("#{key}": value)
|
90
|
+
when :starts_with
|
91
|
+
query = query.where("lower(#{key}) LIKE ?", "#{value.downcase}%")
|
92
|
+
when :ends_with
|
93
|
+
query = query.where("lower(#{key}) LIKE ?", "%#{value.downcase}")
|
94
|
+
when :like
|
95
|
+
query = query.where("lower(#{key}) LIKE ?", "%#{value.downcase}%")
|
96
|
+
else
|
97
|
+
query = query.where("#{key}": value)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
query
|
101
|
+
end
|
102
|
+
|
103
|
+
def head_columns
|
104
|
+
columns.map { |key, value| value.is_a?(Hash) ? value[:heading] : value }
|
105
|
+
end
|
106
|
+
|
107
|
+
def processed_filters
|
108
|
+
@filters ||= {}
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module Matestack::Ui::Bootstrap::Content::Collection::Content
|
2
|
+
|
3
|
+
def content
|
4
|
+
bs_row id: 'content' do
|
5
|
+
bs_col do
|
6
|
+
async id: collection_id, rerender_on: "#{collection_id}-update, #{rerender_on} " do
|
7
|
+
collection_content collection.config do
|
8
|
+
div class: responsive_class do
|
9
|
+
if slots && slots[:collection_rendering]
|
10
|
+
slot slots[:collection_rendering].call(collection.paginated_data)
|
11
|
+
elsif columns
|
12
|
+
div class: "table-responsive" do
|
13
|
+
table table_attributes do
|
14
|
+
table_head
|
15
|
+
table_body
|
16
|
+
table_footer
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
paginate_partial if paginate.present?
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def table_head
|
29
|
+
thead do
|
30
|
+
tr do
|
31
|
+
columns&.each do |key, value|
|
32
|
+
th text: value.is_a?(Hash) ? value[:heading] : value, class: cell_class(value), attributes: { scope: :col }
|
33
|
+
end
|
34
|
+
th if slots && slots[:table_item_actions]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def table_body
|
40
|
+
tbody do
|
41
|
+
collection.paginated_data.each_with_index do |data, index|
|
42
|
+
tr class: 'align-middle' do
|
43
|
+
columns.each do |key, value|
|
44
|
+
cell(data, key, value)
|
45
|
+
end
|
46
|
+
if slots && slots[:table_item_actions]
|
47
|
+
td class: 'text-end' do
|
48
|
+
slot slots[:table_item_actions].call(data)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def table_footer
|
57
|
+
tfoot do
|
58
|
+
tr do
|
59
|
+
footer&.each do |value|
|
60
|
+
td text: value
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end if footer
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def cell(data, key, value)
|
69
|
+
td text: cell_text(data, key, value), class: cell_class(value)
|
70
|
+
end
|
71
|
+
|
72
|
+
def cell_class(value)
|
73
|
+
[].tap do |classes|
|
74
|
+
classes << "text-#{value[:text]}" if value[:text]
|
75
|
+
classes << "align-#{value[:align]}" if value[:align]
|
76
|
+
end.join(' ') if value.is_a? Hash
|
77
|
+
end
|
78
|
+
|
79
|
+
def cell_text(data, key, value)
|
80
|
+
text = data.instance_eval(key.to_s)
|
81
|
+
text = value[:format].call(text) if value.is_a?(Hash) && value[:format]
|
82
|
+
text
|
83
|
+
end
|
84
|
+
|
85
|
+
def table_attributes
|
86
|
+
klass = ['table'].tap do |classes|
|
87
|
+
classes << "table-#{variant}" if variant
|
88
|
+
classes << "table-striped" if striped
|
89
|
+
classes << "table-hover" if hoverable
|
90
|
+
classes << "table-bordered border-#{border_variant}" if border_variant
|
91
|
+
classes << "table-borderless" if borderless
|
92
|
+
end.join(' ').strip
|
93
|
+
{ id: collection_id, class: klass }
|
94
|
+
end
|
95
|
+
|
96
|
+
def responsive_class
|
97
|
+
return unless responsive
|
98
|
+
responsive === true ? 'table-responsive' : "table-responsive-#{responsive}"
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Matestack::Ui::Bootstrap::Content::Collection::Filter
|
2
|
+
|
3
|
+
def filter_partial
|
4
|
+
collection_filter collection.config do
|
5
|
+
bs_row class: 'mt-2 mb-4' do
|
6
|
+
div class: 'col-auto' do
|
7
|
+
bs_row do
|
8
|
+
processed_filters.each do |key, config|
|
9
|
+
bs_col do
|
10
|
+
filter_input key, config
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def filter_input(key, config)
|
20
|
+
attributes = {
|
21
|
+
key: key,
|
22
|
+
type: :text,
|
23
|
+
placeholder: config[:placeholder] || key.to_s,
|
24
|
+
}
|
25
|
+
case config[:type]
|
26
|
+
when :select
|
27
|
+
collection_filter_select attributes.merge(class: 'form-select', options: config[:options])
|
28
|
+
else
|
29
|
+
collection_filter_input attributes.merge(class: 'form-control')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module Matestack::Ui::Bootstrap::Content::Collection::Paginate
|
2
|
+
|
3
|
+
def paginate_partial
|
4
|
+
div class: "current-pagination-state ps-2" do
|
5
|
+
small do
|
6
|
+
plain "showing #{@collection.from}"
|
7
|
+
plain "to #{@collection.to}"
|
8
|
+
plain "of #{@collection.filtered_count}"
|
9
|
+
if (@collection.base_count - @collection.filtered_count) > 0
|
10
|
+
plain "(#{@collection.base_count - @collection.filtered_count} hidden by filter)"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
pagination_nav_partial
|
15
|
+
end
|
16
|
+
|
17
|
+
def pagination_nav_partial
|
18
|
+
nav class: "table-responsive", attributes: { style: "display: -webkit-box;" } do
|
19
|
+
ul class: ul_classes do
|
20
|
+
li class: "page-item #{ 'disabled' if current_page == 1 }" do
|
21
|
+
collection_content_previous class: 'page-link' do
|
22
|
+
bs_icon name: "chevron-left", size: 10
|
23
|
+
end
|
24
|
+
end
|
25
|
+
if @collection.pages.count >= 9 && current_page > 5
|
26
|
+
li class: "page-item" do
|
27
|
+
collection_content_page_link class: 'page-link', page: 1 do
|
28
|
+
plain 1
|
29
|
+
end
|
30
|
+
end
|
31
|
+
unless current_page == 6
|
32
|
+
li class: "page-item disabled" do
|
33
|
+
link class: 'page-link', path: "#" do
|
34
|
+
plain "..."
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
@collection.pages.each do |page|
|
40
|
+
if (current_page-page).abs < 5
|
41
|
+
li class: "page-item #{ 'active' if current_page == page }" do
|
42
|
+
collection_content_page_link class: 'page-link', page: page do
|
43
|
+
plain page
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
if @collection.pages.count >= 9 && last_page-current_page > 4
|
49
|
+
unless current_page == last_page-5
|
50
|
+
li class: "page-item disabled" do
|
51
|
+
link class: 'page-link', path: "#" do
|
52
|
+
plain "..."
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
li class: "page-item" do
|
57
|
+
collection_content_page_link class: 'page-link', page: last_page do
|
58
|
+
plain last_page
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
li class: "page-item #{ 'disabled' if current_page == last_page }" do
|
63
|
+
collection_content_next class: 'page-link' do
|
64
|
+
bs_icon name: "chevron-right", size: 10
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def ul_classes
|
72
|
+
[].tap do |classes|
|
73
|
+
classes << "pagination"
|
74
|
+
classes << "justify-content-end"
|
75
|
+
classes << "mt-3"
|
76
|
+
end.join(' ').strip
|
77
|
+
end
|
78
|
+
|
79
|
+
def current_page
|
80
|
+
current_offset = params["#{bs_id}-offset"].try(:to_i)
|
81
|
+
(current_offset/paginate)+1 if current_offset && paginate.present?
|
82
|
+
end
|
83
|
+
|
84
|
+
def last_page
|
85
|
+
if @collection.filtered_count%paginate == 0
|
86
|
+
(@collection.filtered_count/paginate)
|
87
|
+
else
|
88
|
+
(@collection.filtered_count/paginate)+1
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|