zable 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/README.md ADDED
@@ -0,0 +1,68 @@
1
+ # Zable
2
+
3
+ Zable lets you easily build sortable and searchable tables of your active record objects.
4
+
5
+ ## zable view helper
6
+
7
+ The zable helper method will render the actual table in your view.
8
+
9
+ ```ruby
10
+ zable collection, options = {} do
11
+ # define columns
12
+ end
13
+ ```
14
+
15
+ * **collection** - (Array) An array of active_record objects
16
+ * **options** - (Hash)
17
+ * **:class** - (String) Html class
18
+ * **:id** - (String) Html id
19
+
20
+ Within the zable block, you can use the `column` method to define the columns of your table.
21
+
22
+ ```ruby
23
+ column(attribute, options={})
24
+ column(attribute, options={}, &block)
25
+
26
+ # example
27
+ zable @items do
28
+ column :column_1
29
+ column :column_2 {|item| item.to_s}
30
+ end
31
+ ```
32
+
33
+ * **attribute** - (Symbol) Name of the attribute on the active_record object for this column. When no block is supplied, this will be the content of this column.
34
+ * **options** - (Hash)
35
+ * **:title** - (String or Proc) You can use this to designate a custom header title string, or with a proc, supply completely custom header markup.
36
+ * **:sort** - (Boolean, default: true) By default, the header title will be a link that can be used to sort its respective column. However by setting this option to false, the title will not be a link.
37
+
38
+
39
+ ## Example
40
+
41
+ user.rb:
42
+ ```ruby
43
+ # basic sortable behavior on attribute
44
+ sortable :name, :email, :created_at
45
+
46
+ # sort on a non-attribute
47
+ scope :sort_age, -> criteria { includes(:profile).order("profile.age #{criteria[:order]}") }
48
+ ```
49
+
50
+ users_controller.rb:
51
+ ```ruby
52
+ def index
53
+ @users = User.populate(params)
54
+ end
55
+ ```
56
+
57
+ index.html.erb:
58
+ ```erb
59
+ <%=
60
+ zable @items, :table_class => ["users-table", "shiny-colorful-table"] do
61
+ column(:name)
62
+ column(:email)
63
+ column(:created_at, :title => "Join Date")
64
+ column(:age) {|user| user.profile.age}
65
+ column(:edit, :title => "") {|user| link_to "Edit", edit_user_path(user)}
66
+ end
67
+ %>
68
+ ```
@@ -5,36 +5,9 @@ module ZableHelper
5
5
  base.send :include, Zable::Html
6
6
  end
7
7
 
8
- def zable(collection, klass, args={}, &block)
9
- reset_cycle("zable_cycle")
10
-
11
- html = ''.html_safe #stylesheet_link_tag("zable")
12
- html << pagination_element(collection, args.slice(:entry_name, :params)) if args[:paginate]
13
- html << zable_element(args, block, collection, klass, args[:params])
14
- html << pagination_element(collection, args.slice(:entry_name, :params)) if args[:paginate]
15
- html
16
- end
17
-
18
- def zable_element(args, block, collection, klass, params)
19
- cols = columns(&block)
20
- cols.instance_variable_set :@search_params, controller.request.params[:search]
21
- cols.instance_variable_set :@_extra_params, params
22
- content_tag(:table, tag_args(args)) do
23
- table_header(klass, cols) << table_body(collection, cols, args)
24
- end
25
- end
26
-
27
- def pagination_element(collection, options)
28
- content_tag :div, :class => 'brownFilterResultsBox' do
29
- page_entries_info(collection, options.slice(:entry_name)) <<
30
- will_paginate(collection, :renderer => LinkWithParamsRenderer.new(options[:params] || {}))
31
- end
32
- end
33
-
34
- def columns
35
- controller.request.instance_variable_set :@zable_columns, []
36
- yield
37
- controller.request.instance_variable_get :@zable_columns
8
+ def zable(collection, args={}, &block)
9
+ table = Zable::View.new(collection, self, args, &block)
10
+ table.render
38
11
  end
39
12
 
40
13
  def sorted_column?(name)
@@ -50,18 +23,4 @@ module ZableHelper
50
23
  current_sort_order == :desc ? :asc : :desc
51
24
  end
52
25
 
