presenting 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/LICENSE +20 -20
  2. data/README +10 -10
  3. data/Rakefile +22 -22
  4. data/app/assets/javascripts/search.js +13 -13
  5. data/app/assets/stylesheets/details-color.css +7 -7
  6. data/app/assets/stylesheets/details.css +10 -10
  7. data/app/assets/stylesheets/form.css +1 -1
  8. data/app/assets/stylesheets/grid-color.css +71 -71
  9. data/app/assets/stylesheets/grid.css +64 -64
  10. data/app/assets/stylesheets/search-color.css +16 -16
  11. data/app/assets/stylesheets/search.css +45 -45
  12. data/app/controllers/presentation/assets_controller.rb +42 -42
  13. data/app/views/presentations/_details.erb +11 -11
  14. data/app/views/presentations/_field_search.erb +14 -14
  15. data/app/views/presentations/_form.erb +20 -20
  16. data/app/views/presentations/_grid.erb +70 -70
  17. data/app/views/presentations/_search.erb +7 -7
  18. data/lib/presentation/base.rb +31 -31
  19. data/lib/presentation/details.rb +21 -21
  20. data/lib/presentation/field_search.rb +67 -67
  21. data/lib/presentation/form.rb +149 -149
  22. data/lib/presentation/grid.rb +162 -160
  23. data/lib/presentation/search.rb +9 -9
  24. data/lib/presenting/attribute.rb +51 -51
  25. data/lib/presenting/configurable.rb +10 -10
  26. data/lib/presenting/defaults.rb +10 -10
  27. data/lib/presenting/field_set.rb +26 -26
  28. data/lib/presenting/form_helpers.rb +51 -51
  29. data/lib/presenting/helpers.rb +114 -114
  30. data/lib/presenting/sanitize.rb +19 -19
  31. data/lib/presenting/search.rb +185 -185
  32. data/lib/presenting/sorting.rb +87 -87
  33. data/test/attribute_test.rb +61 -61
  34. data/test/configurable_test.rb +20 -20
  35. data/test/details_test.rb +68 -68
  36. data/test/field_search_test.rb +102 -102
  37. data/test/field_set_test.rb +46 -46
  38. data/test/grid_test.rb +246 -239
  39. data/test/helpers_test.rb +72 -72
  40. data/test/presenting_test.rb +15 -15
  41. data/test/r3/Gemfile +7 -7
  42. data/test/r3/Gemfile.lock +86 -82
  43. data/test/r3/config/application.rb +12 -12
  44. data/test/r3/config/boot.rb +6 -6
  45. data/test/r3/config/database.yml +22 -22
  46. data/test/r3/config/environment.rb +5 -5
  47. data/test/r3/config/environments/test.rb +35 -35
  48. data/test/r3/db/test.sqlite3 +0 -0
  49. data/test/r3/log/test.log +336 -0
  50. data/test/r3/public/javascripts/presenting/grid.js +0 -0
  51. data/test/r3/public/javascripts/presenting/search.js +13 -13
  52. data/test/r3/public/stylesheets/presenting/details-color.css +7 -7
  53. data/test/r3/public/stylesheets/presenting/details.css +10 -10
  54. data/test/r3/public/stylesheets/presenting/form.css +1 -1
  55. data/test/r3/public/stylesheets/presenting/grid-color.css +71 -71
  56. data/test/r3/public/stylesheets/presenting/grid.css +64 -64
  57. data/test/r3/public/stylesheets/presenting/search-color.css +16 -16
  58. data/test/r3/public/stylesheets/presenting/search.css +45 -45
  59. data/test/sanitize_test.rb +15 -15
  60. data/test/search_conditions_test.rb +137 -137
  61. data/test/search_test.rb +30 -30
  62. data/test/sorting_test.rb +63 -63
  63. metadata +74 -74
