sortable-for-rails 1.0.0 → 1.2.2

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
  SHA256:
3
- metadata.gz: a2d4bbc350e99a47d9970db6c37b5d89e47bf6a0f26fd4fccd1e8dec71757d84
4
- data.tar.gz: 966cc6ebac6496a4632c886830068c7e9e30a3bead23344f94ead732e75369a1
3
+ metadata.gz: 8241cfda491ab92c3630f541f3ebe420c30dfa477a08eeb84924adacd5499c80
4
+ data.tar.gz: 63fb69082b1f418680e4c1292eea9ae5c327bd5b9a11b796ed4f08f0883267d1
5
5
  SHA512:
6
- metadata.gz: d07d2354242f3cea174566598705962d955189f86facb9a6c0691e4b49ed3ebc65b1ca73df48ee77d6fb894cc78a9cb8e588c4dc3cb2545ddb537e7ddca44324
7
- data.tar.gz: 4d9c3a6b109ba6d9b180843e73f2c24d90cb5d381ecb81ccb60cc1a0f8e3b0b11a9ca5e46742efa9e2f1b388ca8d0dd3fe1aa76c20ad02cfe1d6cb2fbbd78ba3
6
+ metadata.gz: 9164aa52cf51722b00543e5f407cc9776fad8ea054d64277851824308f8dfa3831c652759e8f9a5936d4a62424a21e7b7d6ec0e3b1937710f29cba4ab3518fcd
7
+ data.tar.gz: 499dbd023f27937514ee211dcc1817c13a40503b2b2f3516111080e0b3b0223a52336439ce1126e59f3d8c70864998d0a177f99f3fc65f871643925c73478874
data/README.md CHANGED
@@ -27,6 +27,15 @@ class User < ApplicationRecord
27
27
 
28
28
  sortable :id, :updated_at, :email
29
29
  sortable :profile_name, -> { joins(:profile) }, column: "profiles.name"
30
+ sortable :status, method: :sortable_status
31
+
32
+ # we can sort in memory also if needed (for data not stored directly in DB)
33
+ # just remember on performance impact
34
+ def self.sortable_status(direction)
35
+ results = all.sort_by { |user| user.status }
36
+ results.reverse! if direction == :desc
37
+ results
38
+ end
30
39
 
31
40
  end
32
41
  ```
@@ -10,7 +10,9 @@ module Sortable::SortableHelper
10
10
  new_direction = current_direction.to_s == "asc" ? "desc" : "asc"
11
11
  end
12
12
 
13
- link_to(url_for(sort: column, direction: new_direction), options) do
13
+ url = url_for params.permit!.merge(sort: column, direction: new_direction)
14
+
15
+ link_to(url, options) do
14
16
  label = block_given? ? capture(&block) : column
15
17
  sortable_label_for(label, current, current_direction, scope)
16
18
  end
data/lib/sortable.rb CHANGED
@@ -12,32 +12,34 @@ module Sortable
12
12
  @sortable
13
13
  end
14
14
 
15
- def sorting(column, direction = :asc)
16
- Sortable::Sort.new(self, column, direction).all
15
+ def sorting(column, direction = :asc, *args)
16
+ Sortable::Sort.new(self, column, direction, *args).all
17
17
  end
18
18
  end
19
19
  end
20
20
 
21
21
  class Column
22
- attr_reader :name, :column, :scope
23
- def initialize(name, scope = nil, column: name)
22
+ attr_reader :name, :column, :scope, :method
23
+ def initialize(name, scope = nil, column: name, method: nil)
24
24
  @name = name
25
25
  @column = column
26
+ @method = method
26
27
  @scope = scope
27
28
  end
28
29
  end
29
30
 
30
31
  class Sort
31
- attr_reader :scope
32
+ attr_reader :scope, :args
32
33
 
33
- def initialize(scope, column, direction)
34
+ def initialize(scope, column, direction, *args)
34
35
  @scope = scope
35
36
  @column = column
36
37
  @direction = direction
38
+ @args = args
37
39
  end
38
40
 
39
41
  def columns
40
- @columns = create_columns
42
+ @columns ||= create_columns
41
43
  end
42
44
 
43
45
  def all
@@ -45,7 +47,14 @@ module Sortable
45
47
 
46
48
  if column
47
49
  all = all.merge(column.scope) if column.scope.present?
48
- all = all.order("#{column.column} #{direction}")
50
+
51
+ if column.method
52
+ all = all.public_send(column.method, direction.to_sym, *args)
53
+ elsif column.column.is_a?(Symbol)
54
+ all = all.order(column.column => direction)
55
+ else
56
+ all = all.order("#{column.column} #{direction}")
57
+ end
49
58
  end
50
59
 
51
60
  all
@@ -62,8 +71,16 @@ module Sortable
62
71
  def create_columns
63
72
  scope.sortable.flat_map do |columns|
64
73
  columns = [columns] unless columns.all? { |column| column.is_a?(Symbol) }
65
- columns.map { |column| Column.new(*column) }
74
+ columns.map { |column| create_column(column) }
66
75
  end.group_by { |column| column.name.to_s }
67
76
  end
77
+
78
+ def create_column(column)
79
+ if column.respond_to?(:last) && column.last.is_a?(Hash)
80
+ Column.new(*column[0...-1], **column.last)
81
+ else
82
+ Column.new(*column)
83
+ end
84
+ end
68
85
  end
69
86
  end
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
 
4
4
  Gem::Specification.new do |spec|
5
5
  spec.name = "sortable-for-rails"
6
- spec.version = "1.0.0"
6
+ spec.version = "1.2.2"
7
7
  spec.authors = ["Grzegorz Derebecki"]
8
8
  spec.email = ["grzegorz.derebecki@fdb.pl"]
9
9
 
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
27
27
 
28
28
  spec.add_dependency "rails", ">= 5.2"
29
29
  spec.add_development_dependency "bundler", "~> 2.0"
30
- spec.add_development_dependency "rake", "~> 10.0"
30
+ spec.add_development_dependency "rake", ">= 12.3.3"
31
31
  spec.add_development_dependency "minitest", "~> 5.0"
32
32
 
33
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sortable-for-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Grzegorz Derebecki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-08-16 00:00:00.000000000 Z
11
+ date: 2021-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -42,16 +42,16 @@ dependencies:
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '10.0'
47
+ version: 12.3.3
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '10.0'
54
+ version: 12.3.3
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: minitest
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -109,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  requirements: []
112
- rubygems_version: 3.0.3
112
+ rubygems_version: 3.1.2
113
113
  signing_key:
114
114
  specification_version: 4
115
115
  summary: Allow easy sorting tables tables in rails