53
- def column(name, options={}, &block)
54
- col = {
55
- :name => name,
56
- :title => options[:title],
57
- :sort => options.has_key?(:sort) ? options[:sort] : true,
58
- :block => block,
59
- :sorted? => sorted_column?(name),
60
- :sort_order => link_sort_order(name)
61
- }
62
-
63
- zable_columns = controller.request.instance_variable_get :@zable_columns
64
- zable_columns << col
65
- end
66
-
67
26
  end
data/lib/zable/html.rb CHANGED
@@ -2,37 +2,37 @@ module Zable
2
2
  module Html
3
3
 
4
4
  ## Table header methods
5
- def table_header(klass, columns)
5
+ def table_header(columns)
6
6
  content_tag :thead do
7
- table_header_row(klass, columns)
7
+ table_header_row(columns)
8
8
  end
9
9
  end
10
10
 
11
- def table_header_row(klass, columns)
11
+ def table_header_row(columns)
12
12
  content_tag :tr do
13
- table_header_cells(klass, columns)
13
+ table_header_cells(columns)
14
14
  end
15
15
  end
16
16
 
17
- def table_header_cells(klass, columns)
17
+ def table_header_cells(columns)
18
18
  columns.inject("".html_safe) do |str, attr|
19
- str << table_header_cell(klass, attr, columns)
19
+ str << table_header_cell(attr, columns)
20
20
  end
21
21
  end
22
22
 
23
- def table_header_cell(klass, attr, columns)
24
- content_tag :th, :id => header_cell_id(klass, attr) do
23
+ def table_header_cell(attr, columns)
24
+ content_tag :th, :data => {:column => idify(attr[:name])} do
25
25
  header_cell_content(attr, columns)
26
26
  end
27
27
  end
28
28
 
29
29
  def header_cell_content(attr, columns)
30
- str = link_to_if attr[:sort], header_cell_link_text(attr), header_cell_href(attr, columns)
31
- str << header_cell_sort_image(attr)
32
- end
33
-
34
- def header_cell_id(klass, attr)
35
- "#{idify klass.name}_#{idify attr[:name]}".html_safe
30
+ if attr[:title] && attr[:title].respond_to?(:call)
31
+ attr[:title].call
32
+ else
33
+ str = link_to_if attr[:sort], header_cell_link_text(attr), header_cell_href(attr)
34
+ str << header_cell_sort_image(attr)
35
+ end
36
36
  end
37
37
 
38
38
  def current_url
@@ -60,10 +60,8 @@ module Zable
60
60
  attr[:sort_order] == :desc ? "ascending.gif" : "descending.gif"
61
61
  end
62
62
 
63
- def header_cell_href(attr, columns)
64
- search = columns.instance_variable_get :@search_params
65
- extra_params = columns.instance_variable_get(:@_extra_params) || {}
66
- all_params = [sort_params(attr), search_params(search), extra_params.to_query.html_safe].reject(&:blank?).join("&".html_safe)
63
+ def header_cell_href(attr)
64
+ all_params = [sort_params(attr), search_params(@search), (@_extra_params || {}).to_query.html_safe].reject(&:blank?).join("&".html_safe)
67
65
  current_url << "?".html_safe << all_params
68
66
  end
69
67
 
@@ -144,10 +142,8 @@ module Zable
144
142
  val.to_s.demodulize.underscore
145
143
  end
146
144
 
147
- def tag_args(args)
148
- tag_args = {}
149
- tag_args[:class] = args[:table_class].join(" ".html_safe) if args[:table_class] and !args[:table_class].empty?
150
- tag_args
145
+ def tag_args(options)
146
+ {class: options[:class], id: options[:id]}
151
147
  end
152
148
 
153
149
  end
data/lib/zable/sort.rb CHANGED
@@ -6,7 +6,10 @@ module Zable
6
6
  module ClassMethods
7
7
  def inherited(subclass)
8
8
  subclass.class_eval do
9
- scope :for_sort_params, -> sort_params { inject_sort_scope(sort_params) }
9
+ def self.for_sort_params(sort_params)
10
+ return self unless sort_params
11
+ inject_sort_scope(sort_params)
12
+ end
10
13
  end
11
14
  super(subclass)
12
15
  end
