listalicious 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/builders/generic_builder.rb +9 -1
- data/lib/builders/table_builder.rb +10 -3
- data/lib/listalicious.rb +64 -52
- data/listalicious.gemspec +2 -2
- metadata +2 -2
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ begin
|
|
5
5
|
require 'jeweler'
|
6
6
|
Jeweler::Tasks.new do |gem|
|
7
7
|
gem.name = "listalicious"
|
8
|
-
gem.summary = %Q{Semantic lists (datagrids) for Rails}
|
8
|
+
gem.summary = %Q{Semantic lists (aka datagrids) for Rails}
|
9
9
|
gem.description = %Q{Semantic listing; a semantic way to build datagrid structures in Rails.}
|
10
10
|
gem.email = "jejacks0n@gmail.com"
|
11
11
|
gem.homepage = "http://github.com/jejacks0n/listalicious"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.3
|
@@ -5,8 +5,10 @@ module Listalicious
|
|
5
5
|
|
6
6
|
def initialize(template, collection, options = {}, &proc)
|
7
7
|
@template, @collection, @options = template, collection, options
|
8
|
-
@object_name = "#{options[:as] || collection.
|
8
|
+
@object_name = "#{options[:as] || (collection.empty? ? '' : collection.first.class.name.underscore)}"
|
9
9
|
@table_name = (options[:table_name] || @object_name.pluralize).to_s
|
10
|
+
@object = @object_name.classify.constantize.new
|
11
|
+
@column_count = 0
|
10
12
|
|
11
13
|
render(options.delete(:html), &proc)
|
12
14
|
end
|
@@ -19,9 +21,15 @@ module Listalicious
|
|
19
21
|
# eg. order[users][]=login:asc&order[users][]=first_name:asc
|
20
22
|
def orderable_link(contents, field)
|
21
23
|
return contents if @object_name.empty?
|
24
|
+
field = field.to_s
|
22
25
|
|
23
26
|
order_params = (template.params['order'] || {})[@table_name]
|
24
27
|
fields = Hash[*order_params.to_a.collect { |field_and_dir| field_and_dir.split(':') }.flatten]
|
28
|
+
if @object && @object.default_order[:field].to_s == field
|
29
|
+
# TODO: this should technically be fields.empty? && @object.default_order[:options][:stable],
|
30
|
+
# but it lends itself to a little bit of an odd behavior unless you're expecting the additive ordering
|
31
|
+
fields[field] = fields[field] || @object.default_order[:direction].to_s if fields.empty?
|
32
|
+
end
|
25
33
|
|
26
34
|
order_params = (template.params['order'] || {}).clone.
|
27
35
|
merge({@table_name => ["#{field}:#{"#{fields[field] == 'asc' ? 'desc' : 'asc'}"}"]})
|
@@ -41,7 +41,7 @@ module Listalicious
|
|
41
41
|
def column_group_head(options = {}, &proc)
|
42
42
|
@column_count = 0
|
43
43
|
|
44
|
-
@head_wrapper = template.content_tag(:tr, template.capture(collection.first, 0, &proc),
|
44
|
+
@head_wrapper = template.content_tag(:tr, template.capture(collection.first || @object, 0, &proc),
|
45
45
|
options[:html].merge({:class => template.add_class(options[:html][:class], 'header')}))
|
46
46
|
template.content_tag(:thead, @head_wrapper, options.delete(:wrapper_html))
|
47
47
|
end
|
@@ -78,7 +78,13 @@ module Listalicious
|
|
78
78
|
contents = options == args.first ? nil : args.first
|
79
79
|
|
80
80
|
if @current_scope == :body
|
81
|
-
contents =
|
81
|
+
contents = if block_given?
|
82
|
+
template.capture(self, &proc)
|
83
|
+
elsif args.last.is_a?(Proc)
|
84
|
+
args.last.call
|
85
|
+
else
|
86
|
+
contents
|
87
|
+
end
|
82
88
|
else
|
83
89
|
contents = options[:title] || contents
|
84
90
|
end
|
@@ -124,7 +130,8 @@ module Listalicious
|
|
124
130
|
options[:html] ||= {}
|
125
131
|
options[:html][:width] ||= options[:width]
|
126
132
|
|
127
|
-
|
133
|
+
options[:sort] ||= contents.is_a?(Symbol) ? contents : nil
|
134
|
+
contents = contents.to_s.humanize.titleize
|
128
135
|
contents = orderable_link(contents, options[:sort]) if options[:sort]
|
129
136
|
|
130
137
|
template.content_tag(:th, contents, options.delete(:html))
|
data/lib/listalicious.rb
CHANGED
@@ -2,11 +2,18 @@
|
|
2
2
|
require 'builders/generic_builder'
|
3
3
|
require 'builders/table_builder'
|
4
4
|
|
5
|
-
module Listalicious
|
5
|
+
module Listalicious
|
6
6
|
|
7
7
|
# Semantic list helper methods
|
8
8
|
#
|
9
|
-
# Example Usage
|
9
|
+
# == Example Usage (HAML)
|
10
|
+
# - semantic_list_for @users, :as => :user, :html => {:class => 'user-list'} do |l|
|
11
|
+
# = l.columns [:head, :body] do |user, index|
|
12
|
+
# = l.column "#{user.first_name} #{user.last_name}", :title => 'User Name', :sort => 'first_name', :width => '20%'
|
13
|
+
# = l.column :login, :width => '20%'
|
14
|
+
# = l.column link_to(user.email, "mailto:#{user.email}"), :title => 'Email Address', :sort => 'email', :width => '40%'
|
15
|
+
# = l.controls do
|
16
|
+
# = link_to('edit', edit_user_path(user))
|
10
17
|
#
|
11
18
|
module SemanticListHelper
|
12
19
|
|
@@ -20,7 +27,7 @@ module Listalicious #:nodoc:
|
|
20
27
|
|
21
28
|
options[:html] ||= {}
|
22
29
|
options[:html][:class] = add_class(options[:html][:class], 'semantic-list')
|
23
|
-
options[:html][:id] ||=
|
30
|
+
options[:html][:id] ||= options[:as].to_s
|
24
31
|
|
25
32
|
if options[:sort_url]
|
26
33
|
options[:html][:class] = add_class(options[:html][:class], 'sortable')
|
@@ -30,7 +37,7 @@ module Listalicious #:nodoc:
|
|
30
37
|
options[:html][:class] = add_class(options[:html][:class], 'selectable') if options[:selectable]
|
31
38
|
options[:html][:class] = add_class(options[:html][:class], 'expandable') if options[:expandable]
|
32
39
|
|
33
|
-
builder = options[:builder] ||
|
40
|
+
builder = options[:builder] || TableBuilder
|
34
41
|
builder.new(@template, collection, options, &proc)
|
35
42
|
end
|
36
43
|
|
@@ -41,7 +48,45 @@ module Listalicious #:nodoc:
|
|
41
48
|
|
42
49
|
end
|
43
50
|
|
44
|
-
module ActiveRecordExtensions
|
51
|
+
module ActiveRecordExtensions
|
52
|
+
|
53
|
+
# Makes a given model orderable for lists
|
54
|
+
#
|
55
|
+
# To specify that a model behaves according to the Listalicious order style call orderable_fields. The
|
56
|
+
# orderable_fields method takes a configuration block.
|
57
|
+
#
|
58
|
+
# === Example
|
59
|
+
# orderable_fields do
|
60
|
+
# only :first_name, :last_name
|
61
|
+
# default :last_name
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
# === Configuration Methods
|
65
|
+
# [only]
|
66
|
+
# Provide fields that are orderable.
|
67
|
+
# [except]
|
68
|
+
# Provide fields that are not orderable, with the default list being all fields.
|
69
|
+
# [default]
|
70
|
+
# Provide the default sort field, optionally a direction, and additional options.
|
71
|
+
#
|
72
|
+
# *Notes*:
|
73
|
+
# * If +only+ or +except+ are not called within the block, all fields on the model will be orderable, this includes
|
74
|
+
# things like id, and password/password salt columns.
|
75
|
+
# * If +default+ isn't called, the first field will be considered the default, asc being the default direction.
|
76
|
+
#
|
77
|
+
def orderable_fields(&config_block)
|
78
|
+
cattr_accessor :orderable_fields, :default_order
|
79
|
+
|
80
|
+
# make all columns orderable, incase only or except aren't called in the configuration block
|
81
|
+
self.orderable_fields = column_names.map { |column_name| column_name.to_s }
|
82
|
+
|
83
|
+
OrderableConfiguration.new(self).instance_eval(&config_block)
|
84
|
+
self.orderable_fields.collect!{ |field| field.to_s }
|
85
|
+
|
86
|
+
self.default_order ||= {:field => self.orderable_fields.first, :direction => :desc, :options => {}}
|
87
|
+
|
88
|
+
attach_orderable_scopes
|
89
|
+
end
|
45
90
|
|
46
91
|
class OrderableConfiguration
|
47
92
|
def initialize(target)
|
@@ -83,48 +128,10 @@ module Listalicious #:nodoc:
|
|
83
128
|
field = args.shift
|
84
129
|
direction = args.shift || :asc
|
85
130
|
|
86
|
-
@target.default_order = {:field => field, :direction => direction, :options => options}
|
131
|
+
@target.default_order = {:field => field, :direction => direction, :options => options || {}}
|
87
132
|
end
|
88
133
|
end
|
89
134
|
|
90
|
-
# Makes a given model orderable for lists
|
91
|
-
#
|
92
|
-
# To specify that a model behaves according to the Listalicious order style call orderable_fields. The
|
93
|
-
# orderable_fields method takes a configuration block.
|
94
|
-
#
|
95
|
-
# === Example
|
96
|
-
# orderable_fields do
|
97
|
-
# only :first_name, :last_name
|
98
|
-
# default :last_name
|
99
|
-
# end
|
100
|
-
#
|
101
|
-
# === Configuration Methods
|
102
|
-
# [only]
|
103
|
-
# Provide fields that are orderable.
|
104
|
-
# [except]
|
105
|
-
# Provide fields that are not orderable, with the default list being all fields.
|
106
|
-
# [default]
|
107
|
-
# Provide the default sort field, optionally a direction, and additional options.
|
108
|
-
#
|
109
|
-
# *Notes*:
|
110
|
-
# * If +only+ or +except+ are not called within the block, all fields on the model will be orderable, this includes
|
111
|
-
# things like id, and password/password salt columns.
|
112
|
-
# * If +default+ isn't called, the first field will be considered the default, asc being the default direction.
|
113
|
-
#
|
114
|
-
def orderable_fields(&config_block)
|
115
|
-
cattr_accessor :orderable_fields, :default_order
|
116
|
-
|
117
|
-
# make all columns orderable, incase only or except aren't called in the configuration block
|
118
|
-
self.orderable_fields = column_names.map { |column_name| column_name.to_s }
|
119
|
-
|
120
|
-
OrderableConfiguration.new(self).instance_eval(&config_block)
|
121
|
-
self.orderable_fields.collect!{ |field| field.to_s }
|
122
|
-
|
123
|
-
self.default_order ||= {:field => self.orderable_fields.first, :direction => :desc}
|
124
|
-
|
125
|
-
attach_orderable_scopes
|
126
|
-
end
|
127
|
-
|
128
135
|
# Attaches the ordered_from named scope to the model requesting it. The named scope can be chained in the
|
129
136
|
# controller by using:
|
130
137
|
#
|
@@ -137,16 +144,21 @@ module Listalicious #:nodoc:
|
|
137
144
|
# Which will generate the order clause +"last_name DESC, first_name ASC"+.
|
138
145
|
def attach_orderable_scopes
|
139
146
|
self.named_scope :ordered_from, lambda { |params|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
+
fields = []
|
148
|
+
if params.include?(:order) and params[:order][self.table_name.to_sym]
|
149
|
+
fields = params[:order][self.table_name.to_sym].collect do |field_and_dir|
|
150
|
+
field, dir = field_and_dir.split(':')
|
151
|
+
self.orderable_fields.include?(field) ? [field, dir.to_s.downcase] : nil
|
152
|
+
end.compact
|
153
|
+
end
|
154
|
+
|
155
|
+
if self.default_order && fields.empty? || self.default_order[:options][:stable]
|
156
|
+
fields << [self.default_order[:field], self.default_order[:direction]]
|
157
|
+
end
|
158
|
+
|
147
159
|
fields.empty? ?
|
148
160
|
nil :
|
149
|
-
{:order => fields.map{ |field, dir| "#{field} #{dir.downcase == 'desc' ? 'DESC' : 'ASC'}" }.join(', ')}
|
161
|
+
{:order => fields.map{ |field, dir| "#{field} #{dir.to_s.downcase == 'desc' ? 'DESC' : 'ASC'}" }.join(', ')}
|
150
162
|
}
|
151
163
|
end
|
152
164
|
|
data/listalicious.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{listalicious}
|
8
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jeremy Jackson"]
|
@@ -34,7 +34,7 @@ Gem::Specification.new do |s|
|
|
34
34
|
s.rdoc_options = ["--charset=UTF-8"]
|
35
35
|
s.require_paths = ["lib"]
|
36
36
|
s.rubygems_version = %q{1.3.5}
|
37
|
-
s.summary = %q{Semantic lists (datagrids) for Rails}
|
37
|
+
s.summary = %q{Semantic lists (aka datagrids) for Rails}
|
38
38
|
s.test_files = [
|
39
39
|
"test/helper.rb",
|
40
40
|
"test/test_listalicious.rb"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: listalicious
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Jackson
|
@@ -71,7 +71,7 @@ rubyforge_project:
|
|
71
71
|
rubygems_version: 1.3.5
|
72
72
|
signing_key:
|
73
73
|
specification_version: 3
|
74
|
-
summary: Semantic lists (datagrids) for Rails
|
74
|
+
summary: Semantic lists (aka datagrids) for Rails
|
75
75
|
test_files:
|
76
76
|
- test/helper.rb
|
77
77
|
- test/test_listalicious.rb
|