thecore_ui_rails_admin 2.1.4 → 2.1.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/{rails_admin/custom/ui.js → thecore_ui_rails_admin/thecore_rails_admin.js} +2 -39
  3. data/app/assets/stylesheets/thecore_ui_rails_admin/animate.css +3458 -0
  4. data/app/assets/stylesheets/thecore_ui_rails_admin/apexcharts.scss +7 -0
  5. data/app/assets/stylesheets/thecore_ui_rails_admin/colors.scss +13 -0
  6. data/app/assets/stylesheets/thecore_ui_rails_admin/common.scss +43 -0
  7. data/app/assets/stylesheets/thecore_ui_rails_admin/devise.scss +241 -0
  8. data/app/assets/stylesheets/{rails_admin/custom → thecore_ui_rails_admin}/flashing.scss +3 -3
  9. data/app/assets/stylesheets/thecore_ui_rails_admin/mixins.scss +18 -0
  10. data/app/assets/stylesheets/{rails_admin/custom/theming.scss → thecore_ui_rails_admin/thecore.scss} +60 -53
  11. data/app/assets/stylesheets/thecore_ui_rails_admin/thecore_rails_admin.scss +27 -0
  12. data/app/assets/stylesheets/{rails_admin/custom → thecore_ui_rails_admin}/togglable-sidebar.scss +4 -26
  13. data/app/controllers/pages_controller.rb +43 -0
  14. data/app/helpers/devise_bootstrap_errors_helper.rb +20 -0
  15. data/app/helpers/thecore_helper.rb +54 -0
  16. data/app/views/layouts/rails_admin/_secondary_navigation.html.haml +1 -1
  17. data/app/views/layouts/rails_admin/_user_navigation.html.haml +2 -2
  18. data/app/views/layouts/rails_admin/application.html.haml +2 -2
  19. data/app/views/rails_admin/main/dashboard.html.haml +20 -7
  20. data/config/initializers/rails_admin.rb +32 -8
  21. data/config/initializers/thecore_concern.rb +6 -1
  22. data/config/initializers/thecore_ui_rails_admin_app_configs.rb +17 -0
  23. data/config/locales/thecore_settings.en.yml +31 -0
  24. data/config/locales/thecore_settings.it.yml +31 -0
  25. data/db/migrate/20161227101954_create_rails_admin_settings.rb +25 -0
  26. data/db/migrate/20161227101956_add_app_name.rb +5 -0
  27. data/lib/abilities/thecore_ui_rails_admin.rb +12 -0
  28. data/lib/concerns/rails_admin_requirements.rb +19 -0
  29. data/lib/concerns/thecore_rails_admin_bulk_delete_concern.rb +16 -0
  30. data/lib/concerns/thecore_rails_admin_export_concern.rb +16 -0
  31. data/lib/concerns/thecore_ui_rails_admin_permission.rb +32 -0
  32. data/lib/concerns/thecore_ui_rails_admin_role.rb +36 -0
  33. data/lib/concerns/thecore_ui_rails_admin_user.rb +75 -0
  34. data/lib/thecore_ui_rails_admin.rb +18 -3
  35. data/lib/thecore_ui_rails_admin/engine.rb +0 -7
  36. data/lib/thecore_ui_rails_admin/version.rb +1 -1
  37. metadata +112 -52
  38. data/app/assets/javascripts/rails_admin/custom/ckeditor_ajax.js.coffee +0 -7
  39. data/app/assets/javascripts/rails_admin/custom/timer.js +0 -135
  40. data/app/views/contact_mailer/contact_message.html.erb +0 -5
  41. data/app/views/devise/confirmations/new.html.erb +0 -16
  42. data/app/views/devise/mailer/confirmation_instructions.html.erb +0 -5
  43. data/app/views/devise/mailer/password_change.html.erb +0 -5
  44. data/app/views/devise/mailer/reset_password_instructions.html.erb +0 -8
  45. data/app/views/devise/mailer/unlock_instructions.html.erb +0 -7
  46. data/app/views/devise/menu/_login_items.html.erb +0 -7
  47. data/app/views/devise/passwords/edit.html.erb +0 -25
  48. data/app/views/devise/passwords/new.html.erb +0 -18
  49. data/app/views/devise/registrations/edit.html.erb +0 -45
  50. data/app/views/devise/registrations/new.html.erb +0 -29
  51. data/app/views/devise/sessions/new.html.erb +0 -28
  52. data/app/views/devise/shared/_links.html.erb +0 -25
  53. data/app/views/devise/unlocks/new.html.erb +0 -16
  54. data/app/views/home/index.html.erb +0 -5
  55. data/app/views/kaminari/_first_page.html.erb +0 -3
  56. data/app/views/kaminari/_gap.html.erb +0 -3
  57. data/app/views/kaminari/_last_page.html.erb +0 -3
  58. data/app/views/kaminari/_next_page.html.erb +0 -3
  59. data/app/views/kaminari/_page.html.erb +0 -9
  60. data/app/views/kaminari/_paginator.html.erb +0 -15
  61. data/app/views/kaminari/_prev_page.html.erb +0 -3
  62. data/app/views/layouts/_footer.html.erb +0 -3
  63. data/app/views/layouts/_messages.html.erb +0 -9
  64. data/app/views/layouts/_navigation.html.erb +0 -20
  65. data/app/views/layouts/_navigation_links.html.erb +0 -7
  66. data/app/views/layouts/mailer.html.erb +0 -6
  67. data/app/views/layouts/mailer.text.erb +0 -1
  68. data/app/views/layouts/thecore.html.erb +0 -42
  69. data/app/views/pages/contact.html.erb +0 -54
  70. data/app/views/pages/home.html.erb +0 -2
  71. data/app/views/pages/inside.html.erb +0 -4
  72. data/app/views/users/confirmations/new.html.erb +0 -16
  73. data/app/views/users/mailer/confirmation_instructions.html.erb +0 -5
  74. data/app/views/users/mailer/password_change.html.erb +0 -3
  75. data/app/views/users/mailer/reset_password_instructions.html.erb +0 -8
  76. data/app/views/users/mailer/unlock_instructions.html.erb +0 -7
  77. data/app/views/users/passwords/edit.html.erb +0 -19
  78. data/app/views/users/passwords/new.html.erb +0 -15
  79. data/app/views/users/registrations/edit.html.erb +0 -27
  80. data/app/views/users/registrations/new.html.erb +0 -17
  81. data/app/views/users/sessions/new.html.erb +0 -37
  82. data/app/views/users/shared/_links.html.erb +0 -26
  83. data/app/views/users/unlocks/new.html.erb +0 -16
