sort_n_params 1.0.1 → 1.0.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4bd1573fbc7566ce2ae491362cefd3f22dccde9d976be902997c330da74742b6
4
- data.tar.gz: c01022c67d66c8447485447c80e39240f48af5b76b98a01ba78c0cdd1fb4bc44
3
+ metadata.gz: bf597fdee3ef14cd303a2cc400fef9aa8a85c43ac1aaee3154f97781553db993
4
+ data.tar.gz: af249d92dd15af32406513f1f090ea51a5fdc57332a86313f5544e0c195ca1dd
5
5
  SHA512:
6
- metadata.gz: be45cb1183bc65ca216b35db98458d50caf000499e9355f7abe64db6cc0bd9fdcb070332369dc6d40fc71eb046d8ed4906d8e4df308478a13286df7117cb4155
7
- data.tar.gz: d7184434ab0d70be2546455201619a0b63e871c317a1b4d1b1f164805533d406d4b02456799ea07c653d2b329d6bbc34bc2c6602c4f75b54ccf50f70a0e6ace2
6
+ metadata.gz: 4dbfd4f0db84fd233cf2e081b25939b82dfec4648a33f7e1f3eee566c782caeac9dd4e109ce89d0f87484c18dacf626abf5263d1ee102e4dd777fe6b605dff8d
7
+ data.tar.gz: 3ef307e2e4ffd4b9da726854c45b23adf25dbb9b507a9ecd6d392f7dd6fa9ebeb3295e6c99aff056b49955d47ab97d0fb64207cfe803fb5e4cff561b0fa71c8b
@@ -0,0 +1,20 @@
1
+ require 'active_support/concern'
2
+
3
+ module SortNParams
4
+ module Scopes
5
+ extend ActiveSupport::Concern
6
+ class_methods do
7
+ def sorting_order(ordering_array)
8
+ return all if ordering_array.blank?
9
+
10
+ all.order(parse_array(ordering_array))
11
+ end
12
+
13
+ def parse_array(ordering_array)
14
+ ordering_array.each_slice(2).map do |order, direction|
15
+ "#{name.tableize}.#{order} #{direction}"
16
+ end.join(', ')
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,8 @@
1
+ module SortNParams
2
+ module SortHelpers
3
+ def sortable(column, title = nil)
4
+ data = Sortable.new(column, title, params).call
5
+ link_to "#{data.title} <i class='#{data.icon}'".html_safe, data.sort_params, class: data.css
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,51 @@
1
+ class Sortable
2
+ DEFAULT_ORDER = 'asc'.freeze
3
+
4
+ def initialize(column, title, params)
5
+ @column = column
6
+ @title = title || column.titleize
7
+ @params = params
8
+ @sort_params = { order: [], filter: @params[:filter] }
9
+ end
10
+
11
+ def call
12
+ add_previous_order if @params[:order].present?
13
+ @sort_params[:order].include?(@column) ? revert_order : add_order
14
+ build_data
15
+ end
16
+
17
+ private
18
+
19
+ def add_previous_order
20
+ @sort_params[:order] << @params[:order]
21
+ @sort_params[:order].flatten!
22
+ end
23
+
24
+ def build_data
25
+ OpenStruct.new(css: set_css, icon: set_icon, title: @title, sort_params: @sort_params)
26
+ end
27
+
28
+ def revert_order
29
+ column_index = @sort_params[:order].find_index(@column)
30
+ direction = @column == @sort_params[:order].detect { |e| e == @column } &&
31
+ @sort_params[:order][column_index + 1] == 'asc' ? 'desc' : 'asc'
32
+ @sort_params[:order][column_index + 1] = direction
33
+ end
34
+
35
+ def add_order
36
+ @sort_params[:order] << @column
37
+ @sort_params[:order] << DEFAULT_ORDER
38
+ end
39
+
40
+ def set_css
41
+ return nil unless @params[:order]
42
+
43
+ @column == @params[:order].detect { |e| e == @column } ? 'current' : nil
44
+ end
45
+
46
+ def set_icon
47
+ if @params[:order] && @params[:order].detect { |e| e == @column } == @column && @params[:order][ @params[:order].find_index(@column) + 1 ]
48
+ @column == @params[:order].detect { |e| e == @column } && @params[:order][ @params[:order].find_index(@column) + 1 ] == 'asc' ? 'fa fa-sort-up' : 'fa fa-sort-desc'
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,94 @@
1
+ require 'pry'
2
+ RSpec.describe Sortable do
3
+ subject(:data) { Sortable.new('id', 'code', {}).call }
4
+
5
+ context 'when builds data for first time' do
6
+ it 'returns nil class for css' do
7
+ expect(data.css).to be_nil
8
+ end
9
+
10
+ it 'returns nil class for icon' do
11
+ expect(data.icon).to be_nil
12
+ end
13
+
14
+ it 'returns title of passed param' do
15
+ expect(data.title).to eq 'code'
16
+ end
17
+
18
+ it 'returns hash with default order for passed param' do
19
+ expect(data.sort_params).to be_instance_of Hash
20
+ expect(data.sort_params[:order]).to eq %w[id asc]
21
+ end
22
+ end
23
+
24
+ it 'returns nil filter params' do
25
+ expect(data.sort_params[:filter]).to be_nil
26
+ end
27
+
28
+ it 'titleizes column name if title is nil' do
29
+ new_data = Sortable.new('id', nil, {}).call
30
+ expect(new_data.title).to eq 'Id'
31
+ end
32
+
33
+ context 'when order data for first time' do
34
+ subject(:new_data) do
35
+ Sortable.new('description',
36
+ 'description',
37
+ order: data.sort_params[:order],
38
+ filter: nil).call
39
+ end
40
+ subject(:already_ordered) do
41
+ Sortable.new('description',
42
+ 'description',
43
+ order: new_data.sort_params[:order],
44
+ filter: nil).call
45
+ end
46
+
47
+ it 'adds order' do
48
+ expect(already_ordered.sort_params).to be_instance_of Hash
49
+ expect(new_data.sort_params[:order]).to eq %w[id asc description asc]
50
+ end
51
+
52
+ it "returns 'current' class for css" do
53
+ expect(already_ordered.css).to eq 'current'
54
+ end
55
+
56
+ it 'returns fa-sort-up class for icon' do
57
+ expect(already_ordered.icon).to eq 'fa fa-sort-up'
58
+ end
59
+
60
+ it 'returns title of passed param' do
61
+ expect(already_ordered.title).to eq 'description'
62
+ end
63
+
64
+ context 'when order already exists' do
65
+ subject(:twice_ordered) do
66
+ Sortable.new('description',
67
+ 'description',
68
+ order: already_ordered.sort_params[:order],
69
+ filter: nil).call
70
+ end
71
+
72
+ it 'reverts order for first time' do
73
+ expect(already_ordered.sort_params[:order]).to eq %w[id asc description desc]
74
+ end
75
+
76
+ it 'reverts order for second time' do
77
+ expect(twice_ordered.sort_params[:order]).to eq %w[id asc description asc]
78
+ end
79
+
80
+ it 'adds new order' do
81
+ new_order = Sortable.new('name',
82
+ 'name',
83
+ order: already_ordered.sort_params[:order],
84
+ filter: nil).call
85
+ expect(already_ordered.sort_params).to be_instance_of Hash
86
+ expect(new_order.sort_params[:order]).to eq %w[id asc description desc name asc]
87
+ end
88
+
89
+ it 'returns fa-sort-down class for icon' do
90
+ expect(twice_ordered.icon).to eq 'fa fa-sort-desc'
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,7 @@
1
+ require 'factory_bot'
2
+
3
+ RSpec.configure do |config|
4
+ config.include FactoryBot::Syntax::Methods
5
+ FactoryBot.find_definitions
6
+
7
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sort_n_params
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juan Francisco Ferrari
@@ -129,6 +129,11 @@ extensions: []
129
129
  extra_rdoc_files: []
130
130
  files:
131
131
  - lib/sort_n_params.rb
132
+ - lib/sort_n_params/concerns/scopes.rb
133
+ - lib/sort_n_params/sort_helpers.rb
134
+ - lib/sort_n_params/sortable.rb
135
+ - spec/sortable_spec.rb
136
+ - spec/spec_helper.rb
132
137
  homepage: https://github.com/JuannFerrari/sort_n_params
133
138
  licenses:
134
139
  - MIT