alphabetical_paginate_uk 0.2 → 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/README.md +10 -40
- data/alphabetical_paginate_uk.gemspec +25 -0
- data/lib/{alphabetical_paginate → alphabetical_paginate_uk}/array.rb +6 -16
- data/lib/alphabetical_paginate_uk/controller_helper.rb +87 -0
- data/lib/{alphabetical_paginate → alphabetical_paginate_uk}/engine.rb +0 -0
- data/lib/alphabetical_paginate_uk/language.rb +41 -0
- data/lib/{alphabetical_paginate → alphabetical_paginate_uk}/railtie.rb +2 -2
- data/lib/{alphabetical_paginate → alphabetical_paginate_uk}/version.rb +1 -1
- data/lib/alphabetical_paginate_uk/view_helpers.rb +65 -0
- data/lib/alphabetical_paginate_uk.rb +8 -0
- data/spec/alphabetical_paginate_spec.rb +0 -31
- data/spec/language_spec.rb +1 -2
- data/vendor/assets/javascripts/alphabetical_paginate.js +25 -34
- metadata +13 -16
- data/.rspec +0 -2
- data/lib/alphabetical_paginate/controller_helper.rb +0 -145
- data/lib/alphabetical_paginate/language.rb +0 -66
- data/lib/alphabetical_paginate/view_helpers.rb +0 -84
- data/lib/alphabetical_paginate.rb +0 -8
- data/spec/spec_helper.rb +0 -18
- data/vendor/assets/images/aloader.gif +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 20c014f705ed4c606a723e1db2cbbe59c2c01712
|
4
|
+
data.tar.gz: e6e00c27c9b80f1d6586fa42cd241c376f9e4945
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f08d76a9082b4acc60bee32083bce9b942d033716a17f1959f3b42f47ed67a8d0e1cfd6201429a1666e94a11a5eb96f2467780082b8b45b710198ea42de33f60
|
7
|
+
data.tar.gz: 1b395b487c6cc97a5d5d15a18139cc4e2a1182cd3805fd2928222e74ffeb0b54c307fed3f7b5df4942b6b4166c5bb5f3d50bc68f1f910b7eb3d0f00885de526f
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# Alphabetical_Paginate_UK
|
2
2
|
|
3
3
|
A lightweight and highly customizable pagination gem for Ruby on Rails that generates alphabetic pagination categories from Collections or Arrays. It allows you to select the field you want to paginate on.
|
4
4
|
|
@@ -15,21 +15,13 @@ Some code was inspired by [will_paginate](https://github.com/mislav/will_paginat
|
|
15
15
|
|
16
16
|
## Installation
|
17
17
|
|
18
|
-
Add this line to your application's Gemfile:
|
19
|
-
```
|
20
|
-
gem 'alphabetical_paginate'
|
21
|
-
```
|
18
|
+
Add this line to your application's Gemfile:
|
22
19
|
|
23
|
-
|
24
|
-
```bash
|
25
|
-
$ bundle install
|
26
|
-
```
|
20
|
+
gem 'alphabetical_paginate_uk'
|
27
21
|
|
28
|
-
|
22
|
+
And then execute:
|
29
23
|
|
30
|
-
|
31
|
-
config.assets.precompile += %w( alphabetical_paginate.js )
|
32
|
-
```
|
24
|
+
$ bundle install
|
33
25
|
|
34
26
|
## Basic Setup
|
35
27
|
|
@@ -72,7 +64,7 @@ end
|
|
72
64
|
### View
|
73
65
|
You need to call `alphabetical_paginate` that we just generated in the controller (i.e `<%= alphabetical_paginate @alphaParams %>`) in the view, whereever you would like to render the pagination selector div. You also **must wrap the content you want paginated in a div with id="pagination_table"**.
|
74
66
|
|
75
|
-
You can place as many `<%= alphabetical_paginate @alphaParams
|
67
|
+
You can place as many `<%= alphabetical_paginate @alphaParams =>` as you wish on the page, if you want to render multiple pagination divs.
|
76
68
|
|
77
69
|
*An example is as such:*
|
78
70
|
```html
|
@@ -108,17 +100,17 @@ The available options are as follows:
|
|
108
100
|
|
109
101
|
Key | Value | Default |Description
|
110
102
|
--- | --- | --- | ---
|
111
|
-
`:db_mode` | `Boolean` | `false` | Whether to activate low level SQL that are faster and more memory efficient
|
103
|
+
`:db_mode` | `Boolean` | `false` | Whether to activate low level SQL that are faster and more memory efficient (forces `:paginate_all` to enable)
|
112
104
|
`:db_field` | `String` | `id` | Required if `db_mode` is `true`. The field to paginate / sort by (on the same collection).
|
113
105
|
`:enumerate` | `Boolean` | `false` | Whether you want the number field collapsed (all numbers go into `0`) or separate (`0`, `1`, `2`...).
|
114
106
|
`:default_field` | `String` | `"a"` | Which field you want the page to default to on first load (`"0"`, `"a"`. `"*"`).
|
115
|
-
`:paginate_all` | `Boolean` | `false` | Whether you want empty fields to still render in pagination.
|
107
|
+
`:paginate_all` | `Boolean` | `false` | Whether you want empty fields to still render in pagination.
|
116
108
|
`:include_all` | `Boolean` | `true` | Whether you want `all` selector to be included in the pagination.
|
117
109
|
`:numbers` | `Boolean` | `true` | Whether you want numbers to be included in the pagination at all, either collapsed, or expanded (depending on `:enumerate`).
|
118
110
|
`:others` | `Boolean` | `true` | Whether you want all other characters (non alphanumeric) to be included in the pagination at all.
|
119
111
|
`:pagination_class` | `String` | `"pagination-centered"` | All the classes you would like to add to the rendered pagination selector div (for CSS purposes).
|
120
112
|
`:js` | `Boolean` | `"true"` | If you want the javascript with page-rerendering to be enabled.
|
121
|
-
`:support_language` | `Symbol` | `:
|
113
|
+
`:support_language` | `Symbol` | `:uk` | If you want latin letters support set this value to `:en` (only if `I18n.locale` in your application set to `:en`).
|
122
114
|
`:bootstrap3` | `Boolean` | `false` | If you want to enable bootstrap 3 support
|
123
115
|
|
124
116
|
## Advanced Pagination
|
@@ -147,28 +139,6 @@ Also you can paginate by any array generally, it doesn't have to be a collection
|
|
147
139
|
@friends, @params = friends.alpha_paginate(params[:letter]){|x| x}
|
148
140
|
```
|
149
141
|
|
150
|
-
## Rails 3.0 and Lower
|
151
|
-
|
152
|
-
The gem makes use of the Asset Pipeline, introduced in Rails 3.1. It still works with lower versions of Rails, however, you need to copy the assets over manually.
|
153
|
-
|
154
|
-
Copy the contents of `vendor/assets/javascripts` of this repo into the `public/javascripts` of your app
|
155
|
-
and also copy the contents of `vendor/assets/images` of this repo into the `public/images` of your app.
|
156
|
-
|
157
|
-
Also, there is one line in vendor/assets/javascripts that needs to be changed for Rails 3.0 support. That is, renaming the image path:
|
158
|
-
```javascript
|
159
|
-
var img = "<img src='/assets/aloader.gif' class='loading'/>";
|
160
|
-
// RAILS 3.0 USERS -> Please delete the above line and uncomment the bottom line
|
161
|
-
//var img = "<img src='/images/aloader.gif' class='loading'/>";
|
162
|
-
```
|
163
|
-
|
164
142
|
# Support
|
165
|
-
|
143
|
+
Author: https://github.com/lingz/alphabetical_paginate
|
166
144
|
Please feel free to reach out and contact if you find the gem useful at all! Also, feel free to report / fix any bugs or add features.
|
167
|
-
|
168
|
-
## To run tests
|
169
|
-
|
170
|
-
rspec
|
171
|
-
|
172
|
-
## To publish the gem
|
173
|
-
|
174
|
-
rake release
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'alphabetical_paginate_uk/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "alphabetical_paginate_uk"
|
8
|
+
spec.version = AlphabeticalPaginate::VERSION
|
9
|
+
spec.authors = ["lingz"]
|
10
|
+
spec.email = ["m.antevora@gmail.com"]
|
11
|
+
spec.description = "Alphabetical Pagination Ukrainian"
|
12
|
+
spec.summary = "Pagination by letters"
|
13
|
+
spec.homepage = "https://github.com/refleckt/alphabetical_paginate_uk"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "rspec", "~> 2.6"
|
24
|
+
spec.add_development_dependency "rails"
|
25
|
+
end
|
@@ -3,10 +3,9 @@ class Array
|
|
3
3
|
def alpha_paginate current_field, params = {enumerate:false, default_field: "a",
|
4
4
|
paginate_all: false, numbers: true, include_all: true,
|
5
5
|
others: true, pagination_class: "pagination-centered",
|
6
|
-
js: true, support_language: :
|
7
|
-
slugged_link: false, slug_field: "slug", all_as_link: true}
|
6
|
+
js: true, support_language: :en, bootstrap3: false}
|
8
7
|
params[:paginate_all] ||= false
|
9
|
-
params[:support_language] ||= :
|
8
|
+
params[:support_language] ||= :en
|
10
9
|
params[:language] = AlphabeticalPaginate::Language.new(params[:support_language])
|
11
10
|
params[:include_all] = true if !params.has_key? :include_all
|
12
11
|
params[:numbers] = true if !params.has_key? :numbers
|
@@ -14,30 +13,21 @@ class Array
|
|
14
13
|
params[:js] = true if !params.has_key? :js
|
15
14
|
params[:default_field] ||= params[:include_all] ? "all" : params[:language].default_letter
|
16
15
|
params[:pagination_class] ||= "pagination-centered"
|
17
|
-
params[:slugged_link] ||= false
|
18
|
-
params[:slugged_link] = params[:slugged_link] && defined?(Babosa)
|
19
|
-
params[:slug_field] ||= "slug"
|
20
|
-
params[:all_as_link] = true if !params.has_key? :all_as_link
|
21
|
-
|
22
16
|
output = []
|
23
17
|
availableLetters = {}
|
24
|
-
|
25
|
-
|
18
|
+
if current_field == nil
|
19
|
+
current_field = params[:default_field]
|
20
|
+
end
|
26
21
|
current_field = current_field.mb_chars.downcase.to_s
|
27
22
|
all = params[:include_all] && current_field == "all"
|
28
23
|
|
29
24
|
self.each do |x|
|
30
|
-
slug = eval("x.#{params[:slug_field]}") if params[:slugged_link]
|
31
|
-
|
32
25
|
field_val = block_given? ? yield(x).to_s : x.id.to_s
|
33
26
|
field_letter = field_val[0].mb_chars.downcase.to_s
|
34
|
-
|
35
27
|
case field_letter
|
36
28
|
when params[:language].letters_regexp
|
37
29
|
availableLetters[field_letter] = true if !availableLetters.has_key? field_letter
|
38
|
-
|
39
|
-
field = params[:slugged_link] ? slug : field_letter
|
40
|
-
output << x if all || (current_field =~ regexp && current_field == field)
|
30
|
+
output << x if all || (current_field =~ params[:language].letters_regexp && field_letter == current_field)
|
41
31
|
when /[0-9]/
|
42
32
|
if params[:enumerate]
|
43
33
|
availableLetters[field_letter] = true if !availableLetters.has_key? field_letter
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module AlphabeticalPaginate
|
2
|
+
module ControllerHelpers
|
3
|
+
def self.included(base)
|
4
|
+
base.extend(self)
|
5
|
+
end
|
6
|
+
|
7
|
+
def alpha_paginate current_field, params = {enumerate:false, default_field: "a",
|
8
|
+
paginate_all: false, numbers: true,
|
9
|
+
others: true, pagination_class: "pagination-centered",
|
10
|
+
batch_size: 500, db_mode: false,
|
11
|
+
db_field: "id", include_all: true,
|
12
|
+
js: true, support_language: :en,
|
13
|
+
bootstrap3: false}
|
14
|
+
params[:paginate_all] ||= false
|
15
|
+
params[:support_language] ||= :en
|
16
|
+
params[:language] = AlphabeticalPaginate::Language.new(params[:support_language])
|
17
|
+
params[:include_all] = true if !params.has_key? :include_all
|
18
|
+
params[:numbers] = true if !params.has_key? :numbers
|
19
|
+
params[:others] = true if !params.has_key? :others
|
20
|
+
params[:js] = true if !params.has_key? :js
|
21
|
+
params[:pagination_class] ||= "pagination-centered"
|
22
|
+
params[:batch_size] ||= 500
|
23
|
+
params[:default_field] ||= params[:include_all] ? "all" : params[:language].default_letter
|
24
|
+
params[:db_mode] ||= false
|
25
|
+
params[:db_field] ||= "id"
|
26
|
+
|
27
|
+
output = []
|
28
|
+
|
29
|
+
if current_field == nil
|
30
|
+
current_field = params[:default_field]
|
31
|
+
end
|
32
|
+
current_field = current_field.mb_chars.downcase.to_s
|
33
|
+
all = params[:include_all] && current_field == "all"
|
34
|
+
|
35
|
+
if params[:db_mode]
|
36
|
+
if !ActiveRecord::Base.connection.adapter_name.downcase.include? "mysql"
|
37
|
+
raise "You need a mysql database to use db_mode with alphabetical_paginate"
|
38
|
+
end
|
39
|
+
params[:paginate_all] = true
|
40
|
+
params[:availableLetters] = []
|
41
|
+
|
42
|
+
if all
|
43
|
+
output = self
|
44
|
+
else
|
45
|
+
case current_field
|
46
|
+
when /[а-їА-їa-zA-Z]/
|
47
|
+
output = self.where("LOWER(%s) REGEXP '^[^а-ї].*'" % [params[:db_field], current_field])
|
48
|
+
when /[0-9]/
|
49
|
+
if params[:enumerate]
|
50
|
+
output = self.where("LOWER(%s) REGEXP '^%s.*'" % [params[:db_field], current_field])
|
51
|
+
else
|
52
|
+
output = self.where("LOWER(%s) REGEXP '^[0-9].*'" % [params[:db_field], current_field])
|
53
|
+
end
|
54
|
+
else
|
55
|
+
output = self.where("LOWER(%s) REGEXP '^[^а-їa-z].*'" % [params[:db_field], current_field])
|
56
|
+
end
|
57
|
+
end
|
58
|
+
else
|
59
|
+
availableLetters = {}
|
60
|
+
self.find_each({batch_size: params[:batch_size]}) do |x|
|
61
|
+
field_val = block_given? ? yield(x).to_s : x.id.to_s
|
62
|
+
field_letter = field_val[0].mb_chars.downcase.to_s
|
63
|
+
case field_letter
|
64
|
+
when params[:language].letters_regexp
|
65
|
+
availableLetters[field_letter] = true if !availableLetters.has_key? field_letter
|
66
|
+
output << x if all || (current_field =~ params[:language].letters_regexp && field_letter == current_field)
|
67
|
+
when /[0-9]/
|
68
|
+
if params[:enumerate]
|
69
|
+
availableLetters[field_letter] = true if !availableLetters.has_key? field_letter
|
70
|
+
output << x if all || (current_field =~ /[0-9]/ && field_letter == current_field)
|
71
|
+
else
|
72
|
+
availableLetters['0-9'] = true if !availableLetters.has_key? 'numbers'
|
73
|
+
output << x if all || current_field == "0-9"
|
74
|
+
end
|
75
|
+
else
|
76
|
+
availableLetters['*'] = true if !availableLetters.has_key? 'other'
|
77
|
+
output << x if all || current_field == "*"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
params[:availableLetters] = availableLetters.collect{ |k,v| k.mb_chars.capitalize.to_s }
|
81
|
+
output.sort! {|x, y| block_given? ? (yield(x).to_s <=> yield(y).to_s) : (x.id.to_s <=> y.id.to_s) }
|
82
|
+
end
|
83
|
+
params[:currentField] = current_field.mb_chars.capitalize.to_s
|
84
|
+
return ((params[:db_mode] && params[:db_field]) ? output.order("#{params[:db_field]} ASC") : output), params
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
File without changes
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
module AlphabeticalPaginate
|
3
|
+
class Language
|
4
|
+
attr_reader :code
|
5
|
+
|
6
|
+
def initialize(code)
|
7
|
+
@code = code
|
8
|
+
end
|
9
|
+
|
10
|
+
def russian?
|
11
|
+
defined?(I18n) && I18n.locale == :uk && code == :uk
|
12
|
+
end
|
13
|
+
|
14
|
+
def letters_regexp
|
15
|
+
russian? ? /[а-їА-їa-zA-Z]/ : /[a-zA-Z]/
|
16
|
+
end
|
17
|
+
|
18
|
+
def default_letter
|
19
|
+
russian? ? "а" : "a" # First 'a' is russian, second - english
|
20
|
+
end
|
21
|
+
|
22
|
+
# used in view_helper
|
23
|
+
def letters_range
|
24
|
+
if russian?
|
25
|
+
('А'..'ї').to_a
|
26
|
+
else
|
27
|
+
('A'..'Z').to_a
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# used in view_helper
|
32
|
+
def output_letter(l)
|
33
|
+
(l == "All") ? all_field : l
|
34
|
+
end
|
35
|
+
|
36
|
+
# used in view_helper
|
37
|
+
def all_field
|
38
|
+
russian? ? 'Усі' : "All"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
1
|
+
require 'alphabetical_paginate_uk/view_helpers'
|
2
|
+
require 'alphabetical_paginate_uk/controller_helper'
|
3
3
|
module AlphabeticalPaginate
|
4
4
|
class Railtie < Rails::Railtie
|
5
5
|
initializer "alphabetical_paginate.view_helpers" do
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
module AlphabeticalPaginate
|
3
|
+
module ViewHelpers
|
4
|
+
def alphabetical_paginate params
|
5
|
+
output = ""
|
6
|
+
links = ""
|
7
|
+
|
8
|
+
output += javascript_include_tag 'alphabetical_paginate' if params[:js]
|
9
|
+
|
10
|
+
if params[:paginate_all]
|
11
|
+
range = params[:language].letters_range
|
12
|
+
if params[:others]
|
13
|
+
range += ["*"]
|
14
|
+
end
|
15
|
+
if params[:enumerate] && params[:numbers]
|
16
|
+
range = (0..9).to_a.map{|x| x.to_s} + range
|
17
|
+
elsif params[:numbers]
|
18
|
+
range = ["0-9"] + range
|
19
|
+
end
|
20
|
+
range.unshift "All" if params[:include_all]
|
21
|
+
range.each do |l|
|
22
|
+
value = params[:language].output_letter(l)
|
23
|
+
if l == params[:currentField]
|
24
|
+
links += '<li class="active"><a href="#" data-letter="' + l + '">' + value + "</a></li>"
|
25
|
+
elsif params[:db_mode] or params[:availableLetters].include? l
|
26
|
+
links += '<li><a href="?letter=' + l + '" data-letter="' + l + '">' + value + "</a></li>"
|
27
|
+
else
|
28
|
+
links += '<li class="disabled"><a href="?letter=' + l + '" data-letter="' + l + '">' + value + "</a></li>"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
else
|
32
|
+
params[:availableLetters].sort!
|
33
|
+
params[:availableLetters] = params[:availableLetters][1..-1] + ["*"] if params[:availableLetters][0] == "*"
|
34
|
+
params[:availableLetters].unshift "All" if params[:include_all]
|
35
|
+
params[:availableLetters] -= (1..9).to_a.map{|x| x.to_s} if !params[:numbers]
|
36
|
+
params[:availableLetters] -= ["*"] if !params[:others]
|
37
|
+
|
38
|
+
params[:availableLetters].each do |l|
|
39
|
+
value = params[:language].output_letter(l)
|
40
|
+
if l == params[:currentField]
|
41
|
+
links += '<li class="active"><a href="?letter=' + l + '" data-letter="' + l + '">' + value + '</a></li>'
|
42
|
+
else
|
43
|
+
links += '<li><a href="?letter=' + l + '" data-letter="' + l + '">' + value + "</a></li>"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
element = params[:bootstrap3] ? 'ul' : 'div'
|
50
|
+
if params[:pagination_class] != "none"
|
51
|
+
pagination = "<#{element} class='pagination %s alpha'>" % params[:pagination_class]
|
52
|
+
else
|
53
|
+
pagination = "<#{element} class='pagination alpha'>"
|
54
|
+
end
|
55
|
+
pagination +=
|
56
|
+
(params[:bootstrap3] ? "" : "<ul>") +
|
57
|
+
links +
|
58
|
+
(params[:bootstrap3] ? "" : "</ul>") +
|
59
|
+
(params[:bootstrap3] ? "" : "</div>")
|
60
|
+
|
61
|
+
output += pagination
|
62
|
+
output.html_safe
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
require "alphabetical_paginate_uk/version"
|
2
|
+
require "alphabetical_paginate_uk/array"
|
3
|
+
require "alphabetical_paginate_uk/language"
|
4
|
+
require "alphabetical_paginate_uk/railtie" if defined?(Rails)
|
5
|
+
|
6
|
+
module AlphabeticalPaginate
|
7
|
+
require 'alphabetical_paginate_uk/engine'
|
8
|
+
end
|
@@ -13,25 +13,6 @@ class String
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
class RouterMock
|
17
|
-
def url_for(options)
|
18
|
-
options[:letter] ? '?letter='+options[:letter] : '/'
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def main_app
|
23
|
-
RouterMock.new()
|
24
|
-
end
|
25
|
-
|
26
|
-
def link_to(value, url, options)
|
27
|
-
"<a href='#{url}' data-letter=\"#{options["data-letter"]}\">#{value}</a>"
|
28
|
-
end
|
29
|
-
|
30
|
-
def content_tag(type, el, html_options={})
|
31
|
-
"<#{type.to_s} class='#{html_options[:class] || ''}'>#{el}</#{type.to_s}>"
|
32
|
-
end
|
33
|
-
|
34
|
-
|
35
16
|
module AlphabeticalPaginate
|
36
17
|
|
37
18
|
describe AlphabeticalPaginate do
|
@@ -201,18 +182,6 @@ module AlphabeticalPaginate
|
|
201
182
|
pagination.should include x
|
202
183
|
end
|
203
184
|
end
|
204
|
-
|
205
|
-
it "should include All as link" do
|
206
|
-
index, params = @list.alpha_paginate("A", { include_all: true })
|
207
|
-
pagination = alphabetical_paginate(params)
|
208
|
-
pagination.should include "href='?letter=All'"
|
209
|
-
end
|
210
|
-
|
211
|
-
it "should not include All as link" do
|
212
|
-
index, params = @list.alpha_paginate("A", { include_all: true, all_as_link: false })
|
213
|
-
pagination = alphabetical_paginate(params)
|
214
|
-
pagination.should_not include "href='?letter=All'"
|
215
|
-
end
|
216
185
|
end
|
217
186
|
|
218
187
|
describe "#alphabetical_paginate in russian characters" do
|
data/spec/language_spec.rb
CHANGED
@@ -3,7 +3,6 @@ require 'alphabetical_paginate'
|
|
3
3
|
|
4
4
|
module AlphabeticalPaginate
|
5
5
|
describe Language do
|
6
|
-
|
7
6
|
context "English language" do
|
8
7
|
before(:all) do
|
9
8
|
I18n.locale = :en
|
@@ -37,7 +36,7 @@ module AlphabeticalPaginate
|
|
37
36
|
before(:all) do
|
38
37
|
I18n.locale = :ru
|
39
38
|
@language = AlphabeticalPaginate::Language.new(I18n.locale)
|
40
|
-
@russian_string = "
|
39
|
+
@russian_string = "АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЭЮЯ"
|
41
40
|
@russian_array = []
|
42
41
|
@russian_string.each_char{ |x| @russian_array << x }
|
43
42
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
$(function() {
|
2
|
-
|
3
|
-
var hasHistory = !!(window.history && window.history.pushState);
|
2
|
+
var once = false;
|
4
3
|
|
5
4
|
var img = "<img src='/assets/aloader.gif' class='loading'/>";
|
6
5
|
// RAILS 3.0 USERS -> Please delete the above line and uncomment the bottom line
|
@@ -13,52 +12,44 @@ $(function() {
|
|
13
12
|
|
14
13
|
if (!handlers || -1 !== $.inArray(onNavbarClick, handlers.click)) {
|
15
14
|
$(document).on("click", ".pagination.alpha a", onNavbarClick);
|
16
|
-
if(hasHistory){
|
17
|
-
// bind the popstate
|
18
|
-
bindPopState(location.href);
|
19
|
-
}
|
20
15
|
}
|
21
16
|
|
22
17
|
function onNavbarClick(e) {
|
23
18
|
e.preventDefault();
|
24
|
-
var url = location.href,
|
25
|
-
|
19
|
+
var url = location.href,
|
20
|
+
letter = $(this).data("letter");
|
26
21
|
if (/letter/.test(url)) {
|
27
22
|
url = url.replace(/letter=[^&]*/, "letter=" + letter);
|
28
|
-
}
|
23
|
+
}
|
24
|
+
else {
|
29
25
|
if (/\?/.test(url)) {
|
30
26
|
url += "&letter=" + letter;
|
31
|
-
}
|
27
|
+
}
|
28
|
+
else {
|
32
29
|
url += "?letter=" + letter;
|
33
30
|
}
|
34
31
|
}
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
32
|
+
$(".pagination").html(img);
|
33
|
+
//$.load(url + " #pagination_table");
|
34
|
+
$.get(url, function(result) {
|
35
|
+
$(".pagination").html($(".pagination", result));
|
36
|
+
$("#pagination_table").html($("#pagination_table", result));
|
37
|
+
});
|
38
|
+
history.pushState(null, document.title, url);
|
40
39
|
}
|
41
40
|
|
42
|
-
|
43
|
-
function
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
41
|
+
// let navigate the browser throught the ajax history
|
42
|
+
$(window).bind("popstate", function() {
|
43
|
+
if (once) {
|
44
|
+
$(".pagination").html(img);
|
45
|
+
$.get(location.href, function(result) {
|
46
|
+
$(".pagination").html($(".pagination", result));
|
47
|
+
$("#pagination_table").html($("#pagination_table", result));
|
48
|
+
});
|
49
|
+
} else {
|
50
|
+
once = true;
|
51
51
|
}
|
52
|
-
|
53
|
-
}
|
54
|
-
|
55
|
-
function loadPage(url){
|
56
|
-
$(".pagination").html(img);
|
57
|
-
$.get(url, function (result) {
|
58
|
-
$(".pagination").html($(".pagination", result).html());
|
59
|
-
$("#pagination_table").html($("#pagination_table", result).html());
|
60
|
-
});
|
61
|
-
}
|
52
|
+
});
|
62
53
|
|
63
54
|
|
64
55
|
});
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alphabetical_paginate_uk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- lingz
|
@@ -66,33 +66,31 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
-
description: Alphabetical Pagination
|
69
|
+
description: Alphabetical Pagination Ukrainian
|
70
70
|
email:
|
71
|
-
-
|
71
|
+
- m.antevora@gmail.com
|
72
72
|
executables: []
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
76
|
- ".gitignore"
|
77
|
-
- ".rspec"
|
78
77
|
- Gemfile
|
79
78
|
- LICENSE.txt
|
80
79
|
- README.md
|
81
80
|
- Rakefile
|
82
|
-
-
|
83
|
-
- lib/
|
84
|
-
- lib/
|
85
|
-
- lib/
|
86
|
-
- lib/
|
87
|
-
- lib/
|
88
|
-
- lib/
|
89
|
-
- lib/
|
81
|
+
- alphabetical_paginate_uk.gemspec
|
82
|
+
- lib/alphabetical_paginate_uk.rb
|
83
|
+
- lib/alphabetical_paginate_uk/array.rb
|
84
|
+
- lib/alphabetical_paginate_uk/controller_helper.rb
|
85
|
+
- lib/alphabetical_paginate_uk/engine.rb
|
86
|
+
- lib/alphabetical_paginate_uk/language.rb
|
87
|
+
- lib/alphabetical_paginate_uk/railtie.rb
|
88
|
+
- lib/alphabetical_paginate_uk/version.rb
|
89
|
+
- lib/alphabetical_paginate_uk/view_helpers.rb
|
90
90
|
- spec/alpha_example.rb
|
91
91
|
- spec/alphabetical_paginate_spec.rb
|
92
92
|
- spec/language_spec.rb
|
93
|
-
- spec/spec_helper.rb
|
94
93
|
- spec/support/helpers.rb
|
95
|
-
- vendor/assets/images/aloader.gif
|
96
94
|
- vendor/assets/javascripts/alphabetical_paginate.js
|
97
95
|
- vendor/assets/javascripts/index.js
|
98
96
|
homepage: https://github.com/refleckt/alphabetical_paginate_uk
|
@@ -118,10 +116,9 @@ rubyforge_project:
|
|
118
116
|
rubygems_version: 2.5.2
|
119
117
|
signing_key:
|
120
118
|
specification_version: 4
|
121
|
-
summary: Pagination
|
119
|
+
summary: Pagination by letters
|
122
120
|
test_files:
|
123
121
|
- spec/alpha_example.rb
|
124
122
|
- spec/alphabetical_paginate_spec.rb
|
125
123
|
- spec/language_spec.rb
|
126
|
-
- spec/spec_helper.rb
|
127
124
|
- spec/support/helpers.rb
|
data/.rspec
DELETED
@@ -1,145 +0,0 @@
|
|
1
|
-
module AlphabeticalPaginate
|
2
|
-
module ControllerHelpers
|
3
|
-
def self.included(base)
|
4
|
-
base.extend(self)
|
5
|
-
end
|
6
|
-
|
7
|
-
def alpha_paginate current_field, params = {enumerate:false, default_field: "a",
|
8
|
-
paginate_all: false, numbers: true,
|
9
|
-
others: true, pagination_class: "pagination-centered",
|
10
|
-
batch_size: 500, db_mode: false,
|
11
|
-
db_field: "id", include_all: true,
|
12
|
-
js: true, support_language: :uk,
|
13
|
-
bootstrap3: false, slugged_link: false,
|
14
|
-
slug_field: "slug", all_as_link: true}
|
15
|
-
params[:paginate_all] ||= false
|
16
|
-
params[:support_language] ||= :uk
|
17
|
-
params[:language] = AlphabeticalPaginate::Language.new(params[:support_language])
|
18
|
-
params[:include_all] = true if !params.has_key? :include_all
|
19
|
-
params[:numbers] = true if !params.has_key? :numbers
|
20
|
-
params[:others] = true if !params.has_key? :others
|
21
|
-
params[:js] = true if !params.has_key? :js
|
22
|
-
params[:pagination_class] ||= "pagination-centered"
|
23
|
-
params[:batch_size] ||= 500
|
24
|
-
params[:db_mode] ||= false
|
25
|
-
params[:db_field] ||= "id"
|
26
|
-
params[:slugged_link] ||= false
|
27
|
-
params[:slugged_link] = params[:slugged_link] && defined?(Babosa)
|
28
|
-
params[:slug_field] ||= "slug"
|
29
|
-
params[:all_as_link] = true if !params.has_key? :all_as_link
|
30
|
-
|
31
|
-
output = []
|
32
|
-
|
33
|
-
if params[:db_mode]
|
34
|
-
letters = nil
|
35
|
-
if !params[:paginate_all]
|
36
|
-
letters = filter_by_cardinality( find_available_letters(params[:db_field]) )
|
37
|
-
set_default_field letters, params
|
38
|
-
end
|
39
|
-
params[:availableLetters] = letters.nil? ? [] : letters
|
40
|
-
end
|
41
|
-
|
42
|
-
if params[:include_all]
|
43
|
-
current_field ||= 'all'
|
44
|
-
all = current_field == "all"
|
45
|
-
end
|
46
|
-
|
47
|
-
current_field ||= params[:default_field]
|
48
|
-
current_field = current_field.mb_chars.downcase.to_s
|
49
|
-
all = params[:include_all] && current_field == "all"
|
50
|
-
|
51
|
-
if params[:db_mode]
|
52
|
-
if !ActiveRecord::Base.connection.adapter_name.downcase.include? "mysql"
|
53
|
-
raise "You need a mysql database to use db_mode with alphabetical_paginate"
|
54
|
-
end
|
55
|
-
|
56
|
-
if all
|
57
|
-
output = self
|
58
|
-
else
|
59
|
-
|
60
|
-
# In this case we can speed up the search taking advantage of the indices
|
61
|
-
can_go_quicker = (current_field =~ params[:language].letters_regexp) || (current_field =~ /[0-9]/ && params[:enumerate])
|
62
|
-
|
63
|
-
|
64
|
-
# Use LIKE the most as you can to take advantage of indeces on the field when available
|
65
|
-
# REGEXP runs always a full scan of the table!
|
66
|
-
# For more information about LIKE and indeces have a look at
|
67
|
-
# http://myitforum.com/cs2/blogs/jnelson/archive/2007/11/16/108354.aspx
|
68
|
-
|
69
|
-
# Also use some sanitization from ActiveRecord for the current field passed
|
70
|
-
if can_go_quicker
|
71
|
-
output = self.where("LOWER(%s) LIKE ?" % params[:db_field], current_field+'%')
|
72
|
-
else
|
73
|
-
regexp_to_check = current_field =~ /[0-9]/ ? '^[0-9]' : '^[^a-z0-9]'
|
74
|
-
output = self.where("LOWER(%s) REGEXP '%s.*'" % [params[:db_field], regexp_to_check])
|
75
|
-
end
|
76
|
-
end
|
77
|
-
else
|
78
|
-
availableLetters = {}
|
79
|
-
self.find_each({batch_size: params[:batch_size]}) do |x|
|
80
|
-
slug = eval("x.#{params[:slug_field]}") if params[:slugged_link]
|
81
|
-
|
82
|
-
field_val = block_given? ? yield(x).to_s : x.id.to_s
|
83
|
-
field_letter = field_val[0].mb_chars.downcase.to_s
|
84
|
-
|
85
|
-
case field_letter
|
86
|
-
when params[:language].letters_regexp
|
87
|
-
availableLetters[field_letter] = true if !availableLetters.has_key? field_letter
|
88
|
-
regexp = params[:slugged_link] ? params[:language].slugged_regexp : params[:language].letters_regexp
|
89
|
-
field = params[:slugged_link] ? slug : field_letter
|
90
|
-
output << x if all || (current_field =~ regexp && current_field == field)
|
91
|
-
when /[0-9]/
|
92
|
-
if params[:enumerate]
|
93
|
-
availableLetters[field_letter] = true if !availableLetters.has_key? field_letter
|
94
|
-
output << x if all || (current_field =~ /[0-9]/ && field_letter == current_field)
|
95
|
-
else
|
96
|
-
availableLetters['0-9'] = true if !availableLetters.has_key? 'numbers'
|
97
|
-
output << x if all || current_field == "0-9"
|
98
|
-
end
|
99
|
-
else
|
100
|
-
availableLetters['*'] = true if !availableLetters.has_key? 'other'
|
101
|
-
output << x if all || current_field == "*"
|
102
|
-
end
|
103
|
-
end
|
104
|
-
params[:availableLetters] = availableLetters.collect{ |k,v| k.mb_chars.capitalize.to_s }
|
105
|
-
output.sort! {|x, y| block_given? ? (yield(x).to_s <=> yield(y).to_s) : (x.id.to_s <=> y.id.to_s) }
|
106
|
-
end
|
107
|
-
params[:currentField] = current_field.mb_chars.capitalize.to_s
|
108
|
-
return ((params[:db_mode] && params[:db_field]) ? output.order("#{params[:db_field]} ASC") : output), params
|
109
|
-
end
|
110
|
-
|
111
|
-
private
|
112
|
-
|
113
|
-
def set_default_field(letters, params)
|
114
|
-
if letters.any?
|
115
|
-
params[:default_field] = letters.first
|
116
|
-
elsif params[:include_all]
|
117
|
-
params[:default_field] = 'all'
|
118
|
-
else
|
119
|
-
params[:default_field] = params[:language].default_letter
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
def filter_by_cardinality(letters)
|
124
|
-
letters.collect do |letter, count|
|
125
|
-
if count > 0
|
126
|
-
letter = letter.mb_chars.capitalize.to_s
|
127
|
-
(letter =~ /[а-і]/).nil? ? '*' : letter
|
128
|
-
else
|
129
|
-
nil
|
130
|
-
end
|
131
|
-
# repass again to filter duplicates *
|
132
|
-
end.uniq
|
133
|
-
end
|
134
|
-
|
135
|
-
def find_available_letters(db_field)
|
136
|
-
# safe the field (look for the ActiveRecord valid attributes)
|
137
|
-
# but allow explict table name prefixes in order to avoid 'field list is ambiguous' errors
|
138
|
-
if db_field.nil? || !self.attribute_names.include?(db_field.to_s.split('.').last)
|
139
|
-
db_field = 'id'
|
140
|
-
end
|
141
|
-
criteria = "substr( %s, 1 , 1)" % db_field
|
142
|
-
self.select(criteria).group(criteria).order(criteria).count(db_field)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
module AlphabeticalPaginate
|
3
|
-
class Language
|
4
|
-
APPROXIMATIONS = {
|
5
|
-
"Є" => "je",
|
6
|
-
"Ю" => "yu",
|
7
|
-
}
|
8
|
-
|
9
|
-
attr_reader :code
|
10
|
-
|
11
|
-
def initialize(code)
|
12
|
-
@code = code
|
13
|
-
end
|
14
|
-
|
15
|
-
def russian?
|
16
|
-
defined?(I18n) && I18n.locale == :uk && code == :uk
|
17
|
-
end
|
18
|
-
|
19
|
-
def letters_regexp
|
20
|
-
russian? ? /[а-іА-іa-zA-Z]/ : /[a-zA-Z]/
|
21
|
-
end
|
22
|
-
|
23
|
-
def slugged_regexp
|
24
|
-
/^(#{slugged_letters.values.join("|")})$/
|
25
|
-
end
|
26
|
-
|
27
|
-
def default_letter
|
28
|
-
russian? ? "а" : "a" # First 'a' is russian, second - english
|
29
|
-
end
|
30
|
-
|
31
|
-
# used in view_helper
|
32
|
-
def letters_range
|
33
|
-
if russian?
|
34
|
-
["А","Б","В","Г","Д","Е","Є","Ж","З","И","І","Й","К","Л","М","Н","О","П","Р","С","Т","У","Ф","Х","Ц","Ч","Ш","Щ","Ю","Я"]
|
35
|
-
else
|
36
|
-
["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def slugged_letters
|
41
|
-
hash = { "All" => "all" }
|
42
|
-
letters_range.each{ |x| hash[x] = normalize(x) }
|
43
|
-
hash
|
44
|
-
end
|
45
|
-
|
46
|
-
# used in view_helper
|
47
|
-
def output_letter(l)
|
48
|
-
(l == "All") ? all_field : l
|
49
|
-
end
|
50
|
-
|
51
|
-
# used in view_helper
|
52
|
-
def all_field
|
53
|
-
russian? ? 'Усі' : "All"
|
54
|
-
end
|
55
|
-
|
56
|
-
private
|
57
|
-
|
58
|
-
def normalize(letter)
|
59
|
-
if russian?
|
60
|
-
APPROXIMATIONS[letter] || letter.to_s.to_slug.normalize(transliterations: :ukrainian).to_s
|
61
|
-
else
|
62
|
-
letter.to_s.to_slug.normalize.to_s
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
@@ -1,84 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
module AlphabeticalPaginate
|
3
|
-
module ViewHelpers
|
4
|
-
def alphabetical_paginate(options = {})
|
5
|
-
output = ""
|
6
|
-
links = ""
|
7
|
-
output += javascript_include_tag 'alphabetical_paginate' if options[:js] == true
|
8
|
-
options[:scope] ||= main_app
|
9
|
-
|
10
|
-
if options[:paginate_all]
|
11
|
-
range = options[:language].letters_range
|
12
|
-
if options[:others]
|
13
|
-
range += ["*"]
|
14
|
-
end
|
15
|
-
if options[:enumerate] && options[:numbers]
|
16
|
-
range = (0..9).to_a.map{|x| x.to_s} + range
|
17
|
-
elsif options[:numbers]
|
18
|
-
range = ["0-9"] + range
|
19
|
-
end
|
20
|
-
range.unshift "All" if (options[:include_all] && !range.include?("All"))
|
21
|
-
range.each do |l|
|
22
|
-
link_letter = l
|
23
|
-
if options[:slugged_link] && (l =~ options[:language].letters_regexp || l == "All")
|
24
|
-
link_letter = options[:language].slugged_letters[l]
|
25
|
-
end
|
26
|
-
letter_options = { letter: link_letter }
|
27
|
-
if !options[:all_as_link] && (l == "All")
|
28
|
-
letter_options[:letter] = nil
|
29
|
-
end
|
30
|
-
|
31
|
-
url = options[:scope].url_for(letter_options)
|
32
|
-
value = options[:language].output_letter(l)
|
33
|
-
if l == options[:currentField]
|
34
|
-
links += content_tag(:li, link_to(value, "#", "data-letter" => l), :class => "active")
|
35
|
-
elsif options[:db_mode] or options[:availableLetters].include? l
|
36
|
-
links += content_tag(:li, link_to(value, url, "data-letter" => l))
|
37
|
-
else
|
38
|
-
links += content_tag(:li, link_to(value, url, "data-letter" => l), :class => "disabled")
|
39
|
-
end
|
40
|
-
end
|
41
|
-
else
|
42
|
-
options[:availableLetters].sort!
|
43
|
-
options[:availableLetters] = options[:availableLetters][1..-1] + ["*"] if options[:availableLetters][0] == "*"
|
44
|
-
#Ensure that "All" is always at the front of the array
|
45
|
-
if options[:include_all]
|
46
|
-
options[:availableLetters].delete("All") if options[:availableLetters].include?("All")
|
47
|
-
options[:availableLetters].unshift("All")
|
48
|
-
end
|
49
|
-
options[:availableLetters] -= (1..9).to_a.map{|x| x.to_s} if !options[:numbers]
|
50
|
-
options[:availableLetters] -= ["*"] if !options[:others]
|
51
|
-
|
52
|
-
options[:availableLetters].each do |l|
|
53
|
-
link_letter = l
|
54
|
-
if options[:slugged_link] && (l =~ options[:language].letters_regexp || l == "All")
|
55
|
-
link_letter = options[:language].slugged_letters[l]
|
56
|
-
end
|
57
|
-
letter_options = { letter: link_letter }
|
58
|
-
if !options[:all_as_link] && (l == "All")
|
59
|
-
letter_options[:letter] = nil
|
60
|
-
end
|
61
|
-
|
62
|
-
url = options[:scope].url_for(letter_options)
|
63
|
-
value = options[:language].output_letter(l)
|
64
|
-
links += content_tag(:li, link_to(value, url, "data-letter" => l), :class => ("active" if l == options[:currentField] ))
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
element = options[:bootstrap3] ? 'ul' : 'div'
|
69
|
-
if options[:pagination_class] != "none"
|
70
|
-
pagination = "<#{element} class='pagination %s alpha'>" % options[:pagination_class]
|
71
|
-
else
|
72
|
-
pagination = "<#{element} class='pagination alpha'>"
|
73
|
-
end
|
74
|
-
pagination +=
|
75
|
-
(options[:bootstrap3] ? "" : "<ul>") +
|
76
|
-
links +
|
77
|
-
(options[:bootstrap3] ? "" : "</ul>") +
|
78
|
-
(options[:bootstrap3] ? "" : "</div>")
|
79
|
-
|
80
|
-
output += pagination
|
81
|
-
output.html_safe
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
|
-
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
|
-
# Require this file using `require "spec_helper"` to ensure that it is only
|
4
|
-
# loaded once.
|
5
|
-
#
|
6
|
-
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
7
|
-
RSpec.configure do |config|
|
8
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
9
|
-
config.run_all_when_everything_filtered = true
|
10
|
-
config.filter_run :focus
|
11
|
-
config.include Rails.application.routes.url_helpers
|
12
|
-
|
13
|
-
# Run specs in random order to surface order dependencies. If you find an
|
14
|
-
# order dependency and want to debug it, you can fix the order by providing
|
15
|
-
# the seed, which is printed after each run.
|
16
|
-
# --seed 1234
|
17
|
-
config.order = 'random'
|
18
|
-
end
|
Binary file
|