weeler 0.0.4 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/.rspec +1 -1
- data/.travis.yml +7 -2
- data/CHANGELOG.md +149 -1
- data/LICENSE.txt +2 -2
- data/README.md +83 -1
- data/app/.DS_Store +0 -0
- data/app/assets/javascripts/weeler/init.js.coffee +13 -2
- data/app/assets/javascripts/weeler/lib/notify.js +18 -0
- data/app/assets/javascripts/weeler/lib/sortable.js +9 -0
- data/app/assets/stylesheets/weeler/init.css.erb +2 -1
- data/app/assets/stylesheets/weeler/style.css.scss +22 -0
- data/app/controllers/concerns/weeler/section_seo.rb +16 -0
- data/app/controllers/weeler/administration_controller.rb +11 -0
- data/app/controllers/weeler/application_controller.rb +5 -0
- data/app/controllers/weeler/base_controller.rb +16 -12
- data/app/controllers/weeler/configuration_controller.rb +9 -0
- data/app/controllers/weeler/content_controller.rb +12 -0
- data/app/controllers/weeler/home_controller.rb +5 -2
- data/app/controllers/weeler/seo_items_controller.rb +24 -0
- data/app/controllers/weeler/settings_controller.rb +21 -0
- data/app/controllers/weeler/static_sections_controller.rb +19 -0
- data/app/controllers/weeler/translations_controller.rb +36 -18
- data/app/models/concerns/weeler/seoable.rb +61 -0
- data/app/models/concerns/weeler/sluger.rb +32 -0
- data/app/models/settings.rb +2 -0
- data/app/models/weeler/seo.rb +9 -0
- data/app/views/kaminari/{_first_page.html.erb → weeler/_first_page.html.erb} +1 -1
- data/app/views/kaminari/{_gap.html.erb → weeler/_gap.html.erb} +1 -1
- data/app/views/kaminari/{_last_page.html.erb → weeler/_last_page.html.erb} +1 -1
- data/app/views/kaminari/{_next_page.html.erb → weeler/_next_page.html.erb} +1 -1
- data/app/views/kaminari/{_page.html.erb → weeler/_page.html.erb} +0 -0
- data/app/views/kaminari/{_paginator.html.erb → weeler/_paginator.html.erb} +1 -1
- data/app/views/kaminari/{_prev_page.html.erb → weeler/_prev_page.html.erb} +1 -1
- data/app/views/layouts/weeler/base.html.haml +22 -0
- data/{lib/generators/weeler/templates/views/weeler/example/index.html.erb → app/views/weeler/administration/_filter.html.haml} +0 -0
- data/app/views/weeler/administration/_header_row.html.haml +5 -0
- data/app/views/weeler/administration/_row.html.haml +5 -0
- data/app/views/weeler/administration/_side_navbar.html.haml +8 -0
- data/app/views/weeler/administration/index.html.haml +17 -0
- data/app/views/weeler/administration/welcome.html.haml +5 -0
- data/app/views/weeler/base/_flash.html.haml +3 -0
- data/app/views/weeler/base/_footer.html.haml +2 -0
- data/app/views/weeler/base/_header_navbar.html.haml +19 -0
- data/app/views/weeler/base/_side_navbar.html.haml +2 -0
- data/app/views/weeler/configuration/_side_navbar.html.haml +12 -0
- data/app/views/weeler/configuration/index.html.haml +3 -0
- data/app/views/weeler/content/_error_messages.html.haml +5 -0
- data/app/views/weeler/content/_form.html.haml +6 -0
- data/app/views/weeler/content/_list.html.haml +23 -0
- data/app/views/weeler/content/_object_seo.html.haml +31 -0
- data/app/views/weeler/content/_side_navbar.html.haml +17 -0
- data/app/views/weeler/content/_sortable_list.html.haml +24 -0
- data/app/views/weeler/content/edit.html.haml +2 -0
- data/app/views/weeler/content/index.html.haml +10 -0
- data/app/views/weeler/content/new.html.haml +2 -0
- data/app/views/weeler/content/welcome.html.haml +3 -0
- data/app/views/weeler/home/_side_navbar.html.haml +8 -0
- data/app/views/weeler/home/about.html.haml +15 -0
- data/app/views/weeler/home/index.html.haml +3 -0
- data/app/views/weeler/seo_items/edit.html.haml +28 -0
- data/app/views/weeler/seo_items/index.html.haml +15 -0
- data/app/views/weeler/settings/index.html.haml +19 -0
- data/app/views/weeler/static_sections/show.html.haml +26 -0
- data/app/views/weeler/translations/_form.html.haml +27 -0
- data/app/views/weeler/translations/_translation.html.haml +11 -0
- data/app/views/weeler/translations/edit.html.haml +14 -0
- data/app/views/weeler/translations/index.html.haml +76 -0
- data/app/views/weeler/translations/new.html.haml +13 -0
- data/lib/.DS_Store +0 -0
- data/lib/generators/weeler/.DS_Store +0 -0
- data/lib/generators/weeler/install_generator.rb +30 -26
- data/lib/generators/weeler/templates/assets/javascripts/weeler/app/index.js +2 -0
- data/lib/generators/weeler/templates/assets/stylesheets/weeler/app/index.css +4 -0
- data/lib/generators/weeler/templates/controllers/weeler/application_controller.rb +6 -0
- data/lib/generators/weeler/templates/initializers/weeler.rb +30 -2
- data/lib/generators/weeler/templates/migrations/create_weeler_seos.rb +14 -0
- data/lib/generators/weeler/templates/migrations/create_weeler_settings.rb +17 -0
- data/lib/generators/weeler/templates/migrations/translate_weeler_seos.rb +15 -0
- data/lib/generators/weeler/templates/views/weeler/.keep +0 -0
- data/lib/i18n/backend/weeler.rb +102 -22
- data/lib/i18n/backend/weeler/dedupe.rb +31 -0
- data/lib/i18n/backend/weeler/exporter.rb +67 -5
- data/lib/i18n/backend/weeler/html_checker.rb +41 -0
- data/lib/i18n/backend/weeler/importer.rb +30 -13
- data/lib/i18n/backend/weeler/translation.rb +12 -7
- data/lib/i18n/humanize_missing_translations.rb +1 -0
- data/lib/i18n/weeler.rb +8 -2
- data/lib/tasks/weeler.rake +8 -0
- data/lib/weeler.rb +80 -7
- data/lib/weeler/.DS_Store +0 -0
- data/lib/weeler/action_controller/acts/restful.rb +185 -0
- data/lib/weeler/action_dispatch/routing/mapper.rb +87 -0
- data/lib/weeler/action_view/helpers/form_helper.rb +13 -0
- data/lib/weeler/action_view/helpers/image_form_helper.rb +84 -0
- data/lib/weeler/action_view/helpers/translation_helper.rb +15 -0
- data/lib/weeler/deprecator.rb +9 -0
- data/lib/weeler/engine.rb +18 -4
- data/lib/weeler/version.rb +7 -1
- data/rspec.html +426 -147
- data/spec/.DS_Store +0 -0
- data/spec/controllers/translations_controller_spec.rb +76 -5
- data/spec/dummy/app/controllers/weeler/posts_controller.rb +3 -7
- data/spec/dummy/app/models/post.rb +17 -0
- data/spec/dummy/app/models/translation.rb +2 -0
- data/spec/dummy/config/locales/en.yml +4 -1
- data/spec/dummy/config/routes.rb +3 -3
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20140123083704_create_weeler_seos.rb +14 -0
- data/spec/dummy/db/migrate/20140123083705_create_weeler_settings.rb +17 -0
- data/spec/dummy/db/migrate/{20131015144900_create_weeler_translations.rb → 20140123083706_create_weeler_translations.rb} +0 -0
- data/spec/dummy/db/migrate/20140123083707_translate_weeler_seos.rb +15 -0
- data/spec/dummy/db/migrate/20140718103237_create_posts.rb +12 -0
- data/spec/dummy/db/migrate/20140726151210_create_translations.rb +12 -0
- data/spec/dummy/db/schema.rb +59 -1
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +221 -0
- data/spec/factories/dummy_posts.rb +6 -0
- data/spec/fixtures/.DS_Store +0 -0
- data/spec/routing/routes_spec.rb +4 -4
- data/spec/spec_helper.rb +14 -3
- data/spec/weeler/action_controller/acts/restful_spec.rb +155 -0
- data/spec/weeler/action_view/helpers/form_helper_spec.rb +26 -0
- data/spec/weeler/action_view/helpers/translation_helper_spec.rb +16 -0
- data/spec/weeler/i18n/backend/weeler/dedupe_spec.rb +21 -0
- data/spec/weeler/i18n/backend/weeler/exporter_spec.rb +2 -4
- data/spec/weeler/i18n/backend/weeler/importer_spec.rb +5 -2
- data/spec/weeler/i18n/backend/weeler_spec.rb +121 -23
- data/weeler.gemspec +15 -7
- metadata +207 -85
- data/.DS_Store +0 -0
- data/app/assets/stylesheets/weeler/vendor/bootstrap.css +0 -6086
- data/app/views/layouts/weeler/base.html.erb +0 -40
- data/app/views/weeler/home/about.html.erb +0 -16
- data/app/views/weeler/home/index.html.erb +0 -4
- data/app/views/weeler/shared/_flash.html.erb +0 -17
- data/app/views/weeler/shared/_footer.html.erb +0 -3
- data/app/views/weeler/shared/_header_navbar.html.erb +0 -18
- data/app/views/weeler/shared/_side_navbar.html.erb +0 -14
- data/app/views/weeler/translations/_form.html.erb +0 -43
- data/app/views/weeler/translations/_translation.html.erb +0 -11
- data/app/views/weeler/translations/edit.html.erb +0 -19
- data/app/views/weeler/translations/index.html.erb +0 -103
- data/app/views/weeler/translations/new.html.erb +0 -19
- data/lib/generators/weeler/templates/controllers/weeler/example_controller.rb.example +0 -7
- data/lib/i18n/backend/weeler/exporter/active_record.rb +0 -37
- data/lib/i18n/backend/weeler/exporter/active_record_relation.rb +0 -38
- data/lib/i18n/backend/weeler/store_procs.rb +0 -39
- data/lib/weeler/route_mapper.rb +0 -41
- data/spec/dummy/db/production.sqlite3 +0 -0
- data/spec/dummy/log/test.log +0 -88454
@@ -0,0 +1,24 @@
|
|
1
|
+
module Weeler
|
2
|
+
class SeoItemsController < ConfigurationController
|
3
|
+
|
4
|
+
def index
|
5
|
+
@translations_in_seo = I18n::Backend::Weeler::Translation.select("key").where("key LIKE ?", "seo.%").order("key")
|
6
|
+
@groups = @translations_in_seo.map{ |t| t.key.split(".")[1...-1].join('_') }.uniq{ |t| t}
|
7
|
+
end
|
8
|
+
|
9
|
+
def edit
|
10
|
+
@section = params[:id].gsub('_', '.')
|
11
|
+
end
|
12
|
+
|
13
|
+
def update
|
14
|
+
params[:translations].each do |translation|
|
15
|
+
id, value = translation.first, translation.last
|
16
|
+
translation = I18n::Backend::Weeler::Translation.find(id)
|
17
|
+
translation.value = value
|
18
|
+
translation.save
|
19
|
+
end
|
20
|
+
Settings.i18n_updated_at = Time.now
|
21
|
+
redirect_to({action: :edit, id: params[:id]}, {flash: {success: "Section updated."}})
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Weeler::SettingsController < Weeler::ConfigurationController
|
2
|
+
def index
|
3
|
+
# to get all items for render list
|
4
|
+
@settings = Settings.unscoped
|
5
|
+
end
|
6
|
+
|
7
|
+
def update
|
8
|
+
@setting = Settings.unscoped.find(params[:id])
|
9
|
+
if @setting.update_attributes(setting_params)
|
10
|
+
redirect_to weeler_settings_path, flash: {success: "Setting updated."}
|
11
|
+
else
|
12
|
+
flash.now[:error] = "Errors in updating."
|
13
|
+
render :index
|
14
|
+
end
|
15
|
+
end
|
16
|
+
protected
|
17
|
+
def setting_params
|
18
|
+
params.require(:settings).permit([:value])
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Weeler
|
2
|
+
class StaticSectionsController < ContentController
|
3
|
+
def show
|
4
|
+
@section = params[:id]
|
5
|
+
@items = Weeler.static_sections[@section.to_sym]
|
6
|
+
end
|
7
|
+
|
8
|
+
def update
|
9
|
+
params[:translations].each do |translation|
|
10
|
+
id, value = translation.first, translation.last
|
11
|
+
translation = I18n::Backend::Weeler::Translation.find(id)
|
12
|
+
translation.value = value
|
13
|
+
translation.save
|
14
|
+
end
|
15
|
+
Settings.i18n_updated_at = Time.now
|
16
|
+
redirect_to({action: :show, id: params[:id]}, {flash: {success: "Section updated."}})
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
module Weeler
|
2
|
-
class TranslationsController <
|
3
|
-
|
2
|
+
class TranslationsController < ConfigurationController
|
3
|
+
|
4
4
|
def index
|
5
5
|
@translations = translations_by_params
|
6
6
|
@translations = @translations.page(params[:page]).per(20)
|
7
7
|
@groups = I18n::Backend::Weeler::Translation.groups
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
def new
|
11
11
|
@translation = I18n::Backend::Weeler::Translation.new
|
12
12
|
end
|
@@ -18,9 +18,8 @@ module Weeler
|
|
18
18
|
def create
|
19
19
|
@translation = I18n::Backend::Weeler::Translation.new(translation_params)
|
20
20
|
|
21
|
-
|
22
|
-
|
23
21
|
if @translation.save
|
22
|
+
Settings.i18n_updated_at = Time.now
|
24
23
|
redirect_to edit_weeler_translation_path(@translation), flash: {success: "Translation saved."}
|
25
24
|
else
|
26
25
|
flash.now[:error] = "Errors in saving."
|
@@ -30,7 +29,10 @@ module Weeler
|
|
30
29
|
|
31
30
|
def update
|
32
31
|
@translation = I18n::Backend::Weeler::Translation.find(params[:id])
|
32
|
+
|
33
33
|
if @translation.update_attributes(translation_params)
|
34
|
+
Settings.i18n_updated_at = Time.now
|
35
|
+
|
34
36
|
redirect_to edit_weeler_translation_path(@translation), flash: {success: "Translation updated."}
|
35
37
|
else
|
36
38
|
flash.now[:error] = "Errors in updating."
|
@@ -41,6 +43,9 @@ module Weeler
|
|
41
43
|
def destroy
|
42
44
|
@translation = I18n::Backend::Weeler::Translation.find(params[:id])
|
43
45
|
@translation.destroy
|
46
|
+
|
47
|
+
Settings.i18n_updated_at = Time.now
|
48
|
+
|
44
49
|
redirect_to weeler_translations_path, flash: {success: "Translation succesfully removed."}
|
45
50
|
end
|
46
51
|
|
@@ -55,24 +60,37 @@ module Weeler
|
|
55
60
|
end
|
56
61
|
|
57
62
|
def import
|
58
|
-
|
59
|
-
|
60
|
-
end
|
63
|
+
if params[:file].present?
|
64
|
+
I18n::Backend::Weeler::Translation.import params[:file]
|
61
65
|
|
62
|
-
|
66
|
+
Settings.i18n_updated_at = Time.now
|
63
67
|
|
64
|
-
|
65
|
-
|
68
|
+
redirect_to weeler_translations_path, flash: {success: "Translations succesfully imported."}
|
69
|
+
else
|
70
|
+
redirect_to weeler_translations_path, flash: {success: "No file choosen"}
|
66
71
|
end
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def translation_params
|
77
|
+
params.require(:i18n_backend_weeler_translation).permit([:locale, :key, :value, :is_proc, :interpolations => []])
|
78
|
+
end
|
79
|
+
|
80
|
+
def translations_by_params
|
81
|
+
translations = I18n::Backend::Weeler::Translation.order("locale, key")
|
67
82
|
|
68
|
-
|
69
|
-
translations = I18n::Backend::Weeler::Translation.order("locale, key")
|
83
|
+
translations = translations.where(locale: I18n.available_locales)
|
70
84
|
|
71
|
-
|
72
|
-
translations = translations.
|
73
|
-
translations = translations.lookup(params[:group]) if params[:group].present?
|
74
|
-
translations
|
85
|
+
::Weeler.excluded_i18n_groups.each do |key|
|
86
|
+
translations = translations.except_key(key)
|
75
87
|
end
|
76
88
|
|
89
|
+
translations = translations.where("key ILIKE ? OR value ILIKE ?", "%#{params[:query]}%", "%#{params[:query]}%") if params[:query]
|
90
|
+
translations = translations.where(locale: params[:filtered_locale]) if params[:filtered_locale].present?
|
91
|
+
translations = translations.lookup(params[:group]) if params[:group].present?
|
92
|
+
translations
|
93
|
+
end
|
94
|
+
|
77
95
|
end
|
78
|
-
end
|
96
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Weeler
|
2
|
+
module Seoable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
include ::ActionView::Helpers::TextHelper
|
5
|
+
|
6
|
+
included do
|
7
|
+
# Set relations
|
8
|
+
has_one :seo, as: :seoable, dependent: :destroy, class_name: "Weeler::Seo"
|
9
|
+
accepts_nested_attributes_for :seo, reject_if: :all_blank, allow_destroy: true
|
10
|
+
|
11
|
+
# Callbacks
|
12
|
+
after_save :generate_seo
|
13
|
+
|
14
|
+
@@force_seoable = true
|
15
|
+
end
|
16
|
+
|
17
|
+
# Generate seo data in each avaivable locale
|
18
|
+
#
|
19
|
+
def generate_seo
|
20
|
+
self.seo = Weeler::Seo.create if self.seo.blank?
|
21
|
+
|
22
|
+
I18n.available_locales.each do |locale|
|
23
|
+
Globalize.with_locale(locale) do
|
24
|
+
|
25
|
+
if self.respond_to? :seo_title
|
26
|
+
self.seo.title = prepare_seoabled_text(seo_title) if (self.seo.title.blank? || @@force_seoable)
|
27
|
+
else
|
28
|
+
self.seo.title = seo_attribute :title
|
29
|
+
end
|
30
|
+
|
31
|
+
if self.respond_to? :seo_description
|
32
|
+
self.seo.description = prepare_seoabled_text(seo_description, length: 159) if (self.seo.description.blank? || @@force_seoable)
|
33
|
+
else
|
34
|
+
self.seo.description = seo_attribute :content, length: 159
|
35
|
+
end
|
36
|
+
|
37
|
+
if self.respond_to? :seo_keywords
|
38
|
+
self.seo.keywords = prepare_seoabled_text(seo_keywords, length: 200) if (self.seo.keywords.blank? || @@force_seoable)
|
39
|
+
end
|
40
|
+
|
41
|
+
self.seo.save
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Prepeare attribute
|
47
|
+
#
|
48
|
+
def seo_attribute attribute, length: 80
|
49
|
+
if self.has_attribute?(attribute) && self[attribute].present? && (self.seo.title.blank? || @@force_seoable)
|
50
|
+
prepare_seoabled_text self[attribute], length: length
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Strip, sanitize and truncate text in Rails way
|
55
|
+
#
|
56
|
+
def prepare_seoabled_text text, length: 80
|
57
|
+
truncate(ActionView::Base.full_sanitizer.sanitize(text).strip, omission: '', length: length)
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Weeler
|
2
|
+
module Sluger
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
after_save :set_slug
|
7
|
+
@@sluger_param = :title
|
8
|
+
end
|
9
|
+
|
10
|
+
def set_slug
|
11
|
+
I18n.available_locales.each do |locale|
|
12
|
+
Globalize.with_locale(locale) do
|
13
|
+
if self.slug != generate_slug
|
14
|
+
self.slug = generate_slug
|
15
|
+
self.save!
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def generate_slug
|
22
|
+
transliterated = "-#{I18n.transliterate(self[@@sluger_param]).parameterize}" if self[@@sluger_param].present?
|
23
|
+
transliterated = "" if transliterated.blank?
|
24
|
+
"#{self.id}#{transliterated}"
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_param
|
28
|
+
slug
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
File without changes
|
@@ -7,7 +7,7 @@
|
|
7
7
|
paginator: the paginator that renders the pagination tags inside
|
8
8
|
-%>
|
9
9
|
<%= paginator.render do -%>
|
10
|
-
<ul class="pagination pagination-lg
|
10
|
+
<ul class="pagination pagination-lg col-lg-12 col-md-12">
|
11
11
|
<%= first_page_tag unless current_page.first? %>
|
12
12
|
<%= prev_page_tag unless current_page.first? %>
|
13
13
|
<% each_page do |page| -%>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
!!! 5
|
2
|
+
%html
|
3
|
+
%head
|
4
|
+
%title
|
5
|
+
= Weeler
|
6
|
+
%meta{charset:"utf-8"}
|
7
|
+
%meta{name:"viewport", content:"width=device-width, initial-scale=1, maximum-scale=1"}
|
8
|
+
= stylesheet_link_tag "weeler/init", :media => "all"
|
9
|
+
= javascript_include_tag "weeler/init"
|
10
|
+
= csrf_meta_tags
|
11
|
+
= yield :weeler_header
|
12
|
+
|
13
|
+
%body{data: {controller: controller_name, action: action_name, name_space: 'weeler', tag: "#{yield :weeler_body_tag}" }}
|
14
|
+
= render "header_navbar"
|
15
|
+
.container
|
16
|
+
.row.row-offcanvas.row-offcanvas-right
|
17
|
+
= render "side_navbar"
|
18
|
+
.col-xs-12.col-sm-9
|
19
|
+
= yield
|
20
|
+
%hr
|
21
|
+
= render "footer"
|
22
|
+
= render "flash"
|
File without changes
|
@@ -0,0 +1,8 @@
|
|
1
|
+
.col-xs-6.col-sm-3.sidebar-offcanvas#sidebar{role:"navigation"}
|
2
|
+
.well.sidebar-nav
|
3
|
+
%ul.nav
|
4
|
+
%li Administration
|
5
|
+
- Weeler.administration_menu_items.each do |item|
|
6
|
+
%li
|
7
|
+
= link_to item[:name].humanize, "/#{Weeler.mount_location_namespace}/#{item[:weeler_path]}/"
|
8
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
%h1
|
2
|
+
All #{@items.klass.to_s.underscore.humanize.downcase} items
|
3
|
+
|
4
|
+
= link_to "Add new #{@items.klass.to_s.underscore.humanize.downcase}", {action: :new}
|
5
|
+
|
6
|
+
= render 'filter', items: @items
|
7
|
+
.row
|
8
|
+
%table.table{data: {provides: "rowlink"}}
|
9
|
+
%thead
|
10
|
+
= render "header_row", items: @items
|
11
|
+
%tbody
|
12
|
+
- @items.each do |item|
|
13
|
+
= render "row", item: item
|
14
|
+
|
15
|
+
- if @paginate.present? && @paginate > 0
|
16
|
+
.row
|
17
|
+
= paginate @items, params: { action: "index" }, theme: "weeler"
|