data/lib/zable/view.rb ADDED
@@ -0,0 +1,71 @@
1
+ module Zable
2
+
3
+ class View
4
+ include Zable::Html
5
+
6
+ attr_reader :columns
7
+
8
+ def initialize(collection, template, options={}, &block)
9
+ @collection = collection
10
+
11
+ @template = template # this refers to the view context
12
+ raise "Must pass in valid view context" unless @template.kind_of? ActionView::Context
13
+ @search = @template.controller.request.params[:search]
14
+ @_extra_params = options[:params]
15
+
16
+ @options = options
17
+ @columns = []
18
+ instance_eval(&block)
19
+ end
20
+
21
+ def render
22
+ reset_cycle("zable_cycle")
23
+
24
+ html = ''.html_safe #stylesheet_link_tag("zable")
25
+ html << pagination_element if @options[:paginate]
26
+ html << zable_element
27
+ html << pagination_element if @options[:paginate]
28
+ html
29
+ end
30
+
31
+ def column(name, options={}, &block)
32
+ col = {
33
+ :name => name,
34
+ :title => options[:title],
35
+ :sort => options.has_key?(:sort) ? options[:sort] : true,
36
+ :block => block,
37
+ :sorted? => sorted_column?(name),
38
+ :sort_order => link_sort_order(name)
39
+ }
40
+
41
+ @columns << col
42
+ end
43
+
44
+ private
45
+
46
+ def h
47
+ @template
48
+ end
49
+
50
+ def method_missing(*args, &block)
51
+ # missing methods will be sent to the view context - these will generally be rails helper methods
52
+ h.send(*args, &block)
53
+ end
54
+
55
+ def zable_element
56
+ content_tag(:table, tag_args(@options)) do
57
+ table_header(@columns) << table_body(@collection, @columns, @options)
58
+ end
59
+ end
60
+
61
+ def pagination_element
62
+ content_tag :div, :class => 'brownFilterResultsBox' do
63
+ page_entries_info(@collection, @options.slice(:entry_name)) <<
64
+ will_paginate(@collection, :renderer => Zable::WillPaginate::LinkWithParamsRenderer.new(@options[:params] || {}))
65
+ end
66
+ end
67
+
68
+
69
+ end
70
+
71
+ end
data/lib/zable.rb CHANGED
@@ -7,5 +7,6 @@ module Zable
7
7
  require 'zable/search'
8
8
  require 'zable/hash'
9
9
  require 'zable/will_paginate'
10
+ require 'zable/view'
10
11
 
11
12
  end
metadata CHANGED
@@ -1,19 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Derek Croft
9
+ - Joe Kurleto
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2012-08-13 00:00:00.000000000 Z
13
+ date: 2013-02-05 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: will_paginate
16
- requirement: &70333429550560 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
17
18
  none: false
18
19
  requirements:
19
20
  - - ! '>='
@@ -21,7 +22,12 @@ dependencies:
21
22
  version: '0'
22
23
  type: :runtime
23
24
  prerelease: false
24
- version_requirements: *70333429550560
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
25
31
  description: HTML searching, sorting and pagination made dead simple
26
32
  email:
27
33
  executables: []
@@ -34,6 +40,7 @@ files:
34
40
  - lib/zable/html.rb
35
41
  - lib/zable/search.rb
36
42
  - lib/zable/sort.rb
43
+ - lib/zable/view.rb
37
44
  - lib/zable/will_paginate.rb
38
45
  - lib/zable/zable_test_helper.rb
39
46
  - lib/zable.rb
@@ -41,7 +48,7 @@ files:
41
48
  - public/images/common/pagination_bg_dis.gif
42
49
  - MIT-LICENSE
43
50
  - Rakefile
44
- - README.rdoc
51
+ - README.md
45
52
  homepage:
46
53
  licenses: []
47
54
  post_install_message:
@@ -62,7 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
62
69
  version: '0'
63
70
  requirements: []
64
71
  rubyforge_project:
65
- rubygems_version: 1.8.11
72
+ rubygems_version: 1.8.23
66
73
  signing_key:
67
74
  specification_version: 3
68
75
  summary: HTML tables
data/README.rdoc DELETED
@@ -1,8 +0,0 @@
1
- = Zable
2
-
3
-
4
- zable @items, Item, :table_class => ["items-table", "shiny-colorful-table"] do
5
- column(:name)
6
- column(:color)
7
- column(:owner_name) { |item| item.owner.name }
8
- end