@@ -1,11 +1,11 @@
1
- <div class="presentation-details">
2
- <% if @details.title %>
3
- <h3><%= @details.title %></h3>
4
- <% end %>
5
- <dl>
6
- <% @details.fields.each do |field| %>
7
- <dt><%= field.name %></dt>
8
- <dd><%= present(field.value_from(@details.presentable), :raw => !field.sanitize?) %></dd>
9
- <% end %>
10
- </dl>
11
- </div>
1
+ <div class="presentation-details">
2
+ <% if @details.title %>
3
+ <h3><%= @details.title %></h3>
4
+ <% end %>
5
+ <dl>
6
+ <% @details.fields.each do |field| %>
7
+ <dt><%= field.name %></dt>
8
+ <dd><%= present(field.value_from(@details.presentable), :raw => !field.sanitize?) %></dd>
9
+ <% end %>
10
+ </dl>
11
+ </div>
@@ -1,14 +1,14 @@
1
- <div class="presentation-search">
2
- <%= form_tag @search.url, :method => :get, :class => ("compact" if @search.compact) do %>
3
- <% @search.fields.each do |field| %>
4
- <fieldset>
5
- <label><%= field.name %></label>
6
- <%= present(field, "#{field.type}_search", :name => "search[#{field.param}][value]") %>
7
- </fieldset>
8
- <% end %>
9
- <fieldset class="submit">
10
- <input type="submit" value="Search" class="submit" />
11
- <%= link_to 'reset', @search.url %>
12
- </fieldset>
13
- <% end %>
14
- </div>
1
+ <div class="presentation-search">
2
+ <%= form_tag @search.url, :method => :get, :class => ("compact" if @search.compact) do %>
3
+ <% @search.fields.each do |field| %>
4
+ <fieldset>
5
+ <label><%= field.name %></label>
6
+ <%= present(field, "#{field.type}_search", :name => "search[#{field.param}][value]") %>
7
+ </fieldset>
8
+ <% end %>
9
+ <fieldset class="submit">
10
+ <input type="submit" value="Search" class="submit" />
11
+ <%= link_to 'reset', @search.url %>
12
+ </fieldset>
13
+ <% end %>
14
+ </div>
@@ -1,20 +1,20 @@
1
- <%= form_for @form.presentable, :url => @form.url, :method => @form.method, :html => @form.html do |f| %>
2
- <% @form.groups.each do |group| %>
3
- <fieldset>
4
- <% unless group.name.blank? %>
5
- <legend><%= group.name %></legend>
6
- <% end %>
7
- <% group.fields.each do |field| %>
8
- <% if field.type.to_sym == :hidden %>
9
- <%= f.present(field) %>
10
- <% else %>
11
- <div class="field">
12
- <%= f.label field.name, field.label %>
13
- <%= f.present(field) %>
14
- </div>
15
- <% end %>
16
- <% end %>
17
- </fieldset>
18
- <% end %>
19
- <%= f.submit @form.button %>
20
- <% end %>
1
+ <%= form_for @form.presentable, :url => @form.url, :method => @form.method, :html => @form.html do |f| %>
2
+ <% @form.groups.each do |group| %>
3
+ <fieldset>
4
+ <% unless group.name.blank? %>
5
+ <legend><%= group.name %></legend>
6
+ <% end %>
7
+ <% group.fields.each do |field| %>
8
+ <% if field.type.to_sym == :hidden %>
9
+ <%= f.present(field) %>
10
+ <% else %>
11
+ <div class="field">
12
+ <%= f.label field.name, field.label %>
13
+ <%= f.present(field) %>
14
+ </div>
15
+ <% end %>
16
+ <% end %>
17
+ </fieldset>
18
+ <% end %>
19
+ <%= f.submit @form.button %>
20
+ <% end %>
@@ -1,70 +1,70 @@
1
- <div id="<%= @grid.id %>" class="presentation-grid">
2
- <table>
3
- <% unless @grid.title.blank? and @grid.links.empty? %>
4
- <caption>
5
- <% unless @grid.links.empty? %>
6
- <ul class="actions">
7
- <% @grid.links.each do |link| %>
8
- <li><%= link %></li>
9
- <% end %>
10
- </ul>
11
- <% end %>
12
-
13
- <%= @grid.title %>
14
- </caption>
15
- <% end %>
16
- <thead>
17
- <tr>
18
- <% @grid.fields.each do |field| %>
19
- <th class="<%= field.id %>">
20
- <% if field.sortable? %>
21
- <%= link_to field.name, field.sorted_url(request), :class => "sortable" %>
22
- <% else %>
23
- <%= field.name %>
24
- <% end %>
25
- </th>
26
- <% end %>
27
- <% unless @grid.record_links.empty? %>
28
- <th></th>
29
- <% end %>
30
- </tr>
31
- </thead>
32
- <tbody>
33
- <% if @grid.presentable.blank? %>
34
- <tr>
35
- <td colspan="<%= @grid.colspan %>">
36
- No records found.
37
- </td>
38
- </tr>
39
- <% else %>
40
- <% @grid.presentable.each do |record| %>
41
- <tr class="<%= cycle('odd', 'even') %>">
42
- <% @grid.fields.each do |field| %>
43
- <td class="<%= [field.id, ('sorted' if field.is_sorted?(request))].compact.join(' ') %>">
44
- <%= present(field.value_from(record), :raw => !field.sanitize?) %>
45
- </td>
46
- <% end %>
47
- <% unless @grid.record_links.empty? %>
48
- <td>
49
- <ul class="actions">
50
- <% @grid.record_links.each do |link| %>
51
- <li><%= link.call(record) %></li>
52
- <% end %>
53
- </ul>
54
- </td>
55
- <% end %>
56
- </tr>
57
- <% end %>
58
- <% end %>
59
- </tbody>
60
- <% if @grid.paginate? %>
61
- <tfoot>
62
- <tr>
63
- <td colspan="<%= @grid.colspan %>">
64
- <%= will_paginate @grid.presentable %>
65
- </td>
66
- </tr>
67
- </tfoot>
68
- <% end %>
69
- </table>
70
- </div>
1
+ <div id="<%= @grid.id %>" class="presentation-grid">
2
+ <table>
3
+ <% unless @grid.title.blank? and @grid.links.empty? %>
4
+ <caption>
5
+ <% unless @grid.links.empty? %>
6
+ <ul class="actions">
7
+ <% @grid.links.each do |link| %>
8
+ <li><%= link %></li>
9
+ <% end %>
10
+ </ul>
11
+ <% end %>
12
+
13
+ <%= @grid.title %>
14
+ </caption>
15
+ <% end %>
16
+ <thead>
17
+ <tr>
18
+ <% @grid.fields.each do |field| %>
19
+ <th class="<%= field.id %>">
20
+ <% if field.sortable? %>
21
+ <%= link_to field.name, field.sorted_url(request), :class => "sortable" %>
22
+ <% else %>
23
+ <%= field.name %>
24
+ <% end %>
25
+ </th>
26
+ <% end %>
27
+ <% unless @grid.record_links.empty? %>
28
+ <th></th>
29
+ <% end %>
30
+ </tr>
31
+ </thead>
32
+ <tbody>
33
+ <% if @grid.presentable.blank? %>
34
+ <tr>
35
+ <td colspan="<%= @grid.colspan %>">
36
+ No records found.
37
+ </td>
38
+ </tr>
39
+ <% else %>
40
+ <% @grid.presentable.each do |record| %>
41
+ <tr class="<%= cycle('odd', 'even') %>">
42
+ <% @grid.fields.each do |field| %>
43
+ <td class="<%= [field.id, ('sorted' if field.is_sorted?(request))].compact.join(' ') %>">
44
+ <%= present(field.value_from(record), :raw => !field.sanitize?) %>
45
+ </td>
46
+ <% end %>
47
+ <% unless @grid.record_links.empty? %>
48
+ <td>
49
+ <ul class="actions">
50
+ <% @grid.record_links.each do |link| %>
51
+ <li><%= link.call(record) %></li>
52
+ <% end %>
53
+ </ul>
54
+ </td>
55
+ <% end %>
56
+ </tr>
57
+ <% end %>
58
+ <% end %>
59
+ </tbody>
60
+ <% if @grid.paginate? %>
61
+ <tfoot>
62
+ <tr>
63
+ <td colspan="<%= @grid.colspan %>">
64
+ <%= will_paginate @grid.presentable %>
65
+ </td>
66
+ </tr>
67
+ </tfoot>
68
+ <% end %>
69
+ </table>
70
+ </div>
@@ -1,7 +1,7 @@
1
- <div class="presentation-search">
2
- <%= form_tag @search.url, :method => :get do %>
3
- <%= text_field_tag 'search', params[:search] %>
4
- <input type="submit" value="Search" class="submit" />
5
- <%= link_to 'reset', @search.url %>
6
- <% end %>
7
- </div>
1
+ <div class="presentation-search">
2
+ <%= form_tag @search.url, :method => :get do %>
3
+ <%= text_field_tag 'search', params[:search] %>
4
+ <input type="submit" value="Search" class="submit" />
5
+ <%= link_to 'reset', @search.url %>
6
+ <% end %>
7
+ </div>
@@ -1,31 +1,31 @@
1
- module Presentation
2
- class Base
3
- include Presenting::Configurable
4
-
5
- def render
6
- view.render :partial => "presentations/#{self.class.to_s.split('::').last.underscore}"
7
- end
8
-
9
- attr_accessor :presentable
10
-
11
- attr_accessor :controller
12
- delegate :request, :form_authenticity_token, :url_for, :params, :to => 'controller'
13
-
14
- protected
15
-
16
- # what the presentation is called in its templates
17
- def iname
18
- :presentation
19
- end
20
-
21
- # a reference to the view
22
- def view #:nodoc:
23
- @view ||= Presenting::View.new(ActionController::Base.view_paths, assigns_for_view, self)
24
- end
25
-
26
- def assigns_for_view
27
- {iname => self, :_request => request}
28
- end
29
-
30
- end
31
- end
1
+ module Presentation
2
+ class Base
3
+ include Presenting::Configurable
4
+
5
+ def render
6
+ view.render :partial => "presentations/#{self.class.to_s.split('::').last.underscore}"
7
+ end
8
+
9
+ attr_accessor :presentable
10
+
11
+ attr_accessor :controller
12
+ delegate :request, :form_authenticity_token, :url_for, :params, :to => 'controller'
13
+
14
+ protected
15
+
16
+ # what the presentation is called in its templates
17
+ def iname
18
+ :presentation
19
+ end
20
+
21
+ # a reference to the view
22
+ def view #:nodoc:
23
+ @view ||= Presenting::View.new(ActionController::Base.view_paths, assigns_for_view, self)
24
+ end
25
+
26
+ def assigns_for_view
27
+ {iname => self, :_request => request}
28
+ end
29
+
30
+ end
31
+ end
@@ -1,21 +1,21 @@
1
- require 'presentation/grid'
2
-
3
- module Presentation
4
- # TODO: abstract what's common between Record and Grid into a shared module or reusable objects or something
5
- class Details < Grid
6
- def iname; :details end
7
-
8
- # The display title for this presentation. Will default based on the id.
9
- attr_accessor :title
10
-
11
- def fields=(args)
12
- args.each do |field|
13
- self.fields << field
14
- end
15
- end
16
-
17
- def fields
18
- @fields ||= Presenting::FieldSet.new(Presenting::Attribute, :name, :value)
19
- end
20
- end
21
- end
1
+ require 'presentation/grid'
2
+
3
+ module Presentation
4
+ # TODO: abstract what's common between Record and Grid into a shared module or reusable objects or something
5
+ class Details < Grid
6
+ def iname; :details end
7
+
8
+ # The display title for this presentation. Will default based on the id.
9
+ attr_accessor :title
10
+
11
+ def fields=(args)
12
+ args.each do |field|
13
+ self.fields << field
14
+ end
15
+ end
16
+
17
+ def fields
18
+ @fields ||= Presenting::FieldSet.new(Presenting::Attribute, :name, :value)
19
+ end
20
+ end
21
+ end
@@ -1,67 +1,67 @@
1
- require 'presentation/search'
2
-
3
- module Presentation
4
- class FieldSearch < Search
5
- # This method supports the configuration-on-initialization paradigm. It makes:
6
- # present = Presentation::FieldSearch.new(:fields => [
7
- # {:a => {:type => :list, :options => %w(foo bar baz)}},
8
- # :b,
9
- # {:c => :boolean}
10
- # ])
11
- #
12
- # equivalent to:
13
- #
14
- # present = Presentation::FieldSearch.new
15
- # present.fields << {:a => {:type => :list, :options => %w(foo bar baz)}}
16
- # present.fields << :b
17
- # present.fields << {:c => :boolean}
18
- def fields=(args)
19
- args.each do |field|
20
- self.fields << field
21
- end
22
- end
23
-
24
- def fields
25
- @fields ||= Presenting::FieldSet.new(Field, :param, :type)
26
- end
27
-
28
- def compact
29
- @compact != false
30
- end
31
- attr_writer :compact
32
-
33
- class Field
34
- include Presenting::Configurable
35
-
36
- # the display name of the field.
37
- attr_reader :name
38
- def name=(val)
39
- @name = val.is_a?(Symbol) ? val.to_s.titleize : val
40
- end
41
-
42
- # the parameter name of the field. note that this is not necessarily the name of a database column or record attribute.
43
- # it simply needs to be recognized as a "field" by the controller logic.
44
- attr_reader :param
45
- def param=(val)
46
- self.name ||= val
47
- @param = val.to_s.underscore.downcase.gsub(' ', '_')
48
- end
49
-
50
- # the type of search interface for this field. supported options:
51
- # * :text (default)
52
- # * :checkbox
53
- # * :time [planned]
54
- # * :list [planned]
55
- def type
56
- @type ||= :text
57
- end
58
- attr_writer :type
59
-
60
- # extra options for the field.
61
- def options
62
- @options ||= {}
63
- end
64
- attr_writer :options
65
- end
66
- end
67
- end
1
+ require 'presentation/search'
2
+
3
+ module Presentation
4
+ class FieldSearch < Search
5
+ # This method supports the configuration-on-initialization paradigm. It makes:
6
+ # present = Presentation::FieldSearch.new(:fields => [
7
+ # {:a => {:type => :list, :options => %w(foo bar baz)}},
8
+ # :b,
9
+ # {:c => :boolean}
10
+ # ])
11
+ #
12
+ # equivalent to:
13
+ #
14
+ # present = Presentation::FieldSearch.new
15
+ # present.fields << {:a => {:type => :list, :options => %w(foo bar baz)}}
16
+ # present.fields << :b
17
+ # present.fields << {:c => :boolean}
18
+ def fields=(args)
19
+ args.each do |field|
20
+ self.fields << field
21
+ end
22
+ end
23
+
24
+ def fields
25
+ @fields ||= Presenting::FieldSet.new(Field, :param, :type)
26
+ end
27
+
28
+ def compact
29
+ @compact != false
30
+ end
31
+ attr_writer :compact
32
+
33
+ class Field
34
+ include Presenting::Configurable
35
+
36
+ # the display name of the field.
37
+ attr_reader :name
38
+ def name=(val)
39
+ @name = val.is_a?(Symbol) ? val.to_s.titleize : val
40
+ end
41
+
42
+ # the parameter name of the field. note that this is not necessarily the name of a database column or record attribute.
43
+ # it simply needs to be recognized as a "field" by the controller logic.
44
+ attr_reader :param
45
+ def param=(val)
46
+ self.name ||= val
47
+ @param = val.to_s.underscore.downcase.gsub(' ', '_')
48
+ end
49
+
50
+ # the type of search interface for this field. supported options:
51
+ # * :text (default)
52
+ # * :checkbox
53
+ # * :time [planned]
54
+ # * :list [planned]
55
+ def type
56
+ @type ||= :text
57
+ end
58
+ attr_writer :type
59
+
60
+ # extra options for the field.
61
+ def options
62
+ @options ||= {}
63
+ end
64
+ attr_writer :options
65
+ end
66
+ end
67
+ end