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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4db868fdca4359e328dea8fad7a6218303c03d86
4
- data.tar.gz: 64a40e3785b8e1f78a08b1f0471cf2073e4bc1f8
3
+ metadata.gz: 20c014f705ed4c606a723e1db2cbbe59c2c01712
4
+ data.tar.gz: e6e00c27c9b80f1d6586fa42cd241c376f9e4945
5
5
  SHA512:
6
- metadata.gz: 3660eba7b61822344e4ea2c144cccc2720e38869baf900a9ca27189ea106f30ad43fdf41ce461916bccccf83799a92c67d04a0a3ad26f8cf209b8840d5693a34
7
- data.tar.gz: f9e61cfb50fd0f327c9372ae2e8680680dab4500503fb9b1d107deac0464945777b95afec77c6c3cdc84b3e4bb9e82ca4689aff74305626190161023397ecb35
6
+ metadata.gz: f08d76a9082b4acc60bee32083bce9b942d033716a17f1959f3b42f47ed67a8d0e1cfd6201429a1666e94a11a5eb96f2467780082b8b45b710198ea42de33f60
7
+ data.tar.gz: 1b395b487c6cc97a5d5d15a18139cc4e2a1182cd3805fd2928222e74ffeb0b54c307fed3f7b5df4942b6b4166c5bb5f3d50bc68f1f910b7eb3d0f00885de526f
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # AlphabeticalPaginate
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
- And then execute:
24
- ```bash
25
- $ bundle install
26
- ```
20
+ gem 'alphabetical_paginate_uk'
27
21
 
28
- In case you're using the Rails 3.x assets pipeline remember to add it to your `production.rb` script:
22
+ And then execute:
29
23
 
30
- ```rb
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 %>` as you wish on the page, if you want to render multiple pagination divs.
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. If it's falsy and `db_mode` is thruty is will perform one more aggregation query: set it to true if performances matter.
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` | `:en` | If you want russian letters support set this value to `:ru` (only if `I18n.locale` in your application set to `:ru`).
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: :uk, bootstrap3: false,
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] ||= :uk
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
- current_field ||= params[:default_field]
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
- regexp = params[:slugged_link] ? params[:language].slugged_regexp : params[:language].letters_regexp
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
@@ -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 'alphabetical_paginate/view_helpers'
2
- require 'alphabetical_paginate/controller_helper'
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
@@ -1,3 +1,3 @@
1
1
  module AlphabeticalPaginate
2
- VERSION = "2.3.2"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -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
@@ -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
- // deal with old browsers
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
- letter = $(this).data("letter");
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
- } else {
23
+ }
24
+ else {
29
25
  if (/\?/.test(url)) {
30
26
  url += "&letter=" + letter;
31
- } else {
27
+ }
28
+ else {
32
29
  url += "?letter=" + letter;
33
30
  }
34
31
  }
35
- loadPage(url);
36
- // deal with browser support
37
- if(hasHistory){
38
- history.pushState(null, document.title, url);
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
- // 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);
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: '0.2'
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 UK
69
+ description: Alphabetical Pagination Ukrainian
70
70
  email:
71
- - lz781@nyu.edu
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
- - lib/alphabetical_paginate.rb
83
- - lib/alphabetical_paginate/array.rb
84
- - lib/alphabetical_paginate/controller_helper.rb
85
- - lib/alphabetical_paginate/engine.rb
86
- - lib/alphabetical_paginate/language.rb
87
- - lib/alphabetical_paginate/railtie.rb
88
- - lib/alphabetical_paginate/version.rb
89
- - lib/alphabetical_paginate/view_helpers.rb
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,2 +0,0 @@
1
- --color
2
- --format progress
@@ -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
@@ -1,8 +0,0 @@
1
- require "alphabetical_paginate/version"
2
- require "alphabetical_paginate/array"
3
- require "alphabetical_paginate/language"
4
- require "alphabetical_paginate/railtie" if defined?(Rails)
5
-
6
- module AlphabeticalPaginate
7
- require 'alphabetical_paginate/engine'
8
- 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