fancy_table 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/fancy_table.rb +16 -0
- data/lib/fancy_table/controller_methods.rb +29 -0
- data/lib/fancy_table/railtie.rb +12 -0
- data/lib/fancy_table/version.rb +3 -0
- data/lib/fancy_table/view_helpers.rb +34 -0
- data/lib/map_hash.rb +18 -0
- data/lib/smart_order.rb +71 -0
- data/lib/smart_order/README.md +5 -0
- data/lib/smart_order/sortable.rb +68 -0
- metadata +211 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: af8f0bf6693d73534a20a72de346b66a565f53b1
|
4
|
+
data.tar.gz: 20fb9121bcf4e0a0a9d2e1719d4806ad263a8115
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8ba17365f8f49b29810a50a77f96dde6085fb23def04cab9f720eae8726a7844f929550b420c6434a4e77ad70647782fc160e6bc9e26aa3a80a4a82f5759cc8b
|
7
|
+
data.tar.gz: 80614f7eb65e847abc2466113ffe9b3276cd9cc33b309f6b94b9a9991dbdf76fca943f10181f69b28b0b86a7bce9a9e88d97cb0b9b1a27a66dbe3e7f2622cc6a
|
data/lib/fancy_table.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require "fancy_table/version"
|
2
|
+
require 'haml'
|
3
|
+
require 'smart_order'
|
4
|
+
require 'sass-rails'
|
5
|
+
require 'map_hash'
|
6
|
+
require 'squeel'
|
7
|
+
require 'kaminari'
|
8
|
+
require 'coffee-filter'
|
9
|
+
require 'fancy_table/view_helpers'
|
10
|
+
require 'fancy_table/controller_methods'
|
11
|
+
require 'fancy_table/railtie' if defined?(Rails)
|
12
|
+
|
13
|
+
|
14
|
+
module FancyTable
|
15
|
+
# Your code goes here...
|
16
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class ActionController::Base
|
2
|
+
def fancy_table(objects, options = {})
|
3
|
+
order = options[:order] || params[:order_by]
|
4
|
+
objects.define_singleton_method(:fancy_table_order) { order }
|
5
|
+
klass = objects.first.class
|
6
|
+
|
7
|
+
headers = options[:headers] ||
|
8
|
+
begin
|
9
|
+
names = klass.column_names - %w{id created_at updated_at}
|
10
|
+
names.map { |name| name.sub(/_id$/, '') }.map_hash{ |name| [name, name.titleize] }
|
11
|
+
end
|
12
|
+
|
13
|
+
objects.define_singleton_method(:fancy_table_headers) { headers }
|
14
|
+
|
15
|
+
if order =~ /\A(#{headers.keys.join('|')})( desc)?\Z/
|
16
|
+
objects=objects.smart_order order
|
17
|
+
end
|
18
|
+
|
19
|
+
page = options[:page] || params[:page]
|
20
|
+
limit = options[:limit]
|
21
|
+
if limit || page
|
22
|
+
page ||= 1
|
23
|
+
objects = objects.page(page.to_i)
|
24
|
+
objects = objects.per(limit) if limit
|
25
|
+
end
|
26
|
+
|
27
|
+
objects
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module FancyTable
|
2
|
+
class Railtie < Rails::Railtie
|
3
|
+
config.before_configuration do |app|
|
4
|
+
app.paths['app/views'] << File.expand_path('../../../app/views', __FILE__)
|
5
|
+
app.paths['app/assets'] << File.expand_path('../../../app/assets', __FILE__)
|
6
|
+
end
|
7
|
+
|
8
|
+
initializer "fancy_table.view_helpers" do
|
9
|
+
ActionView::Base.send :include, ViewHelpers
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module FancyTable
|
2
|
+
module ViewHelpers
|
3
|
+
def wrap_if(condition, symbol, *args, &block)
|
4
|
+
if condition
|
5
|
+
send symbol, *args, &block
|
6
|
+
else
|
7
|
+
capture(&block)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def wrap_unless(condition, symbol, *args, &block)
|
12
|
+
wrap_if(!condition, symbol, *args, &block)
|
13
|
+
end
|
14
|
+
|
15
|
+
def link_to_object(object, label_attribute = nil)
|
16
|
+
if object.class.respond_to? :table_name
|
17
|
+
pathmethod = "#{object.class.table_name.singularize}_path"
|
18
|
+
if respond_to? pathmethod
|
19
|
+
link_to object.send( label_attribute || object.class.default_order_column ), send(pathmethod, object)
|
20
|
+
else
|
21
|
+
object.to_s
|
22
|
+
end
|
23
|
+
else
|
24
|
+
object.to_s
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def fancy_table(objects, options = {})
|
29
|
+
options.merge! objects: objects
|
30
|
+
render partial: 'fancy_table/fancy_table', locals: options
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
data/lib/map_hash.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
module Enumerable
|
2
|
+
def map_hash(&block)
|
3
|
+
inject({}) do |memo, *args|
|
4
|
+
results = block.call(*args)
|
5
|
+
unless results.nil?
|
6
|
+
k, v = results
|
7
|
+
memo[k]=v
|
8
|
+
end
|
9
|
+
memo
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def slice_hash
|
14
|
+
hash={}
|
15
|
+
each_slice(2) { |k,v| hash[k]=v }
|
16
|
+
hash
|
17
|
+
end
|
18
|
+
end
|
data/lib/smart_order.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
class ActiveRecord::Base
|
2
|
+
def self.smart_order(order, desc = nil)
|
3
|
+
# capture the sort column and whether sorting should be reversed (descending)
|
4
|
+
key, inline_desc = order.sub(/( desc)$/i,''), !!$1
|
5
|
+
desc = inline_desc if desc.nil?
|
6
|
+
last_class = self
|
7
|
+
joins = []
|
8
|
+
conditions = []
|
9
|
+
sum_column = nil
|
10
|
+
|
11
|
+
while matches = key.match(/^(?<first>[^\.]*)\.(?<rest>.*)$/)
|
12
|
+
first = matches[:first]
|
13
|
+
rest = matches[:rest]
|
14
|
+
|
15
|
+
if first.match(/^(.*)=(.*)$/)
|
16
|
+
conditions << last_class.arel_table[$1].eq($2)
|
17
|
+
elsif association = last_class.reflect_on_association(first.to_sym)
|
18
|
+
joins << first
|
19
|
+
last_class = association.klass
|
20
|
+
elsif rest == 'sum'
|
21
|
+
sum_column=first
|
22
|
+
end
|
23
|
+
key = rest
|
24
|
+
end
|
25
|
+
|
26
|
+
scope = scoped
|
27
|
+
if association = last_class.reflect_on_association(key.to_sym)
|
28
|
+
joins << key
|
29
|
+
last_class = association.klass
|
30
|
+
key = last_class.default_order_column
|
31
|
+
end
|
32
|
+
|
33
|
+
unless joins.empty?
|
34
|
+
join = Squeel::Nodes::Join.new(joins.shift.to_sym).outer
|
35
|
+
while nextjoin = joins.shift
|
36
|
+
join = join.send(nextjoin.to_sym).outer
|
37
|
+
end
|
38
|
+
scope = scope.joins join
|
39
|
+
end
|
40
|
+
|
41
|
+
conditions.each do |condition|
|
42
|
+
scope = scope.where condition
|
43
|
+
end
|
44
|
+
|
45
|
+
order =
|
46
|
+
if key == 'sum' or key == 'count'
|
47
|
+
group_bys = column_names.map{|c| "#{table_name}.#{c}"}
|
48
|
+
scope = scope.group(group_bys)
|
49
|
+
if key == 'count'
|
50
|
+
"COUNT(#{last_class.table_name}.id)"
|
51
|
+
else
|
52
|
+
"SUM(#{last_class.table_name}.#{sum_column})"
|
53
|
+
end
|
54
|
+
elsif last_class.respond_to?(special_method= "order_by_#{key}")
|
55
|
+
last_class.send special_method
|
56
|
+
else
|
57
|
+
"#{last_class.table_name}.#{key}"
|
58
|
+
end
|
59
|
+
|
60
|
+
order += " DESC" if desc
|
61
|
+
scope.order(order)
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def self.default_order_column
|
68
|
+
'name'
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
class SmartOrder::Sortable
|
2
|
+
def smart_order(key, desc)
|
3
|
+
last_class = self
|
4
|
+
joins = []
|
5
|
+
conditions = []
|
6
|
+
sum_column = nil
|
7
|
+
|
8
|
+
while matches = key.match(/^(?<first>[^\.]*)\.(?<rest>.*)$/)
|
9
|
+
first = matches[:first]
|
10
|
+
rest = matches[:rest]
|
11
|
+
|
12
|
+
if first.match(/^(.*)=(.*)$/)
|
13
|
+
conditions << last_class.arel_table[$1].eq($2)
|
14
|
+
elsif association = last_class.reflect_on_association(first.to_sym)
|
15
|
+
joins << first
|
16
|
+
last_class = association.klass
|
17
|
+
elsif rest == 'sum'
|
18
|
+
sum_column = first
|
19
|
+
end
|
20
|
+
key = rest
|
21
|
+
end
|
22
|
+
|
23
|
+
scope = scoped
|
24
|
+
if association = last_class.reflect_on_association(key.to_sym)
|
25
|
+
joins << key
|
26
|
+
last_class = association.klass
|
27
|
+
key = last_class.default_order_column
|
28
|
+
end
|
29
|
+
|
30
|
+
unless joins.empty?
|
31
|
+
join = Squeel::Nodes::Join.new(joins.shift.to_sym).outer
|
32
|
+
while nextjoin = joins.shift
|
33
|
+
join = join.send(nextjoin.to_sym).outer
|
34
|
+
end
|
35
|
+
scope = scope.joins join
|
36
|
+
end
|
37
|
+
|
38
|
+
conditions.each do |condition|
|
39
|
+
scope = scope.where condition
|
40
|
+
end
|
41
|
+
|
42
|
+
order =
|
43
|
+
if key == 'sum' or key == 'count'
|
44
|
+
group_bys = column_names.map{|c| "#{table_name}.#{c}"}
|
45
|
+
scope = scope.group(group_bys)
|
46
|
+
if key == 'count'
|
47
|
+
"COUNT(#{last_class.table_name}.id)"
|
48
|
+
else
|
49
|
+
"SUM(#{last_class.table_name}.#{sum_column})"
|
50
|
+
end
|
51
|
+
elsif last_class.respond_to?(special_method = "order_by_#{key}")
|
52
|
+
last_class.send special_method
|
53
|
+
else
|
54
|
+
"#{last_class.table_name}.#{key}"
|
55
|
+
end
|
56
|
+
|
57
|
+
order += " DESC" if desc
|
58
|
+
scope.order(order)
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
#private
|
63
|
+
|
64
|
+
def default_order_column
|
65
|
+
columns.map(&:name).include?('name') ? 'name' : 'id'
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
metadata
ADDED
@@ -0,0 +1,211 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fancy_table
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Caleb Thompson
|
8
|
+
- Ram Dobson
|
9
|
+
- Sol Systems
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2014-02-05 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: coffee-filter
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - ">="
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: '0'
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: haml
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
36
|
+
type: :runtime
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
name: kaminari
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
type: :runtime
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: rails
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
type: :runtime
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: sass-rails
|
73
|
+
requirement: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
type: :runtime
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: squeel
|
87
|
+
requirement: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
type: :runtime
|
93
|
+
prerelease: false
|
94
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
- !ruby/object:Gem::Dependency
|
100
|
+
name: cucumber-rails
|
101
|
+
requirement: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
type: :development
|
107
|
+
prerelease: false
|
108
|
+
version_requirements: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: database_cleaner
|
115
|
+
requirement: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
type: :development
|
121
|
+
prerelease: false
|
122
|
+
version_requirements: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
- !ruby/object:Gem::Dependency
|
128
|
+
name: factory_girl_rails
|
129
|
+
requirement: !ruby/object:Gem::Requirement
|
130
|
+
requirements:
|
131
|
+
- - ">="
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '0'
|
141
|
+
- !ruby/object:Gem::Dependency
|
142
|
+
name: rspec-rails
|
143
|
+
requirement: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
145
|
+
- - ">="
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: '0'
|
148
|
+
type: :development
|
149
|
+
prerelease: false
|
150
|
+
version_requirements: !ruby/object:Gem::Requirement
|
151
|
+
requirements:
|
152
|
+
- - ">="
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: '0'
|
155
|
+
- !ruby/object:Gem::Dependency
|
156
|
+
name: sqlite3
|
157
|
+
requirement: !ruby/object:Gem::Requirement
|
158
|
+
requirements:
|
159
|
+
- - ">="
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
version: '0'
|
162
|
+
type: :development
|
163
|
+
prerelease: false
|
164
|
+
version_requirements: !ruby/object:Gem::Requirement
|
165
|
+
requirements:
|
166
|
+
- - ">="
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: '0'
|
169
|
+
description: |
|
170
|
+
Create fancy tables which are semantic HTML5, are easy tostyle, and are beautiful.
|
171
|
+
email:
|
172
|
+
- cjaysson@gmail.com
|
173
|
+
- fringd@gmail.com
|
174
|
+
- gems@solsystemscompany.com
|
175
|
+
executables: []
|
176
|
+
extensions: []
|
177
|
+
extra_rdoc_files: []
|
178
|
+
files:
|
179
|
+
- lib/fancy_table.rb
|
180
|
+
- lib/fancy_table/controller_methods.rb
|
181
|
+
- lib/fancy_table/railtie.rb
|
182
|
+
- lib/fancy_table/version.rb
|
183
|
+
- lib/fancy_table/view_helpers.rb
|
184
|
+
- lib/map_hash.rb
|
185
|
+
- lib/smart_order.rb
|
186
|
+
- lib/smart_order/README.md
|
187
|
+
- lib/smart_order/sortable.rb
|
188
|
+
homepage:
|
189
|
+
licenses: []
|
190
|
+
metadata: {}
|
191
|
+
post_install_message:
|
192
|
+
rdoc_options: []
|
193
|
+
require_paths:
|
194
|
+
- lib
|
195
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
196
|
+
requirements:
|
197
|
+
- - ">="
|
198
|
+
- !ruby/object:Gem::Version
|
199
|
+
version: '0'
|
200
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
201
|
+
requirements:
|
202
|
+
- - ">="
|
203
|
+
- !ruby/object:Gem::Version
|
204
|
+
version: '0'
|
205
|
+
requirements: []
|
206
|
+
rubyforge_project: fancy_table
|
207
|
+
rubygems_version: 2.2.1
|
208
|
+
signing_key:
|
209
|
+
specification_version: 4
|
210
|
+
summary: Tables. Done right.
|
211
|
+
test_files: []
|