@@ -1,7 +0,0 @@
1
- $(document).ready ->
2
- $(document).on 'mousedown', '.save-action', (e) -> # triggers also when submitting form with enter
3
- for instance of CKEDITOR.instances
4
- editor = CKEDITOR.instances[instance]
5
- if editor.checkDirty()
6
- editor.updateElement();
7
- return true;
@@ -1,135 +0,0 @@
1
- (function (root, factory) {
2
- 'use strict'
3
- if (typeof define === 'function' && define.amd) define([], factory)
4
- else if (typeof exports === 'object') module.exports = factory()
5
- else root.Timer = factory()
6
- }(this, function () {
7
- 'use strict'
8
-
9
- var defaultOptions = {
10
- tick : 1,
11
- onstart : null,
12
- ontick : null,
13
- onpause : null,
14
- onstop : null,
15
- onend : null
16
- }
17
-
18
- var Timer = function (options) {
19
- if (!(this instanceof Timer)) return new Timer(options)
20
- this._ = {
21
- id : +new Date,
22
- options : {},
23
- duration : 0,
24
- status : 'initialized',
25
- start : 0,
26
- measures : []
27
- }
28
- for (var prop in defaultOptions) this._.options[prop] = defaultOptions[prop]
29
- this.options(options)
30
- }
31
-
32
- Timer.prototype.start = function (duration) {
33
- if (!+duration && !this._.duration) return this
34
- duration && (duration *= 1000)
35
- if (this._.timeout && this._.status === 'started') return this
36
- this._.duration = duration || this._.duration
37
- this._.timeout = setTimeout(end.bind(this), this._.duration)
38
- if (typeof this._.options.ontick === 'function')
39
- this._.interval = setInterval(function () {
40
- trigger.call(this, 'ontick', this.getDuration())
41
- }.bind(this), +this._.options.tick * 1000)
42
- this._.start = +new Date
43
- this._.status = 'started'
44
- trigger.call(this, 'onstart', this.getDuration())
45
- return this
46
- }
47
-
48
- Timer.prototype.pause = function () {
49
- if (this._.status !== 'started') return this
50
- this._.duration -= (+new Date - this._.start)
51
- clear.call(this, false)
52
- this._.status = 'paused'
53
- trigger.call(this, 'onpause')
54
- return this
55
- }
56
-
57
- Timer.prototype.stop = function () {
58
- if (!/started|paused/.test(this._.status)) return this
59
- clear.call(this, true)
60
- this._.status = 'stopped'
61
- trigger.call(this, 'onstop')
62
- return this
63
- }
64
-
65
- Timer.prototype.getDuration = function () {
66
- if (this._.status === 'started')
67
- return this._.duration - (+new Date - this._.start)
68
- if (this._.status === 'paused') return this._.duration
69
- return 0
70
- }
71
-
72
- Timer.prototype.getStatus = function () {
73
- return this._.status
74
- }
75
-
76
- Timer.prototype.options = function (option, value) {
77
- if (option && value) this._.options[option] = value
78
- if (!value && typeof option === 'object')
79
- for (var prop in option)
80
- if (this._.options.hasOwnProperty(prop))
81
- this._.options[prop] = option[prop]
82
- return this
83
- }
84
-
85
- Timer.prototype.on = function (option, value) {
86
- if (typeof option !== 'string' || typeof value !== 'function') return this
87
- if (!(/^on/).test(option))
88
- option = 'on' + option
89
- if (this._.options.hasOwnProperty(option))
90
- this._.options[option] = value
91
- return this
92
- }
93
-
94
- Timer.prototype.off = function (option) {
95
- if (typeof option !== 'string') return this
96
- option = option.toLowerCase()
97
- if (option === 'all') {
98
- this._.options = defaultOptions
99
- return this
100
- }
101
- if (!(/^on/).test(option)) option = 'on' + option
102
- if (this._.options.hasOwnProperty(option))
103
- this._.options[option] = defaultOptions[option]
104
- return this
105
- }
106
-
107
- Timer.prototype.measureStart = function (label) {
108
- this._.measures[label || ''] = +new Date
109
- return this
110
- }
111
-
112
- Timer.prototype.measureStop = function (label) {
113
- return +new Date - this._.measures[label || '']
114
- }
115
-
116
- function end () {
117
- clear.call(this)
118
- this._.status = 'stopped'
119
- trigger.call(this, 'onend')
120
- }
121
-
122
- function trigger (event) {
123
- var callback = this._.options[event],
124
- args = [].slice.call(arguments, 1)
125
- typeof callback === 'function' && callback.apply(this, args)
126
- }
127
-
128
- function clear (clearDuration) {
129
- clearTimeout(this._.timeout)
130
- clearInterval(this._.interval)
131
- if (clearDuration === true) this._.duration = 0
132
- }
133
-
134
- return Timer
135
- }))
@@ -1,5 +0,0 @@
1
- <p><%=t "contact_mailer.message.domain", domain: ENV["DOMAIN"] %>:</p>
2
- <p>--------------</p>
3
- <p><%=t "contact_mailer.message.from", name: @name, email: @email %></p>
4
- <p>--------------</p>
5
- <%= sanitize(line_break(@message), tags: %w(br)) %>
@@ -1,16 +0,0 @@
1
- <h2><%=t("devise.confirmations.new.resend_confirmation_instructions")</h2>
2
-
3
- <%= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| %>
4
- <%= devise_error_messages! %>
5
-
6
- <div class="field">
7
- <%= f.label :email %><br />
8
- <%= f.email_field :email, autofocus: true, value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email) %>
9
- </div>
10
-
11
- <div class="actions">
12
- <%= f.submit t("devise.confirmations.new.resend_confirmation_instructions") %>
13
-
14
- <%= render "devise/shared/links" %>
15
- </div>
16
- <% end %>
@@ -1,5 +0,0 @@
1
- <p><%=t "devise.mailer.confirmation_instructions.greeting", recipient: @email %></p>
2
-
3
- <p><%=t "devise.mailer.confirmation_instructions.instruction"%></p>
4
-
5
- <p><%= link_to t("devise.mailer.confirmation_instructions.action"), confirmation_url(@resource, confirmation_token: @token) %></p>
@@ -1,5 +0,0 @@
1
- <p><%=t "devise.mailer.password_changed_instructions.greeting", recipient: @resource.email %></p>
2
-
3
- <p><%=t "devise.mailer.password_changed_instructions.instruction"%></p>
4
-
5
- <p><%=t "devise.mailer.password_changed_instructions.instruction_2"%></p>
@@ -1,8 +0,0 @@
1
- <p><%=t "devise.mailer.reset_password_instructions.greeting", recipient: @resource.email %></p>
2
-
3
- <p><%=t "devise.mailer.reset_password_instructions.instruction"%></p>
4
-
5
- <p><%= link_to t("devise.mailer.reset_password_instructions.action"), edit_password_url(@resource, reset_password_token: @token) %></p>
6
-
7
- <p><%=t "devise.mailer.reset_password_instructions.instruction_2"%></p>
8
- <p><%=t "devise.mailer.reset_password_instructions.instruction_3"%></p>
@@ -1,7 +0,0 @@
1
- <p><%=t "devise.mailer.unlock_instructions.greeting", recipient: @resource.email %></p>
2
-
3
- <p><%=t "devise.mailer.unlock_instructions.message" %></p>
4
-
5
- <p><%=t "devise.mailer.unlock_instructions.instruction" %></p>
6
-
7
- <p><%= link_to t("devise.mailer.unlock_instructions.action"), unlock_url(@resource, unlock_token: @token) %></p>
@@ -1,7 +0,0 @@
1
- <% if user_signed_in? %>
2
- <li>
3
- <%= link_to destroy_user_session_path, :method => :delete do %>
4
- <i class="fa fa-sign-out"></i> <%=t("devise.shared.links.sign_out")%>
5
- <% end %>
6
- </li>
7
- <% end %>
@@ -1,25 +0,0 @@
1
- <div class="col-md-4 col-md-offset-4">
2
- <%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %>
3
- <%= devise_error_messages! %>
4
- <%= f.hidden_field :reset_password_token %>
5
-
6
- <div class="field">
7
- <%= f.label :password, t("devise.passwords.edit.new_password") %><br />
8
- <% if @minimum_password_length %>
9
- <em>(<%= @minimum_password_length %> characters minimum)</em><br />
10
- <% end %>
11
- <%= f.password_field :password, autofocus: true, autocomplete: "off", :class => "form-control" %>
12
- </div>
13
-
14
- <div class="field">
15
- <%= f.label :password_confirmation, "Confirm new password" %><br />
16
- <%= f.password_field :password_confirmation, autocomplete: "off", :class => "form-control" %>
17
- </div>
18
-
19
- <div class="actions">
20
- <%= f.submit t("devise.passwords.edit.change_my_password"), :class => "btn btn-warning" %>
21
-
22
- <%= render "devise/shared/links" %>
23
- </div>
24
- <% end %>
25
- </div>
@@ -1,18 +0,0 @@
1
- <div class="col-md-4 col-md-offset-4">
2
- <h2><%=t("devise.shared.links.forgot_your_password")%></h2>
3
-
4
- <%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %>
5
- <%= devise_error_messages! %>
6
-
7
- <div class="field">
8
- <%= f.label :username %><br />
9
- <%= f.email_field :username, autofocus: true, :class => "form-control" %>
10
- </div>
11
-
12
- <div class="actions">
13
- <%= f.submit t("devise.confirmations.new.resend_confirmation_instructions"), :class => "btn btn-warning" %>
14
-
15
- <%= render "devise/shared/links" %>
16
- </div>
17
- <% end %>
18
- </div>
@@ -1,45 +0,0 @@
1
- <div class="col-md-4 col-md-offset-4">
2
- <h2><%=t("devise.registrations.edit.title", resource: resource_name.to_s.humanize)%></h2>
3
-
4
- <%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
5
- <%= devise_error_messages! %>
6
-
7
- <div class="field">
8
- <%= f.label :username %><br />
9
- <%= f.email_field :username, autofocus: true, :class => "form-control" %>
10
- </div>
11
-
12
- <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
13
- <div><%=t("devise.registrations.edit.currently_waiting_confirmation_for_email", {resource: resource.unconfirmed_email})%></div>
14
- <% end %>
15
-
16
- <div class="field">
17
- <%= f.label :password %> <i><%=t("devise.shared.descriptions.leave_blank")%></i><br />
18
- <%= f.password_field :password, autocomplete: "off", :class => "form-control" %>
19
- <% if @minimum_password_length %>
20
- <br />
21
- <em><%=t "devise.validations.minimum_length", length: @minimum_password_length %></em>
22
- <% end %>
23
- </div>
24
-
25
- <div class="field">
26
- <%= f.label :password_confirmation %><br />
27
- <%= f.password_field :password_confirmation, autocomplete: "off", :class => "form-control" %>
28
- </div>
29
-
30
- <div class="field">
31
- <%= f.label :current_password %> <i><%=t("devise.shared.descriptions.current_password_needed")%></i><br />
32
- <%= f.password_field :current_password, autocomplete: "off", :class => "form-control" %>
33
- </div>
34
-
35
- <div class="actions">
36
- <%= f.submit t("devise.registrations.edit.update"), :class => "btn btn-warning" %>
37
- </div>
38
- <% end %>
39
-
40
- <h3><%=t("devise.registrations.edit.cancel_my_account")%></h3>
41
-
42
- <p><%=t("devise.registrations.edit.unhappy")%> <%= button_to t("devise.registrations.edit.cancel_my_account"), registration_path(resource_name), data: { confirm: t("devise.registrations.edit.are_you_sure") }, method: :delete %></p>
43
-
44
- <%= link_to t("devise.shared.links.back"), :back %>
45
- </div>
@@ -1,29 +0,0 @@
1
- <div class="col-md-4 col-md-offset-4">
2
- <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
3
- <%= devise_error_messages! %>
4
-
5
- <div class="field">
6
- <%= f.label :username %><br />
7
- <%= f.text_field :username, autofocus: true, :class => "form-control" %>
8
- </div>
9
-
10
- <div class="field">
11
- <%= f.label :password %>
12
- <% if @minimum_password_length %>
13
- <em>(<%= t "devise.validations.minimum_length", length: @minimum_password_length %>)</em>
14
- <% end %><br />
15
- <%= f.password_field :password, autocomplete: "off", :class => "form-control" %>
16
- </div>
17
-
18
- <div class="field">
19
- <%= f.label :password_confirmation %><br />
20
- <%= f.password_field :password_confirmation, autocomplete: "off", :class => "form-control" %>
21
- </div>
22
-
23
- <div class="actions">
24
- <%= f.submit t("devise.registrations.new.sign_up") %>
25
-
26
- <%= render "devise/shared/links" %>
27
- </div>
28
- <% end %>
29
- </div>
@@ -1,28 +0,0 @@
1
- <div class="col-md-4 col-md-offset-4">
2
- <%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
3
- <div class="field">
4
- <%= f.label :username %><br />
5
- <%= f.text_field :username, autofocus: true, :class => "form-control" %>
6
- </div>
7
-
8
- <div class="field">
9
- <%= f.label :password %><br />
10
- <%= f.password_field :password, autocomplete: "off", :class => "form-control" %>
11
- </div>
12
-
13
- <% if devise_mapping.rememberable? -%>
14
- <div class="checkbox">
15
- <label>
16
- <%= f.check_box :remember_me %>
17
- <%=t "activerecord.attributes.user.remember_me" %>
18
- </label>
19
- </div>
20
- <% end -%>
21
-
22
- <div class="actions">
23
- <%= f.submit t("devise.sessions.new.sign_in"), :class => "btn btn-warning" %>
24
-
25
- <%= render "devise/shared/links" %>
26
- </div>
27
- <% end %>
28
- </div>
@@ -1,25 +0,0 @@
1
- <%- if controller_name != 'sessions' %>
2
- <%= link_to t("devise.sessions.new.sign_in"), new_session_path(resource_name), :class => "btn btn-success" %><br />
3
- <% end -%>
4
-
5
- <%- if devise_mapping.registerable? && controller_name != 'registrations' %>
6
- <%= link_to t("devise.registrations.new.sign_up"), new_registration_path(resource_name), :class => "btn btn-success" %><br />
7
- <% end -%>
8
-
9
- <%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %>
10
- <%= link_to t("devise.passwords.new.forgot_your_password"), new_password_path(resource_name), :class => "btn btn-success" %><br />
11
- <% end -%>
12
-
13
- <%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
14
- <%= link_to t("devise.shared.links.didn_t_receive_confirmation_instructions"), new_confirmation_path(resource_name), :class => "btn btn-success" %><br />
15
- <% end -%>
16
-
17
- <%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
18
- <%= link_to t("devise.shared.links.didn_t_receive_unlock_instructions"), new_unlock_path(resource_name), :class => "btn btn-success" %><br />
19
- <% end -%>
20
-
21
- <%- if devise_mapping.omniauthable? %>
22
- <%- resource_class.omniauth_providers.each do |provider| %>
23
- <%= link_to t("devise.shared.links.sign_in_with_provider", provider: OmniAuth::Utils.camelize(provider)), omniauth_authorize_path(resource_name, provider), :class => "btn btn-success" %><br />
24
- <% end -%>
25
- <% end -%>
@@ -1,16 +0,0 @@
1
- <h2><%=t("devise.unlocks.new.resend_unlock_instructions")%></h2>
2
-
3
- <%= form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post }) do |f| %>
4
- <%= devise_error_messages! %>
5
-
6
- <div class="field">
7
- <%= f.label :email %><br />
8
- <%= f.email_field :email, autofocus: true %>
9
- </div>
10
-
11
- <div class="actions">
12
- <%= f.submit <%=t("devise.unlocks.new.resend_unlock_instructions")%> %>
13
-
14
- <%= render "devise/shared/links" %>
15
- </div>
16
- <% end %>
@@ -1,5 +0,0 @@
1
- <div class="row">
2
- <div class="col-sm-12">
3
- <h1 class="text-center animated bounce"><%= fa_icon 'rocket' %> Rollinbox</h1>
4
- </div>
5
- </div>
@@ -1,3 +0,0 @@
1
- <li>
2
- <%= link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, :remote => remote %>
3
- </li>
@@ -1,3 +0,0 @@
1
- <li class='disabled'>
2
- <%= content_tag :a, raw(t 'views.pagination.truncate') %>
3
- </li>
@@ -1,3 +0,0 @@
1
- <li>
2
- <%= link_to_unless current_page.last?, raw(t 'views.pagination.last'), url, {:remote => remote} %>
3
- </li>
@@ -1,3 +0,0 @@
1
- <li>
2
- <%= link_to_unless current_page.last?, raw(t 'views.pagination.next'), url, :rel => 'next', :remote => remote %>
3
- </li>
@@ -1,9 +0,0 @@
1
- <% if page.current? %>
2
- <li class='active'>
3
- <%= content_tag :a, page, remote: remote, rel: (page.next? ? 'next' : (page.prev? ? 'prev' : nil)) %>
4
- </li>
5
- <% else %>
6
- <li>
7
- <%= link_to page, url, remote: remote, rel: (page.next? ? 'next' : (page.prev? ? 'prev' : nil)) %>
8
- </li>
9
- <% end %>
@@ -1,15 +0,0 @@
1
- <%= paginator.render do -%>
2
- <ul class="pagination">
3
- <%= first_page_tag unless current_page.first? %>
4
- <%= prev_page_tag unless current_page.first? %>
5
- <% each_page do |page| -%>
6
- <% if page.left_outer? || page.right_outer? || page.inside_window? -%>
7
- <%= page_tag page %>
8
- <% elsif !page.was_truncated? -%>
9
- <%= gap_tag %>
10
- <% end -%>
11
- <% end -%>
12
- <%= next_page_tag unless current_page.last? %>
13
- <%= last_page_tag unless current_page.last? %>
14
- </ul>
15
- <% end -%>