g_sectioned_shower 1.0.6
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.
- data/History.txt +20 -0
- data/LICENSE +22 -0
- data/README.rdoc +78 -0
- data/Rakefile +58 -0
- data/VERSION +1 -0
- data/g_sectioned_shower.gemspec +59 -0
- data/lib/g_sectioned_shower/view_helpers.rb +275 -0
- data/lib/g_sectioned_shower.rb +12 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/tasks/rspec.rake +21 -0
- data/test/test_helper.rb +10 -0
- metadata +96 -0
data/History.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
== 1.0.6 2009-10-29
|
2
|
+
|
3
|
+
* Fixed bug with associated objects that are nil still trying to send methods to get values back.
|
4
|
+
|
5
|
+
|
6
|
+
== 1.0.3 2009-04-07
|
7
|
+
|
8
|
+
* Refactored to use the Guilded rest path helper resolvers
|
9
|
+
* Took out the :link_helper option for now to gain some efficiency
|
10
|
+
* Added a scoped_by option for the show action object and any associated objects that need are deeply nested
|
11
|
+
|
12
|
+
|
13
|
+
== 1.0.2 2009-03-18
|
14
|
+
|
15
|
+
* Updated a Rails helpers
|
16
|
+
|
17
|
+
|
18
|
+
== 1.0.0 2009-03-12
|
19
|
+
|
20
|
+
* Initial release (ported from plugin)
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
(The MIT License)
|
2
|
+
|
3
|
+
Copyright (c) 2009 C. Jason Harrelson (midas)
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
'Software'), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
19
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
20
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
21
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
22
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
= g_sectioned_shower
|
2
|
+
|
3
|
+
http://github.com/midas/g_sectioned_shower/tree/master
|
4
|
+
|
5
|
+
|
6
|
+
== DESCRIPTION:
|
7
|
+
|
8
|
+
A Guilded (http://github.com/midas/guilded/tree/master) component that creates adaptable show (detail) views of a single
|
9
|
+
ActiveRecord object.
|
10
|
+
|
11
|
+
|
12
|
+
== FEATURES:
|
13
|
+
|
14
|
+
* Generates a detail view of an ActiveRecord object using a XHTML data list
|
15
|
+
* Can generate a status field (to integrate with AASM, etc)
|
16
|
+
* Adaptable title section
|
17
|
+
* Generates one main section and zero too many other sections
|
18
|
+
* Can generate different sections of the detail (not necessarily divided by domain model)
|
19
|
+
* Can pull details from associated has_one or belongs_to record
|
20
|
+
* Can generate link to associated has_one or belongs_to record
|
21
|
+
* Can pull details from associated has_many records (allows you to specify max and generates an efficient query)
|
22
|
+
* Can generate link to associated has_many records and the associations list page
|
23
|
+
* Can configure sections to dynamically display based on any conditions
|
24
|
+
|
25
|
+
|
26
|
+
== INSTALL:
|
27
|
+
|
28
|
+
sudo gem install midas-g_sectioned_shower
|
29
|
+
|
30
|
+
In Rails environement.rb file:
|
31
|
+
|
32
|
+
config.gem 'midas-g_sectioned_shower', :version => '1.0.3', :lib => 'g_sectioned_shower', :source => 'http://gems.github.com'
|
33
|
+
|
34
|
+
|
35
|
+
== USAGE:
|
36
|
+
|
37
|
+
View:
|
38
|
+
|
39
|
+
<%= g_sectioned_shower @item, :title_attr => :name, :date_format => :us_long, :status => @ticket.status,
|
40
|
+
:id => 'item-detail', :sections => [ { :attributes => [:is_active, :created_at, :updated_at },
|
41
|
+
{ :title => 'Owner', :attributes => [:person], :person_attributes => [:first_name, :last_name, :address => 'Street Address'] } ]
|
42
|
+
%>
|
43
|
+
|
44
|
+
Results in:
|
45
|
+
|
46
|
+
coming soon ...
|
47
|
+
|
48
|
+
|
49
|
+
== REQUIREMENTS:
|
50
|
+
|
51
|
+
* Rails >= 2.2.0
|
52
|
+
* Guilded >= 0.0.9 (http://github.com/midas/guilded/tree/master)
|
53
|
+
|
54
|
+
|
55
|
+
== LICENSE:
|
56
|
+
|
57
|
+
(The MIT License)
|
58
|
+
|
59
|
+
Copyright (c) 2009 C. Jason Harrelson (midas)
|
60
|
+
|
61
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
62
|
+
a copy of this software and associated documentation files (the
|
63
|
+
'Software'), to deal in the Software without restriction, including
|
64
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
65
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
66
|
+
permit persons to whom the Software is furnished to do so, subject to
|
67
|
+
the following conditions:
|
68
|
+
|
69
|
+
The above copyright notice and this permission notice shall be
|
70
|
+
included in all copies or substantial portions of the Software.
|
71
|
+
|
72
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
73
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
74
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
75
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
76
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
77
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
78
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "g_sectioned_shower"
|
8
|
+
gem.summary = %Q{A Guilded (http://github.com/midas/guilded/tree/master) component that creates adaptable show (detail) views of a single ActiveRecord object.}
|
9
|
+
gem.description = %Q{A Guilded (http://github.com/midas/guilded/tree/master) component that creates adaptable show (detail) views of a single ActiveRecord object.}
|
10
|
+
gem.email = "jason@lookforwardenterprises.com"
|
11
|
+
gem.homepage = "http://github.com/midas/tester"
|
12
|
+
gem.authors = ["C. Jason Harrelson (midas)"]
|
13
|
+
gem.add_dependency 'rails', ">= 2.2.0"
|
14
|
+
gem.add_dependency 'guilded', ">= 1.0.0"
|
15
|
+
gem.add_development_dependency "shoulda"
|
16
|
+
end
|
17
|
+
Jeweler::GemcutterTasks.new
|
18
|
+
rescue LoadError
|
19
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
20
|
+
end
|
21
|
+
|
22
|
+
require 'rake/testtask'
|
23
|
+
Rake::TestTask.new(:test) do |test|
|
24
|
+
test.libs << 'lib' << 'test'
|
25
|
+
test.pattern = 'test/**/*_test.rb'
|
26
|
+
test.verbose = true
|
27
|
+
end
|
28
|
+
|
29
|
+
begin
|
30
|
+
require 'rcov/rcovtask'
|
31
|
+
Rcov::RcovTask.new do |test|
|
32
|
+
test.libs << 'test'
|
33
|
+
test.pattern = 'test/**/*_test.rb'
|
34
|
+
test.verbose = true
|
35
|
+
end
|
36
|
+
rescue LoadError
|
37
|
+
task :rcov do
|
38
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
task :test => :check_dependencies
|
43
|
+
|
44
|
+
task :default => :test
|
45
|
+
|
46
|
+
require 'rake/rdoctask'
|
47
|
+
Rake::RDocTask.new do |rdoc|
|
48
|
+
if File.exist?('VERSION')
|
49
|
+
version = File.read('VERSION')
|
50
|
+
else
|
51
|
+
version = ""
|
52
|
+
end
|
53
|
+
|
54
|
+
rdoc.rdoc_dir = 'rdoc'
|
55
|
+
rdoc.title = "tester #{version}"
|
56
|
+
rdoc.rdoc_files.include('README*')
|
57
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
58
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.0.6
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{g_sectioned_shower}
|
8
|
+
s.version = "1.0.6"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["C. Jason Harrelson (midas)"]
|
12
|
+
s.date = %q{2009-10-29}
|
13
|
+
s.description = %q{A Guilded (http://github.com/midas/guilded/tree/master) component that creates adaptable show (detail) views of a single ActiveRecord object.}
|
14
|
+
s.email = %q{jason@lookforwardenterprises.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
"History.txt",
|
21
|
+
"README.rdoc",
|
22
|
+
"Rakefile",
|
23
|
+
"VERSION",
|
24
|
+
"g_sectioned_shower.gemspec",
|
25
|
+
"lib/g_sectioned_shower.rb",
|
26
|
+
"lib/g_sectioned_shower/view_helpers.rb",
|
27
|
+
"script/console",
|
28
|
+
"script/destroy",
|
29
|
+
"script/generate",
|
30
|
+
"tasks/rspec.rake"
|
31
|
+
]
|
32
|
+
s.homepage = %q{http://github.com/midas/tester}
|
33
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
34
|
+
s.require_paths = ["lib"]
|
35
|
+
s.rubygems_version = %q{1.3.5}
|
36
|
+
s.summary = %q{A Guilded (http://github.com/midas/guilded/tree/master) component that creates adaptable show (detail) views of a single ActiveRecord object.}
|
37
|
+
s.test_files = [
|
38
|
+
"test/test_helper.rb"
|
39
|
+
]
|
40
|
+
|
41
|
+
if s.respond_to? :specification_version then
|
42
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
43
|
+
s.specification_version = 3
|
44
|
+
|
45
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
46
|
+
s.add_runtime_dependency(%q<rails>, [">= 2.2.0"])
|
47
|
+
s.add_runtime_dependency(%q<guilded>, [">= 1.0.0"])
|
48
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
49
|
+
else
|
50
|
+
s.add_dependency(%q<rails>, [">= 2.2.0"])
|
51
|
+
s.add_dependency(%q<guilded>, [">= 1.0.0"])
|
52
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
53
|
+
end
|
54
|
+
else
|
55
|
+
s.add_dependency(%q<rails>, [">= 2.2.0"])
|
56
|
+
s.add_dependency(%q<guilded>, [">= 1.0.0"])
|
57
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,275 @@
|
|
1
|
+
module GSectionedShower
|
2
|
+
module ViewHelpers
|
3
|
+
|
4
|
+
# GUIlded component.
|
5
|
+
#
|
6
|
+
# *parameters*
|
7
|
+
# ar_obj:: The ActiveRecord object containing the information.
|
8
|
+
#
|
9
|
+
# *options*
|
10
|
+
# id:: (required) The id of the element. Must be unique on the page.
|
11
|
+
# class::
|
12
|
+
# title_attr:: The attribute to use in the title.
|
13
|
+
# title_pre:: A string to override the first part of the title. defaults to the name
|
14
|
+
# of the active record object's class.
|
15
|
+
# date_format:: A symbol representing the date format to use. Defaults to :default.
|
16
|
+
# attributes:: A list of attributes to include in the main section.
|
17
|
+
# status:: True to include a status section.
|
18
|
+
# namespace:: A namespace to append onto all path helpers that are not overridden.
|
19
|
+
# sections::
|
20
|
+
# title:: The title for this section.
|
21
|
+
# attributes:: List of attibutes to include in this section.
|
22
|
+
# {associated_attribute_name}_attributes:: List of attributes from associated attribute to include.
|
23
|
+
# {associated_attribute_name}_max:: The max number of associated records to show. This will load
|
24
|
+
# all and display max unless you define a limited named scope on the respective model, allowing
|
25
|
+
# the association to be limited to the max, not returning items that will not be displayed.
|
26
|
+
# links:: A list of fields or field => path_helper to generate links to this item in the associated
|
27
|
+
# object.
|
28
|
+
# list_link:: (Boolean, string, or symbol)
|
29
|
+
#
|
30
|
+
def g_sectioned_shower( ar_obj, *args )
|
31
|
+
|
32
|
+
options = args.extract_options!
|
33
|
+
raise ArgumentError, "'title_attr' option required" unless options.include?( :title_attr )
|
34
|
+
raise ArgumentError, "'sections' option required" unless options.include?( :sections )
|
35
|
+
options.merge! :class => "shower" unless options.include?( :class )
|
36
|
+
options.merge! :exclude_css => true, :exclude_js => true
|
37
|
+
Guilded::Guilder.instance.add( :sectioned_shower, options )
|
38
|
+
html = ""
|
39
|
+
|
40
|
+
html << "<div class=\"status #{options[:status]}\">#{options[:status].to_s.humanize}</div>" if options[:status]
|
41
|
+
|
42
|
+
title_pre = options[:title_pre] || "#{ar_obj.class.to_s.underscore.humanize} |"
|
43
|
+
html << "<h2>#{title_pre} #{ar_obj.send( options[:title_attr].to_sym )}</h2>"
|
44
|
+
|
45
|
+
# Resolve sections and meta data there-in
|
46
|
+
sections = options[:sections]
|
47
|
+
reflections = ar_obj.class.inheritable_attributes[:reflections]
|
48
|
+
|
49
|
+
# Resolve main section
|
50
|
+
main_section = sections[0]
|
51
|
+
raise ArgumentError, "'attributes' option required within main section configuration" unless main_section.include?( :attributes )
|
52
|
+
|
53
|
+
methods, titles = Guilded::Rails::Helpers.resolve_field_methods_and_titles( main_section[:attributes], ar_obj )
|
54
|
+
|
55
|
+
html << "<div class=\"infoItem tableDisplay\"><dl>"
|
56
|
+
|
57
|
+
methods.each_with_index do |method, i|
|
58
|
+
|
59
|
+
# Handle associative relationships
|
60
|
+
if !reflections.nil? && reflections.has_key?( method.to_sym )
|
61
|
+
handle_associated( html, ar_obj, main_section, reflections, methods, i )
|
62
|
+
else
|
63
|
+
# Normal attribute from this model
|
64
|
+
html << "<dt>#{titles[i]}</dt>"
|
65
|
+
translate_method = "translate_#{method}".to_sym
|
66
|
+
val = ar_obj.send( method )
|
67
|
+
if respond_to?( translate_method )
|
68
|
+
html << "<dd>#{h( send( translate_method, val ) )}</dd>"
|
69
|
+
else
|
70
|
+
val = val.to_formatted_s( options[:date_format] || :default ) if val.respond_to?( :to_formatted_s )
|
71
|
+
html << "<dd>#{h( val )}</dd>"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
html << "</dl><div class=\"clear\"></div></div>"
|
78
|
+
|
79
|
+
# Get rid of the main section as it was already handled
|
80
|
+
sections.delete_at( 0 )
|
81
|
+
|
82
|
+
# Resolve other sections
|
83
|
+
sections.each do |section|
|
84
|
+
|
85
|
+
raise ArgumentError, "'attributes' option required within main section configuration" unless section.include?( :attributes )
|
86
|
+
raise ArgumentError, "'title' option required within all section configurations except the main section" unless section.include?( :title )
|
87
|
+
|
88
|
+
methods, titles = Guilded::Rails::Helpers.resolve_field_methods_and_titles( section[:attributes], ar_obj )
|
89
|
+
html << "<div class=\"infoItem tableDisplay\"><h3>#{section[:title]}</h3><dl>"
|
90
|
+
|
91
|
+
methods.each_with_index do |method, i|
|
92
|
+
|
93
|
+
# Handle associative relationships
|
94
|
+
if !reflections.nil? && reflections.has_key?( method.to_sym )
|
95
|
+
handle_associated( html, ar_obj, section, reflections, methods, i )
|
96
|
+
else
|
97
|
+
# Normal attribute from this model
|
98
|
+
html << "<dt>#{titles[i]}</dt>"
|
99
|
+
translate_method = "translate_#{method}".to_sym
|
100
|
+
val = ar_obj.send( method )
|
101
|
+
if respond_to?( translate_method )
|
102
|
+
"<dd>#{h( send( translate_method, val ) )}</dd>"
|
103
|
+
else
|
104
|
+
html << "<dd>#{h( val )}</dd>"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
html << "</dl><div class=\"clear\"></div></div>"
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
html
|
115
|
+
end
|
116
|
+
|
117
|
+
protected
|
118
|
+
|
119
|
+
def handle_associated( html, ar_obj, section, reflections, methods, index )
|
120
|
+
#TODO handle translation helpers if they exist.
|
121
|
+
reflection = reflections[methods[index].to_sym]
|
122
|
+
|
123
|
+
# Handle many relationships
|
124
|
+
if ['has_many', 'has_and_belongs_to_many'].include?( reflection.macro.to_s )
|
125
|
+
handle_associated_many( html, ar_obj, reflection, section, methods, index )
|
126
|
+
elsif ['belongs_to', 'has_one'].include?( reflection.macro.to_s ) # Handle single relationships
|
127
|
+
handle_associated_single( html, ar_obj, reflection, section, methods, index )
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
131
|
+
|
132
|
+
def handle_associated_single( html, ar_obj, reflection, section, methods, index )
|
133
|
+
|
134
|
+
assoc_obj_output = ""
|
135
|
+
|
136
|
+
if section.has_key?( "#{reflection.name.to_s.singularize}_attributes".to_sym )
|
137
|
+
# Handle object output if fields specified explicitly
|
138
|
+
|
139
|
+
attrs = section[ "#{reflection.name.to_s.singularize}_attributes".to_sym ]
|
140
|
+
scoped_by = section[ "#{reflection.name.to_s.singularize}_scoped_by".to_sym ]
|
141
|
+
rel_methods, rel_titles = Guilded::Rails::Helpers.resolve_field_methods_and_titles( attrs, ar_obj.send( reflection.name.to_s.to_sym ) )
|
142
|
+
assoc_obj = ar_obj.send( methods[index] )
|
143
|
+
|
144
|
+
rel_methods.each_with_index do |rel_method, rel_i|
|
145
|
+
|
146
|
+
method_output = h( assoc_obj.send( rel_method ) ) unless assoc_obj.nil?
|
147
|
+
|
148
|
+
links = section[:links]
|
149
|
+
throw "The 'links' option must have values in it, or be left out of the options for the section." if !links.nil? && links.empty?
|
150
|
+
unless links.nil?
|
151
|
+
link_entry = find_link_entry( links, rel_method ) # section.has_key?( :links )
|
152
|
+
opts = Hash.new
|
153
|
+
opts.merge!( :scoped_by => scoped_by ) unless scoped_by.nil?
|
154
|
+
path_helpers = Guilded::Rails::Helpers.resolve_rest_path_helpers( assoc_obj, opts )
|
155
|
+
end
|
156
|
+
|
157
|
+
if !link_entry.nil? #&& ( link_entry.is_a?( Symbol ) || link_entry.is_a?( String ) )
|
158
|
+
assoc_obj_link = @controller.send( path_helpers[:show_rest_helper], *(path_helpers[:show_rest_args] + [assoc_obj]) )
|
159
|
+
assoc_obj_output << "<dt>#{rel_titles[rel_i]}</dt><dd>#{link_to( method_output, assoc_obj_link )}</dd>"
|
160
|
+
#elsif !link_entry.nil? && link_entry.is_a?( Hash )
|
161
|
+
else
|
162
|
+
assoc_obj_output << "<dt>#{rel_titles[rel_i]}</dt><dd>#{h( method_output )}</dd>"
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
166
|
+
|
167
|
+
else
|
168
|
+
# Otherwise just use to_s for the object
|
169
|
+
assoc_obj_output = ar_obj.send( methods[index] ).to_s
|
170
|
+
end
|
171
|
+
|
172
|
+
html << assoc_obj_output
|
173
|
+
end
|
174
|
+
|
175
|
+
def handle_associated_many( html, ar_obj, reflection, section, methods, index )
|
176
|
+
reflected_name = reflection.name.to_s
|
177
|
+
reflected_singular_name = reflected_name.singularize
|
178
|
+
reflected_humanized_name = reflected_name.humanize
|
179
|
+
attrs_name = "#{reflected_singular_name}_attributes"
|
180
|
+
attrs = section[ attrs_name.to_sym ]
|
181
|
+
scoped_by = section[ "#{reflection.name.to_s.singularize}_scoped_by".to_sym ]
|
182
|
+
max_name = "#{reflected_singular_name}_max"
|
183
|
+
max = section[ max_name.to_sym ]
|
184
|
+
showing_less_than_all = max && max < ar_obj.send( methods[index] ).count
|
185
|
+
empty_embedded_ar_obj = reflection.klass.new
|
186
|
+
rel_methods, rel_titles = Guilded::Rails::Helpers.resolve_field_methods_and_titles( attrs, empty_embedded_ar_obj ) unless attrs.nil? || attrs.empty?
|
187
|
+
|
188
|
+
# Handle creating a link to the associated many objects list
|
189
|
+
# if section[:list_link]
|
190
|
+
#
|
191
|
+
# if section[:list_link].is_a?( Symbol )
|
192
|
+
# assoc_obj_index_path_helper = section[:list_link].to_s
|
193
|
+
# elsif section[:list_link].is_a?( String )
|
194
|
+
# assoc_obj_index_path_helper = section[:list_link]
|
195
|
+
# elsif section[:list_link] == true
|
196
|
+
# non_namespaced_index_path_helper = "#{ar_obj.class.to_s.tableize.singularize}_#{reflection.name.to_s}_path"
|
197
|
+
# if options[:namespace]
|
198
|
+
# assoc_obj_index_path_helper = "#{options[:namespace].to_s}_#{non_namespaced_index_path_helper}"
|
199
|
+
# else
|
200
|
+
# assoc_obj_index_path_helper = non_namespaced_index_path_helper
|
201
|
+
# end
|
202
|
+
# else
|
203
|
+
# throw "The 'list_link' parameter must be a String, Symbol or true"
|
204
|
+
# end
|
205
|
+
#
|
206
|
+
# if showing_less_than_all
|
207
|
+
# index_link = link_to( "More #{reflected_humanized_name}...", @controller.send( assoc_obj_index_path_helper, ar_obj ) )
|
208
|
+
# else
|
209
|
+
# index_link = link_to( "Jump to #{reflected_humanized_name}", @controller.send( assoc_obj_index_path_helper, ar_obj ) )
|
210
|
+
# end
|
211
|
+
#
|
212
|
+
# html << "<dt>#{index_link}</dt><dd></dd>"
|
213
|
+
#
|
214
|
+
# end
|
215
|
+
|
216
|
+
embedded_collection = (max && ar_obj.send( methods[index] ).respond_to?( :limited )) ? ar_obj.send( methods[index] ).limited( max ) : ar_obj.send( methods[index] )
|
217
|
+
|
218
|
+
# Loop through the collection of embeddeds
|
219
|
+
embedded_collection.each_with_index do |assoc_ar_obj, i|
|
220
|
+
|
221
|
+
break if max && i == max # Only display the max number specified (only necessary for when limited is not defined on AR class)
|
222
|
+
assoc_obj_output = ""
|
223
|
+
|
224
|
+
if section.has_key?( "#{reflected_singular_name}_attributes".to_sym )
|
225
|
+
# Handle object output if fields specified explicitly
|
226
|
+
|
227
|
+
rel_methods.each_with_index do |rel_method, rel_i|
|
228
|
+
|
229
|
+
method_output = h( assoc_ar_obj.send( rel_method ) ) unless assoc_obj.nil?
|
230
|
+
|
231
|
+
links = section[:links]
|
232
|
+
throw "The 'links' option must have values in it, or be left out of the options for the section." if !links.nil? && links.empty?
|
233
|
+
unless links.nil?
|
234
|
+
link_entry = find_link_entry( links, rel_method ) # section.has_key?( :links )
|
235
|
+
opts = Hash.new
|
236
|
+
opts.merge!( :scoped_by => scoped_by ) unless scoped_by.nil?
|
237
|
+
path_helpers = Guilded::Rails::Helpers.resolve_rest_path_helpers( assoc_ar_obj, opts )
|
238
|
+
end
|
239
|
+
|
240
|
+
if !link_entry.nil? #&& ( link_entry.is_a?( Symbol ) || link_entry.is_a?( String ) )
|
241
|
+
assoc_obj_link = @controller.send( path_helpers[:show_rest_helper], *(path_helpers[:show_rest_args] + [assoc_ar_obj]) )
|
242
|
+
assoc_obj_output << "<dt>#{rel_titles[rel_i]}</dt><dd>#{link_to( method_output, assoc_obj_link )}</dd>"
|
243
|
+
#elsif !link_entry.nil? && link_entry.is_a?( Hash )
|
244
|
+
else
|
245
|
+
assoc_obj_output << "<dt>#{rel_titles[rel_i]}</dt><dd>#{h( method_output )}</dd>"
|
246
|
+
end
|
247
|
+
|
248
|
+
end
|
249
|
+
|
250
|
+
else
|
251
|
+
# Otherwise just use to_s for the object
|
252
|
+
assoc_obj_output << assoc_ar_obj.to_s
|
253
|
+
end
|
254
|
+
|
255
|
+
html << assoc_obj_output
|
256
|
+
end
|
257
|
+
|
258
|
+
# output '...' if there are embeddeds that are not displayed and we did not render a link to embeddeds index
|
259
|
+
html << "<dt>...</dt><dd></dd>" if showing_less_than_all && ( section[:list_link].nil? || section[:list_link] == false )
|
260
|
+
|
261
|
+
end # def handle_associated_many
|
262
|
+
|
263
|
+
def find_link_entry( links, val )
|
264
|
+
links.each do |link|
|
265
|
+
#if link.is_a?( Hash )
|
266
|
+
# return link if link.has_key?( val.to_sym )
|
267
|
+
#else
|
268
|
+
return link if link == val.to_sym
|
269
|
+
#end
|
270
|
+
end
|
271
|
+
return nil
|
272
|
+
end
|
273
|
+
|
274
|
+
end
|
275
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
require 'g_sectioned_shower/view_helpers'
|
5
|
+
|
6
|
+
module GSectionedShower
|
7
|
+
VERSION = '1.0.6'
|
8
|
+
end
|
9
|
+
|
10
|
+
if defined?( ActionView::Base )
|
11
|
+
ActionView::Base.send( :include, GSectionedShower::ViewHelpers ) unless ActionView::Base.include?( GSectionedShower::ViewHelpers )
|
12
|
+
end
|
data/script/console
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# File: script/console
|
3
|
+
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
4
|
+
|
5
|
+
libs = " -r irb/completion"
|
6
|
+
# Perhaps use a console_lib to store any extra methods I may want available in the cosole
|
7
|
+
# libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
|
8
|
+
libs << " -r #{File.dirname(__FILE__) + '/../lib/g_sectioned_shower.rb'}"
|
9
|
+
puts "Loading g_sectioned_shower gem"
|
10
|
+
exec "#{irb} #{libs} --simple-prompt"
|
data/script/destroy
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/destroy'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Destroy.new.run(ARGV)
|
data/script/generate
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/generate'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Generate.new.run(ARGV)
|
data/tasks/rspec.rake
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
begin
|
2
|
+
require 'spec'
|
3
|
+
rescue LoadError
|
4
|
+
require 'rubygems'
|
5
|
+
require 'spec'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'spec/rake/spectask'
|
9
|
+
rescue LoadError
|
10
|
+
puts <<-EOS
|
11
|
+
To use rspec for testing you must install rspec gem:
|
12
|
+
gem install rspec
|
13
|
+
EOS
|
14
|
+
exit(0)
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Run the specs under spec/models"
|
18
|
+
Spec::Rake::SpecTask.new do |t|
|
19
|
+
t.spec_opts = ['--options', "spec/spec.opts"]
|
20
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
21
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: g_sectioned_shower
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.6
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- C. Jason Harrelson (midas)
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-10-29 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rails
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 2.2.0
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: guilded
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.0.0
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: shoulda
|
37
|
+
type: :development
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: "0"
|
44
|
+
version:
|
45
|
+
description: A Guilded (http://github.com/midas/guilded/tree/master) component that creates adaptable show (detail) views of a single ActiveRecord object.
|
46
|
+
email: jason@lookforwardenterprises.com
|
47
|
+
executables: []
|
48
|
+
|
49
|
+
extensions: []
|
50
|
+
|
51
|
+
extra_rdoc_files:
|
52
|
+
- LICENSE
|
53
|
+
- README.rdoc
|
54
|
+
files:
|
55
|
+
- History.txt
|
56
|
+
- README.rdoc
|
57
|
+
- Rakefile
|
58
|
+
- VERSION
|
59
|
+
- g_sectioned_shower.gemspec
|
60
|
+
- lib/g_sectioned_shower.rb
|
61
|
+
- lib/g_sectioned_shower/view_helpers.rb
|
62
|
+
- script/console
|
63
|
+
- script/destroy
|
64
|
+
- script/generate
|
65
|
+
- tasks/rspec.rake
|
66
|
+
- LICENSE
|
67
|
+
has_rdoc: true
|
68
|
+
homepage: http://github.com/midas/tester
|
69
|
+
licenses: []
|
70
|
+
|
71
|
+
post_install_message:
|
72
|
+
rdoc_options:
|
73
|
+
- --charset=UTF-8
|
74
|
+
require_paths:
|
75
|
+
- lib
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: "0"
|
81
|
+
version:
|
82
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: "0"
|
87
|
+
version:
|
88
|
+
requirements: []
|
89
|
+
|
90
|
+
rubyforge_project:
|
91
|
+
rubygems_version: 1.3.5
|
92
|
+
signing_key:
|
93
|
+
specification_version: 3
|
94
|
+
summary: A Guilded (http://github.com/midas/guilded/tree/master) component that creates adaptable show (detail) views of a single ActiveRecord object.
|
95
|
+
test_files:
|
96
|
+
- test/test_helper.rb
|