greedo 0.0.2 → 0.0.3

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
  SHA1:
3
- metadata.gz: a89bac7cd8d24f99e8f427fdfa36cacd8b1f1d5b
4
- data.tar.gz: c13b4badf51810de63f666cc1375ea9132b9798f
3
+ metadata.gz: 8c37eaa9ca950940e9c87f9ed42e5954d03d06e4
4
+ data.tar.gz: e5c83b75858b499a110a9ac15aef2ff973c0083e
5
5
  SHA512:
6
- metadata.gz: 2ca476abd4c6d6b02a5f60db77e6eefeb99efa9695eb34ac81449c39eb5ffb31efbf17b8e402438bc9b87b1110bfa9ef7d5ed4bd52ee9408ff09d055f2efc876
7
- data.tar.gz: 8b953f2160f9b37ca5ce3f15bb6f9eea5519fa04f7a8b4cc977876e352e82aecd35736b23b694f4c726e12e5f5121f9cbc9f786a327975cf239fdf484e5125cb
6
+ metadata.gz: 68a84e842d0191ad79765e733ee98d2283b8ec1e71055437e881de2b57a770d1a66b0638737f3bc0aba681e4d4ff95c6289ae1a41ed722c661b9f87e34bf32d7
7
+ data.tar.gz: 6a4d333a874b4228d1955e55568c6b4a652c7c64b65a976dfa8998801dd365181a33961d1ed0a06261ac2a60341eaed0d8028797c9d6df8d3db5081e53b7dabb
data/README.md CHANGED
@@ -30,9 +30,19 @@ After installing greedo, you can use the helper like this:
30
30
  ```
31
31
 
32
32
  This will create a data table with two columns, one labelled "Name" and the other "Actions".
33
- It will show 10 users from the given scope (which should either be an ActiveRecord::Relation or an Array).
33
+ It will show 10 users from the given scope (which should either be an ActiveRecord::Relation or an Array).
34
34
  Pagination will be added if necessary.
35
35
 
36
+ ### Custom empty message
37
+
38
+ ```haml
39
+ %h1 My first table
40
+
41
+ = greedo(User.registered, per_page: 10) do |g|
42
+ = g.custom_empty_message "There are no users in the database."
43
+ = g.column :name
44
+ ```
45
+
36
46
  ### Presenters
37
47
 
38
48
  You can wrap records in a class instance:
@@ -5,13 +5,22 @@
5
5
  %thead
6
6
  %tr
7
7
  - grid.headers.each do |header|
8
- %th= header.label
8
+ %th{class: header.klass}
9
+ .greedo-header
10
+ = header.label
11
+ - if header.sort
12
+ .greedo-order
13
+ = link_to header.order_asc_path do
14
+ %i.glyphicon{class: header.order_asc_class}
15
+ = link_to header.order_desc_path do
16
+ %i.glyphicon{class: header.order_desc_class}
9
17
 
10
18
  %tbody
11
19
  - grid.rows.each do |row|
12
20
  %tr{id: row.id}
13
21
  - row.columns.each do |column|
14
- %td= column.value
22
+ %td{class: column.klass}
23
+ = column.value
15
24
 
16
25
  - if grid.show_pagination?
17
26
  = will_paginate grid.paginator.records, param_name: param_name, renderer: BootstrapPagination::Rails
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "rspec-core"
24
24
  spec.add_development_dependency "rspec-rails"
25
25
  spec.add_development_dependency "capybara"
26
- spec.add_development_dependency "rails"
26
+ spec.add_development_dependency "rails", "~> 4.2"
27
27
  spec.add_development_dependency "sqlite3"
28
28
 
29
29
  spec.add_dependency "haml"
@@ -1,33 +1,49 @@
1
1
  module Greedo
2
2
  module GridHelper
3
3
  class Grid
4
- attr_reader :paginator, :view_context, :fields, :presenter
4
+ attr_accessor :paginator
5
+ attr_reader :view_context, :fields, :presenter, :empty_message_text,
6
+ :order, :order_by
5
7
 
6
- def initialize(paginator:, view_context:)
7
- @paginator = paginator
8
+ def initialize(view_context:, order: nil, order_by: nil)
8
9
  @view_context = view_context
9
10
  @row_id = ->(record) { default_row_id(record) }
10
11
  @fields = []
11
12
  @presenter = proc{|r| r}
13
+ @empty_message_text = "No data to show."
14
+ @order = order
15
+ @order_by = order_by
12
16
  end
13
17
 
14
18
  def configure
15
19
  yield self if block_given?
16
20
  end
17
21
 
22
+ def custom_empty_message(empty_message_text)
23
+ @empty_message_text = empty_message_text
24
+ nil
25
+ end
26
+
27
+ def ordered_by
28
+ fields.find(&:ordered_by?) || Field.new
29
+ end
30
+
18
31
  def row_id(&block)
19
32
  @row_id = block
20
33
  nil
21
34
  end
22
35
 
23
- def column(name, label: name.to_s.humanize, &block)
36
+ def column(name, label: name.to_s.humanize, sort: nil, &block)
37
+ if sort.nil? && name.is_a?(Symbol)
38
+ sort = name.to_s
39
+ end
24
40
  if block
25
41
  renderer = ->(record) { view_context.capture(present(record), &block) }
26
42
  else
27
43
  renderer = ->(record) { present(record).public_send(name) }
28
44
  end
29
45
 
30
- fields << Field.new(name, label, renderer)
46
+ fields << Field.new(name, label, renderer, order, order_by, view_context, sort)
31
47
  nil
32
48
  end
33
49
 
@@ -60,7 +76,7 @@ module Greedo
60
76
  end
61
77
 
62
78
  def empty_message
63
- view_context.content_tag(:p) { "No data to show." }
79
+ view_context.content_tag(:p) { empty_message_text }
64
80
  end
65
81
 
66
82
  private
@@ -74,7 +90,7 @@ module Greedo
74
90
  "#{snake_class}-#{record.id}"
75
91
  end
76
92
 
77
- Column = Struct.new(:value)
93
+ Column = Struct.new(:value, :klass)
78
94
 
79
95
  Row = Struct.new(:record, :row_id, :fields) do
80
96
  def id
@@ -82,14 +98,54 @@ module Greedo
82
98
  end
83
99
 
84
100
  def columns
85
- fields.map{ |f| Column.new(f.value(record)) }
101
+ fields.map{ |f| Column.new(f.value(record), f.klass) }
86
102
  end
87
103
  end
88
104
 
89
- Field = Struct.new(:name, :label, :renderer) do
105
+ Field = Struct.new(:name, :label, :renderer, :order, :order_by, :view_context, :sort) do
90
106
  def value(record)
91
107
  renderer.call(record)
92
108
  end
109
+
110
+ def klass
111
+ label.parameterize.underscore
112
+ end
113
+
114
+ def ordered_by?
115
+ order_by == name.to_s && %w(asc desc).include?(order)
116
+ end
117
+
118
+ def order_desc_path
119
+ if ordered_by? && order == "desc"
120
+ view_context.url_for(view_context.params)
121
+ else
122
+ view_context.url_for(view_context.params.merge(order: :desc, order_by: name))
123
+ end
124
+ end
125
+
126
+ def order_asc_path
127
+ if ordered_by? && order == "asc"
128
+ view_context.url_for(view_context.params)
129
+ else
130
+ view_context.url_for(view_context.params.merge(order: :asc, order_by: name))
131
+ end
132
+ end
133
+
134
+ def order_desc_class
135
+ if ordered_by? && order == "desc"
136
+ "glyphicon-triangle-bottom"
137
+ else
138
+ "glyphicon-chevron-down"
139
+ end
140
+ end
141
+
142
+ def order_asc_class
143
+ if ordered_by? && order == "asc"
144
+ "glyphicon-triangle-top"
145
+ else
146
+ "glyphicon-chevron-up"
147
+ end
148
+ end
93
149
  end
94
150
  end
95
151
 
@@ -97,10 +153,15 @@ module Greedo
97
153
  param_name: :page,
98
154
  page: params.fetch(param_name) { 1 }.to_i,
99
155
  per_page: 20,
156
+ order: params[:order],
157
+ order_by: params[:order_by],
100
158
  &block)
101
- paginator = Paginator.build(scope, page: page, per_page: per_page)
102
- grid = Grid.new(paginator: paginator, view_context: self)
159
+ grid = Grid.new(view_context: self, order: order, order_by: order_by)
103
160
  grid.configure(&block)
161
+ grid.paginator = Paginator.build(scope,
162
+ page: page,
163
+ per_page: per_page,
164
+ order_by: grid.ordered_by)
104
165
  render partial: "greedo/grid", locals: {grid: grid, param_name: param_name}
105
166
  end
106
167
  end
@@ -3,24 +3,30 @@ require "will_paginate-bootstrap"
3
3
 
4
4
  module Greedo
5
5
  class Paginator
6
- attr_reader :scope, :page, :per_page
6
+ attr_reader :scope, :page, :per_page, :order, :order_by
7
7
 
8
8
  def self.build(scope,
9
9
  params: {},
10
10
  page: params.fetch(:page) { 1 }.to_i,
11
- per_page: params.fetch(:per_page) { 20 }.to_i)
12
- return ArrayPaginator.new(scope) if scope.is_a?(Array)
13
- Paginator.new(scope, page: page, per_page: per_page)
11
+ per_page: params.fetch(:per_page) { 20 }.to_i,
12
+ order_by: nil)
13
+ return ArrayPaginator.new(scope, order_by.order, order_by.sort) if scope.is_a?(Array)
14
+ Paginator.new(scope, page: page, per_page: per_page,
15
+ order: order_by.order, order_by: order_by.sort)
14
16
  end
15
17
 
16
- def initialize(scope, page:, per_page:)
18
+ def initialize(scope, page:, per_page:, order: nil, order_by: nil)
17
19
  @scope = scope
18
20
  @page = page
19
21
  @per_page = per_page
22
+ @order = order
23
+ @order_by = order_by
20
24
  end
21
25
 
22
26
  def records
23
- scope.paginate(page: page, per_page: per_page)
27
+ paginated = scope.paginate(page: page, per_page: per_page)
28
+ order_by_fields = [order_by].flatten.map { |field| "#{field} #{order}" }.join(", ")
29
+ order_by ? paginated.reorder(order_by_fields) : paginated
24
30
  end
25
31
 
26
32
  def show?
@@ -29,14 +35,28 @@ module Greedo
29
35
  end
30
36
 
31
37
  class ArrayPaginator
32
- attr_reader :records
38
+ attr_reader :order, :order_by
33
39
 
34
- def initialize(records)
40
+ def initialize(records, order, order_by)
35
41
  @records = records
42
+ @order = order
43
+ @order_by = order_by
44
+ end
45
+
46
+ def records
47
+ @sorted_records ||= sort_records
36
48
  end
37
49
 
38
50
  def show?
39
51
  false
40
52
  end
53
+
54
+ private
55
+
56
+ def sort_records
57
+ sorted = order_by ? @records.sort_by { |r| r.send(order_by) } : @records
58
+
59
+ order == "desc" ? sorted.reverse : sorted
60
+ end
41
61
  end
42
62
  end
@@ -1,3 +1,3 @@
1
1
  module Greedo
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -13,12 +13,12 @@ RSpec.describe Greedo::GridHelper, type: :helper do
13
13
  create_project(name: "Foo")
14
14
 
15
15
  html = helper.greedo(Project.all) do |g|
16
- g.column :id, label: "ID"
17
- g.column :name
16
+ g.column :id, label: "ID", sort: false
17
+ g.column :name, sort: false
18
18
  end
19
19
 
20
- expect(html).to include("<th>ID</th>")
21
- expect(html).to include("<th>Name</th>")
20
+ expect(html).to include("ID")
21
+ expect(html).to include("Name")
22
22
  end
23
23
 
24
24
  it "renders values for each of the columns specified" do
@@ -26,8 +26,8 @@ RSpec.describe Greedo::GridHelper, type: :helper do
26
26
  bar = create_project(name: "Bar")
27
27
 
28
28
  html = helper.greedo(Project.all) do |g|
29
- g.column :id, label: "ID"
30
- g.column :name
29
+ g.column :id, label: "ID", sort: false
30
+ g.column :name, sort: false
31
31
  end
32
32
 
33
33
  expect(html).to include("Foo")
@@ -40,7 +40,7 @@ RSpec.describe Greedo::GridHelper, type: :helper do
40
40
  create_project(name: "Foo")
41
41
 
42
42
  html = helper.greedo(Project.all) do |g|
43
- g.column :name do |p|
43
+ g.column "Name" do |p|
44
44
  p.name.upcase
45
45
  end
46
46
  end
@@ -86,8 +86,8 @@ RSpec.describe Greedo::GridHelper, type: :helper do
86
86
  bar = create_project(name: "Bar")
87
87
 
88
88
  html = helper.greedo(Project.all) do |g|
89
- g.column :id
90
- g.column :name
89
+ g.column :id, sort: false
90
+ g.column :name, sort: false
91
91
  end
92
92
 
93
93
  expect(html).to have_selector("tr#project-#{foo.id}")
@@ -100,8 +100,8 @@ RSpec.describe Greedo::GridHelper, type: :helper do
100
100
 
101
101
  html = helper.greedo(Project.all) do |g|
102
102
  g.row_id { |p| "asdf-#{p.id}" }
103
- g.column :id
104
- g.column :name
103
+ g.column :id, sort: false
104
+ g.column :name, sort: false
105
105
  end
106
106
 
107
107
  expect(html).to have_selector("tr#asdf-#{foo.id}")
@@ -127,7 +127,7 @@ RSpec.describe Greedo::GridHelper, type: :helper do
127
127
 
128
128
  html = helper.greedo(Project.all) do |g|
129
129
  g.presenter ProjectPresenter
130
- g.column :author
130
+ g.column :author, sort: false
131
131
  end
132
132
 
133
133
  expect(html).to include("No Author")
@@ -141,7 +141,7 @@ RSpec.describe Greedo::GridHelper, type: :helper do
141
141
  record.name
142
142
  end
143
143
 
144
- g.column :length
144
+ g.column :length, sort: false
145
145
  end
146
146
 
147
147
  expect(html).to include("3")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: greedo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Pohorecki
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-21 00:00:00.000000000 Z
11
+ date: 2018-04-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -84,16 +84,16 @@ dependencies:
84
84
  name: rails
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: '4.2'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: '4.2'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: sqlite3
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -239,7 +239,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
239
239
  version: '0'
240
240
  requirements: []
241
241
  rubyforge_project:
242
- rubygems_version: 2.4.8
242
+ rubygems_version: 2.6.12
243
243
  signing_key:
244
244
  specification_version: 4
245
245
  summary: A very simple grid library