alphabetical_paginate 2.2.3 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.rspec +2 -0
- data/README.md +14 -6
- data/lib/alphabetical_paginate/array.rb +14 -5
- data/lib/alphabetical_paginate/controller_helper.rb +73 -17
- data/lib/alphabetical_paginate/language.rb +27 -4
- data/lib/alphabetical_paginate/version.rb +1 -1
- data/lib/alphabetical_paginate/view_helpers.rb +46 -35
- data/spec/alphabetical_paginate_spec.rb +19 -0
- data/spec/language_spec.rb +1 -0
- data/spec/spec_helper.rb +18 -0
- data/vendor/assets/javascripts/alphabetical_paginate.js +34 -25
- metadata +6 -3
data/.rspec
ADDED
data/README.md
CHANGED
|
@@ -15,13 +15,21 @@ 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
|
-
|
|
18
|
+
Add this line to your application's Gemfile:
|
|
19
|
+
```
|
|
20
20
|
gem 'alphabetical_paginate'
|
|
21
|
+
```
|
|
21
22
|
|
|
22
|
-
And then execute:
|
|
23
|
-
|
|
23
|
+
And then execute:
|
|
24
|
+
```bash
|
|
24
25
|
$ bundle install
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
In case you're using the Rails 3.x assets pipeline remember to add it to your `production.rb` script:
|
|
29
|
+
|
|
30
|
+
```rb
|
|
31
|
+
config.assets.precompile += %w( alphabetical_paginate.js )
|
|
32
|
+
```
|
|
25
33
|
|
|
26
34
|
## Basic Setup
|
|
27
35
|
|
|
@@ -100,11 +108,11 @@ The available options are as follows:
|
|
|
100
108
|
|
|
101
109
|
Key | Value | Default |Description
|
|
102
110
|
--- | --- | --- | ---
|
|
103
|
-
`:db_mode` | `Boolean` | `false` | Whether to activate low level SQL that are faster and more memory efficient
|
|
111
|
+
`:db_mode` | `Boolean` | `false` | Whether to activate low level SQL that are faster and more memory efficient
|
|
104
112
|
`:db_field` | `String` | `id` | Required if `db_mode` is `true`. The field to paginate / sort by (on the same collection).
|
|
105
113
|
`:enumerate` | `Boolean` | `false` | Whether you want the number field collapsed (all numbers go into `0`) or separate (`0`, `1`, `2`...).
|
|
106
114
|
`:default_field` | `String` | `"a"` | Which field you want the page to default to on first load (`"0"`, `"a"`. `"*"`).
|
|
107
|
-
`:paginate_all` | `Boolean` | `false` | Whether you want empty fields to still render in pagination.
|
|
115
|
+
`:paginate_all` | `Boolean` | `false` | Whether you want empty fields to still render in pagination. If it's falsy and `db_mode` is thruty is will perform one more aggregation query: set it to true if performances matter.
|
|
108
116
|
`:include_all` | `Boolean` | `true` | Whether you want `all` selector to be included in the pagination.
|
|
109
117
|
`:numbers` | `Boolean` | `true` | Whether you want numbers to be included in the pagination at all, either collapsed, or expanded (depending on `:enumerate`).
|
|
110
118
|
`:others` | `Boolean` | `true` | Whether you want all other characters (non alphanumeric) to be included in the pagination at all.
|
|
@@ -3,7 +3,8 @@ 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: :en, bootstrap3: false
|
|
6
|
+
js: true, support_language: :en, bootstrap3: false,
|
|
7
|
+
slugged_link: false, slug_field: "slug"}
|
|
7
8
|
params[:paginate_all] ||= false
|
|
8
9
|
params[:support_language] ||= :en
|
|
9
10
|
params[:language] = AlphabeticalPaginate::Language.new(params[:support_language])
|
|
@@ -13,21 +14,29 @@ class Array
|
|
|
13
14
|
params[:js] = true if !params.has_key? :js
|
|
14
15
|
params[:default_field] ||= params[:include_all] ? "all" : params[:language].default_letter
|
|
15
16
|
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
|
+
|
|
16
21
|
output = []
|
|
17
22
|
availableLetters = {}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
end
|
|
23
|
+
|
|
24
|
+
current_field ||= params[:default_field]
|
|
21
25
|
current_field = current_field.mb_chars.downcase.to_s
|
|
22
26
|
all = params[:include_all] && current_field == "all"
|
|
23
27
|
|
|
24
28
|
self.each do |x|
|
|
29
|
+
slug = eval("x.#{params[:slug_field]}") if params[:slugged_link]
|
|
30
|
+
|
|
25
31
|
field_val = block_given? ? yield(x).to_s : x.id.to_s
|
|
26
32
|
field_letter = field_val[0].mb_chars.downcase.to_s
|
|
33
|
+
|
|
27
34
|
case field_letter
|
|
28
35
|
when params[:language].letters_regexp
|
|
29
36
|
availableLetters[field_letter] = true if !availableLetters.has_key? field_letter
|
|
30
|
-
|
|
37
|
+
regexp = params[:slugged_link] ? params[:language].slugged_regexp : params[:language].letters_regexp
|
|
38
|
+
field = params[:slugged_link] ? slug : field_letter
|
|
39
|
+
output << x if all || (current_field =~ regexp && current_field == field)
|
|
31
40
|
when /[0-9]/
|
|
32
41
|
if params[:enumerate]
|
|
33
42
|
availableLetters[field_letter] = true if !availableLetters.has_key? field_letter
|
|
@@ -10,7 +10,8 @@ module AlphabeticalPaginate
|
|
|
10
10
|
batch_size: 500, db_mode: false,
|
|
11
11
|
db_field: "id", include_all: true,
|
|
12
12
|
js: true, support_language: :en,
|
|
13
|
-
bootstrap3: false
|
|
13
|
+
bootstrap3: false, slugged_link: false,
|
|
14
|
+
slug_field: "slug"}
|
|
14
15
|
params[:paginate_all] ||= false
|
|
15
16
|
params[:support_language] ||= :en
|
|
16
17
|
params[:language] = AlphabeticalPaginate::Language.new(params[:support_language])
|
|
@@ -20,15 +21,29 @@ module AlphabeticalPaginate
|
|
|
20
21
|
params[:js] = true if !params.has_key? :js
|
|
21
22
|
params[:pagination_class] ||= "pagination-centered"
|
|
22
23
|
params[:batch_size] ||= 500
|
|
23
|
-
params[:default_field] ||= params[:include_all] ? "all" : params[:language].default_letter
|
|
24
24
|
params[:db_mode] ||= false
|
|
25
25
|
params[:db_field] ||= "id"
|
|
26
|
+
params[:slugged_link] ||= false
|
|
27
|
+
params[:slugged_link] = params[:slugged_link] && defined?(Babosa)
|
|
28
|
+
params[:slug_field] ||= "slug"
|
|
26
29
|
|
|
27
30
|
output = []
|
|
31
|
+
|
|
32
|
+
if params[:db_mode]
|
|
33
|
+
letters = nil
|
|
34
|
+
if !params[:paginate_all]
|
|
35
|
+
letters = filter_by_cardinality( find_available_letters(params[:db_field]) )
|
|
36
|
+
set_default_field letters, params
|
|
37
|
+
end
|
|
38
|
+
params[:availableLetters] = letters.nil? ? [] : letters
|
|
39
|
+
end
|
|
28
40
|
|
|
29
|
-
if
|
|
30
|
-
current_field
|
|
41
|
+
if params[:include_all]
|
|
42
|
+
current_field ||= 'all'
|
|
43
|
+
all = current_field == "all"
|
|
31
44
|
end
|
|
45
|
+
|
|
46
|
+
current_field ||= params[:default_field]
|
|
32
47
|
current_field = current_field.mb_chars.downcase.to_s
|
|
33
48
|
all = params[:include_all] && current_field == "all"
|
|
34
49
|
|
|
@@ -36,34 +51,42 @@ module AlphabeticalPaginate
|
|
|
36
51
|
if !ActiveRecord::Base.connection.adapter_name.downcase.include? "mysql"
|
|
37
52
|
raise "You need a mysql database to use db_mode with alphabetical_paginate"
|
|
38
53
|
end
|
|
39
|
-
params[:paginate_all] = true
|
|
40
|
-
params[:availableLetters] = []
|
|
41
54
|
|
|
42
55
|
if all
|
|
43
56
|
output = self
|
|
44
57
|
else
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
58
|
+
|
|
59
|
+
# In this case we can speed up the search taking advantage of the indices
|
|
60
|
+
can_go_quicker = (current_field =~ params[:language].letters_regexp) || (current_field =~ /[0-9]/ && params[:enumerate])
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
# Use LIKE the most as you can to take advantage of indeces on the field when available
|
|
64
|
+
# REGEXP runs always a full scan of the table!
|
|
65
|
+
# For more information about LIKE and indeces have a look at
|
|
66
|
+
# http://myitforum.com/cs2/blogs/jnelson/archive/2007/11/16/108354.aspx
|
|
67
|
+
|
|
68
|
+
# Also use some sanitization from ActiveRecord for the current field passed
|
|
69
|
+
if can_go_quicker
|
|
70
|
+
output = self.where("LOWER(%s) LIKE ?" % params[:db_field], current_field+'%')
|
|
54
71
|
else
|
|
55
|
-
|
|
72
|
+
regexp_to_check = current_field =~ /[0-9]/ ? '^[0-9]' : '^[^a-z0-9]'
|
|
73
|
+
output = self.where("LOWER(%s) REGEXP '%s.*'" % [params[:db_field], regexp_to_check])
|
|
56
74
|
end
|
|
57
75
|
end
|
|
58
76
|
else
|
|
59
77
|
availableLetters = {}
|
|
60
78
|
self.find_each({batch_size: params[:batch_size]}) do |x|
|
|
79
|
+
slug = eval("x.#{params[:slug_field]}") if params[:slugged_link]
|
|
80
|
+
|
|
61
81
|
field_val = block_given? ? yield(x).to_s : x.id.to_s
|
|
62
82
|
field_letter = field_val[0].mb_chars.downcase.to_s
|
|
83
|
+
|
|
63
84
|
case field_letter
|
|
64
85
|
when params[:language].letters_regexp
|
|
65
86
|
availableLetters[field_letter] = true if !availableLetters.has_key? field_letter
|
|
66
|
-
|
|
87
|
+
regexp = params[:slugged_link] ? params[:language].slugged_regexp : params[:language].letters_regexp
|
|
88
|
+
field = params[:slugged_link] ? slug : field_letter
|
|
89
|
+
output << x if all || (current_field =~ regexp && current_field == field)
|
|
67
90
|
when /[0-9]/
|
|
68
91
|
if params[:enumerate]
|
|
69
92
|
availableLetters[field_letter] = true if !availableLetters.has_key? field_letter
|
|
@@ -83,5 +106,38 @@ module AlphabeticalPaginate
|
|
|
83
106
|
params[:currentField] = current_field.mb_chars.capitalize.to_s
|
|
84
107
|
return ((params[:db_mode] && params[:db_field]) ? output.order("#{params[:db_field]} ASC") : output), params
|
|
85
108
|
end
|
|
109
|
+
|
|
110
|
+
private
|
|
111
|
+
|
|
112
|
+
def set_default_field(letters, params)
|
|
113
|
+
if letters.any?
|
|
114
|
+
params[:default_field] = letters.first
|
|
115
|
+
elsif params[:include_all]
|
|
116
|
+
params[:default_field] = 'all'
|
|
117
|
+
else
|
|
118
|
+
params[:default_field] = params[:language].default_letter
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def filter_by_cardinality(letters)
|
|
123
|
+
letters.collect do |letter, count|
|
|
124
|
+
if count > 0
|
|
125
|
+
letter = letter.mb_chars.capitalize.to_s
|
|
126
|
+
(letter =~ /[A-Z]/).nil? ? '*' : letter
|
|
127
|
+
else
|
|
128
|
+
nil
|
|
129
|
+
end
|
|
130
|
+
# repass again to filter duplicates *
|
|
131
|
+
end.uniq
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def find_available_letters(db_field)
|
|
135
|
+
# safe the field (look for the ActiveRecord valid attributes)
|
|
136
|
+
if db_field.nil? || !self.attribute_names.include?(db_field)
|
|
137
|
+
db_field = 'id'
|
|
138
|
+
end
|
|
139
|
+
criteria = "substr( %s, 1 , 1)" % db_field
|
|
140
|
+
self.select(criteria).group(criteria).order(criteria).count(db_field)
|
|
141
|
+
end
|
|
86
142
|
end
|
|
87
143
|
end
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
# coding: utf-8
|
|
2
2
|
module AlphabeticalPaginate
|
|
3
3
|
class Language
|
|
4
|
+
APPROXIMATIONS = {
|
|
5
|
+
"Э" => "je",
|
|
6
|
+
"Ю" => "yu"
|
|
7
|
+
}
|
|
8
|
+
|
|
4
9
|
attr_reader :code
|
|
5
10
|
|
|
6
11
|
def initialize(code)
|
|
@@ -15,6 +20,10 @@ module AlphabeticalPaginate
|
|
|
15
20
|
russian? ? /[а-яА-Я]/ : /[a-zA-Z]/
|
|
16
21
|
end
|
|
17
22
|
|
|
23
|
+
def slugged_regexp
|
|
24
|
+
/^(#{slugged_letters.values.join("|")})$/
|
|
25
|
+
end
|
|
26
|
+
|
|
18
27
|
def default_letter
|
|
19
28
|
russian? ? "а" : "a" # First 'a' is russian, second - english
|
|
20
29
|
end
|
|
@@ -22,14 +31,18 @@ module AlphabeticalPaginate
|
|
|
22
31
|
# used in view_helper
|
|
23
32
|
def letters_range
|
|
24
33
|
if russian?
|
|
25
|
-
|
|
26
|
-
"АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЭЮЯ".each_char{ |x| letters << x }
|
|
27
|
-
letters
|
|
34
|
+
["А","Б","В","Г","Д","Е","Ж","З","И","К","Л","М","Н","О","П","Р","С","Т","У","Ф","Х","Ц","Ч","Ш","Э","Ю","Я"]
|
|
28
35
|
else
|
|
29
|
-
|
|
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"]
|
|
30
37
|
end
|
|
31
38
|
end
|
|
32
39
|
|
|
40
|
+
def slugged_letters
|
|
41
|
+
hash = { "All" => "all" }
|
|
42
|
+
letters_range.each{ |x| hash[x] = normalize(x) }
|
|
43
|
+
hash
|
|
44
|
+
end
|
|
45
|
+
|
|
33
46
|
# used in view_helper
|
|
34
47
|
def output_letter(l)
|
|
35
48
|
(l == "All") ? all_field : l
|
|
@@ -39,5 +52,15 @@ module AlphabeticalPaginate
|
|
|
39
52
|
def all_field
|
|
40
53
|
russian? ? 'Все' : "All"
|
|
41
54
|
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
def normalize(letter)
|
|
59
|
+
if russian?
|
|
60
|
+
APPROXIMATIONS[letter] || letter.to_s.to_slug.normalize(transliterations: :russian).to_s
|
|
61
|
+
else
|
|
62
|
+
letter.to_s.to_slug.normalize.to_s
|
|
63
|
+
end
|
|
64
|
+
end
|
|
42
65
|
end
|
|
43
66
|
end
|
|
@@ -1,62 +1,73 @@
|
|
|
1
1
|
# coding: utf-8
|
|
2
2
|
module AlphabeticalPaginate
|
|
3
3
|
module ViewHelpers
|
|
4
|
-
def alphabetical_paginate
|
|
4
|
+
def alphabetical_paginate(options = {})
|
|
5
5
|
output = ""
|
|
6
6
|
links = ""
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
if
|
|
11
|
-
range =
|
|
12
|
-
if
|
|
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
13
|
range += ["*"]
|
|
14
14
|
end
|
|
15
|
-
if
|
|
15
|
+
if options[:enumerate] && options[:numbers]
|
|
16
16
|
range = (0..9).to_a.map{|x| x.to_s} + range
|
|
17
|
-
elsif
|
|
17
|
+
elsif options[:numbers]
|
|
18
18
|
range = ["0-9"] + range
|
|
19
19
|
end
|
|
20
|
-
range.unshift "All" if (
|
|
20
|
+
range.unshift "All" if (options[:include_all] && !range.include?("All"))
|
|
21
21
|
range.each do |l|
|
|
22
|
-
|
|
23
|
-
if l
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
+
|
|
27
|
+
url = options[:scope].url_for(:letter => link_letter)
|
|
28
|
+
value = options[:language].output_letter(l)
|
|
29
|
+
if l == options[:currentField]
|
|
30
|
+
links += content_tag(:li, link_to(value, "#", "data-letter" => l), :class => "active")
|
|
31
|
+
elsif options[:db_mode] or options[:availableLetters].include? l
|
|
32
|
+
links += content_tag(:li, link_to(value, url, "data-letter" => l))
|
|
27
33
|
else
|
|
28
|
-
links +=
|
|
34
|
+
links += content_tag(:li, link_to(value, url, "data-letter" => l), :class => "disabled")
|
|
29
35
|
end
|
|
30
36
|
end
|
|
31
37
|
else
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
38
|
+
options[:availableLetters].sort!
|
|
39
|
+
options[:availableLetters] = options[:availableLetters][1..-1] + ["*"] if options[:availableLetters][0] == "*"
|
|
40
|
+
#Ensure that "All" is always at the front of the array
|
|
41
|
+
if options[:include_all]
|
|
42
|
+
options[:availableLetters].delete("All") if options[:availableLetters].include?("All")
|
|
43
|
+
options[:availableLetters].unshift("All")
|
|
44
|
+
end
|
|
45
|
+
options[:availableLetters] -= (1..9).to_a.map{|x| x.to_s} if !options[:numbers]
|
|
46
|
+
options[:availableLetters] -= ["*"] if !options[:others]
|
|
47
|
+
|
|
48
|
+
options[:availableLetters].each do |l|
|
|
49
|
+
link_letter = l
|
|
50
|
+
if options[:slugged_link] && (l =~ options[:language].letters_regexp || l == "All")
|
|
51
|
+
link_letter = options[:language].slugged_letters[l]
|
|
44
52
|
end
|
|
53
|
+
|
|
54
|
+
url = options[:scope].url_for(:letter => link_letter)
|
|
55
|
+
value = options[:language].output_letter(l)
|
|
56
|
+
links += content_tag(:li, link_to(value, url, "data-letter" => l), :class => ("active" if l == options[:currentField] ))
|
|
45
57
|
end
|
|
46
58
|
end
|
|
47
59
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
pagination = "<#{element} class='pagination %s alpha' style='height:35px;'>" % params[:pagination_class]
|
|
60
|
+
element = options[:bootstrap3] ? 'ul' : 'div'
|
|
61
|
+
if options[:pagination_class] != "none"
|
|
62
|
+
pagination = "<#{element} class='pagination %s alpha' style='height:35px;'>" % options[:pagination_class]
|
|
52
63
|
else
|
|
53
64
|
pagination = "<#{element} class='pagination alpha' style='height:35px;'>"
|
|
54
65
|
end
|
|
55
66
|
pagination +=
|
|
56
|
-
(
|
|
67
|
+
(options[:bootstrap3] ? "" : "<ul>") +
|
|
57
68
|
links +
|
|
58
|
-
(
|
|
59
|
-
(
|
|
69
|
+
(options[:bootstrap3] ? "" : "</ul>") +
|
|
70
|
+
(options[:bootstrap3] ? "" : "</div>")
|
|
60
71
|
|
|
61
72
|
output += pagination
|
|
62
73
|
output.html_safe
|
|
@@ -13,6 +13,25 @@ class String
|
|
|
13
13
|
end
|
|
14
14
|
end
|
|
15
15
|
|
|
16
|
+
class RouterMock
|
|
17
|
+
def url_for(options)
|
|
18
|
+
'?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
|
+
|
|
16
35
|
module AlphabeticalPaginate
|
|
17
36
|
|
|
18
37
|
describe AlphabeticalPaginate do
|
data/spec/language_spec.rb
CHANGED
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
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
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
$(function() {
|
|
2
|
-
|
|
2
|
+
// deal with old browsers
|
|
3
|
+
var hasHistory = !!(window.history && window.history.pushState);
|
|
3
4
|
|
|
4
5
|
var img = "<img src='/assets/aloader.gif' class='loading'/>";
|
|
5
6
|
// RAILS 3.0 USERS -> Please delete the above line and uncomment the bottom line
|
|
@@ -12,44 +13,52 @@ $(function() {
|
|
|
12
13
|
|
|
13
14
|
if (!handlers || -1 !== $.inArray(onNavbarClick, handlers.click)) {
|
|
14
15
|
$(document).on("click", ".pagination.alpha a", onNavbarClick);
|
|
16
|
+
if(hasHistory){
|
|
17
|
+
// bind the popstate
|
|
18
|
+
bindPopState(location.href);
|
|
19
|
+
}
|
|
15
20
|
}
|
|
16
21
|
|
|
17
22
|
function onNavbarClick(e) {
|
|
18
23
|
e.preventDefault();
|
|
19
|
-
var url = location.href,
|
|
20
|
-
|
|
24
|
+
var url = location.href,
|
|
25
|
+
letter = $(this).data("letter");
|
|
21
26
|
if (/letter/.test(url)) {
|
|
22
27
|
url = url.replace(/letter=[^&]*/, "letter=" + letter);
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
28
|
+
} else {
|
|
25
29
|
if (/\?/.test(url)) {
|
|
26
30
|
url += "&letter=" + letter;
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
31
|
+
} else {
|
|
29
32
|
url += "?letter=" + letter;
|
|
30
33
|
}
|
|
31
34
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
});
|
|
38
|
-
history.pushState(null, document.title, url);
|
|
35
|
+
loadPage(url);
|
|
36
|
+
// deal with browser support
|
|
37
|
+
if(hasHistory){
|
|
38
|
+
history.pushState(null, document.title, url);
|
|
39
|
+
}
|
|
39
40
|
}
|
|
40
41
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
once = true;
|
|
42
|
+
// let navigate the browser throught the ajax history
|
|
43
|
+
function bindPopState(initialUrl){
|
|
44
|
+
$(window).bind("popstate", function() {
|
|
45
|
+
var newUrl = location.href;
|
|
46
|
+
var diff = newUrl.replace(initialUrl, '');
|
|
47
|
+
// skip initial popstate
|
|
48
|
+
// skip anchor links (used for JS links)
|
|
49
|
+
if (diff !== '' && diff !== '#') {
|
|
50
|
+
loadPage(newUrl);
|
|
51
51
|
}
|
|
52
|
-
|
|
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
|
+
}
|
|
53
62
|
|
|
54
63
|
|
|
55
64
|
});
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: alphabetical_paginate
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.3.0
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2015-05-16 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: bundler
|
|
@@ -83,6 +83,7 @@ extensions: []
|
|
|
83
83
|
extra_rdoc_files: []
|
|
84
84
|
files:
|
|
85
85
|
- .gitignore
|
|
86
|
+
- .rspec
|
|
86
87
|
- Gemfile
|
|
87
88
|
- LICENSE.txt
|
|
88
89
|
- README.md
|
|
@@ -99,6 +100,7 @@ files:
|
|
|
99
100
|
- spec/alpha_example.rb
|
|
100
101
|
- spec/alphabetical_paginate_spec.rb
|
|
101
102
|
- spec/language_spec.rb
|
|
103
|
+
- spec/spec_helper.rb
|
|
102
104
|
- spec/support/helpers.rb
|
|
103
105
|
- vendor/assets/images/aloader.gif
|
|
104
106
|
- vendor/assets/javascripts/alphabetical_paginate.js
|
|
@@ -124,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
124
126
|
version: '0'
|
|
125
127
|
requirements: []
|
|
126
128
|
rubyforge_project:
|
|
127
|
-
rubygems_version: 1.8.
|
|
129
|
+
rubygems_version: 1.8.23
|
|
128
130
|
signing_key:
|
|
129
131
|
specification_version: 3
|
|
130
132
|
summary: Pagination
|
|
@@ -132,4 +134,5 @@ test_files:
|
|
|
132
134
|
- spec/alpha_example.rb
|
|
133
135
|
- spec/alphabetical_paginate_spec.rb
|
|
134
136
|
- spec/language_spec.rb
|
|
137
|
+
- spec/spec_helper.rb
|
|
135
138
|
- spec/support/helpers.rb
|