Commit 275fdc75bcbff79e6e5ff4732c7dc0fdc3b8ed2a

Authored by Daniela Feitosa
Committed by Antonio Terceiro
1 parent a18ff65c

ActionItem856: adding list of products in article EnterpriseHomepage

app/helpers/application_helper.rb
@@ -22,6 +22,8 @@ module ApplicationHelper @@ -22,6 +22,8 @@ module ApplicationHelper
22 22
23 include ProfileEditorHelper 23 include ProfileEditorHelper
24 24
  25 + include DisplayHelper
  26 +
25 # Displays context help. You can pass the content of the help message as the 27 # Displays context help. You can pass the content of the help message as the
26 # first parameter or using template code inside a block passed to this 28 # first parameter or using template code inside a block passed to this
27 # method. *Note*: the block is ignored if <tt>content</tt> is not 29 # method. *Note*: the block is ignored if <tt>content</tt> is not
@@ -261,19 +263,6 @@ module ApplicationHelper @@ -261,19 +263,6 @@ module ApplicationHelper
261 concat(content_tag('div', capture(&block) + tag('br', :style => 'clear: left;'), { :class => 'button-bar' }.merge(options)), block.binding) 263 concat(content_tag('div', capture(&block) + tag('br', :style => 'clear: left;'), { :class => 'button-bar' }.merge(options)), block.binding)
262 end 264 end
263 265
264 - def link_to_category(category, full = true)  
265 - return _('Uncategorized product') unless category  
266 - name = full ? category.full_name(' &rarr; ') : category.name  
267 - link_to name, :controller => 'search', :action => 'category_index', :category_path => category.path.split('/')  
268 - end  
269 -  
270 - def link_to_product(product, opts={})  
271 - return _('No product') unless product  
272 - link_to content_tag( 'span', product.name ),  
273 - { :controller => 'catalog', :action => 'show', :id => product, :profile => product.enterprise.identifier },  
274 - opts  
275 - end  
276 -  
277 def partial_for_class(klass) 266 def partial_for_class(klass)
278 if klass.nil? 267 if klass.nil?
279 raise ArgumentError, 'No partial for object. Is there a partial for any class in the inheritance hierarchy?' 268 raise ArgumentError, 'No partial for object. Is there a partial for any class in the inheritance hierarchy?'
@@ -578,17 +567,6 @@ module ApplicationHelper @@ -578,17 +567,6 @@ module ApplicationHelper
578 end 567 end
579 end 568 end
580 569
581 - def txt2html(txt)  
582 - txt.  
583 - gsub( /\n\s*\n/, ' <p/> ' ).  
584 - gsub( /\n/, ' <br/> ' ).  
585 - gsub( /(^|\s)(www\.[^\s])/, '\1http://\2' ).  
586 - gsub( /(https?:\/\/([^\s]+))/,  
587 - '<a href="\1" target="_blank" rel="nofolow" onclick="return confirm(\'' +  
588 - escape_javascript( _('Are you sure you want to visit this web site?') ) +  
589 - '\n\n\'+this.href)">\2</a>' )  
590 - end  
591 -  
592 # Should be on the forms_helper file but when its there the translation of labels doesn't work 570 # Should be on the forms_helper file but when its there the translation of labels doesn't work
593 class NoosferoFormBuilder < ActionView::Helpers::FormBuilder 571 class NoosferoFormBuilder < ActionView::Helpers::FormBuilder
594 include GetText 572 include GetText
app/helpers/catalog_helper.rb
1 module CatalogHelper 1 module CatalogHelper
  2 +
  3 +include DisplayHelper
  4 +
  5 + def display_products_list(profile, products)
  6 + data = ''
  7 + products.each { |product|
  8 +
  9 + data << content_tag('li',
  10 + link_to_product(product, :class => 'product-pic', :style => 'background-image:url(%s)' % ( product.image ? product.image.public_filename(:portrait) : '/images/icons-app/product-default-pic-portrait.png' )) +
  11 + content_tag('h3', link_to_product(product)) +
  12 + content_tag('ul',
  13 + (product.price ? content_tag('li', _('Price: %s') % ( "%.2f" % product.price), :class => 'product_price') : '') +
  14 + content_tag('li', link_to_category(product.product_category), :class => 'product_category')
  15 + ) +
  16 + (product.description ? content_tag('div', txt2html(product.description), :class => 'description') : tag('br', :style => 'clear:both')),
  17 + :class => 'product')
  18 + }
  19 + content_tag('h1', _('Products/Services')) + content_tag('ul', data, :id => 'product_list')
  20 + end
2 end 21 end
app/helpers/display_helper.rb 0 → 100644
@@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
  1 +module DisplayHelper
  2 +
  3 + def link_to_product(product, opts={})
  4 + return _('No product') unless product
  5 + link_to content_tag( 'span', product.name ),
  6 + product.enterprise.generate_url(:controller => 'catalog', :action => 'show', :id => product),
  7 + opts
  8 + end
  9 +
  10 + def link_to_category(category, full = true)
  11 + return _('Uncategorized product') unless category
  12 + name = full ? category.full_name(' &rarr; ') : category.name
  13 + link_to name, Noosfero.url_options.merge({:controller => 'search', :action => 'category_index', :category_path => category.path.split('/'),:host => category.environment.default_hostname })
  14 + end
  15 +
  16 + def txt2html(txt)
  17 + txt.
  18 + gsub( /\n\s*\n/, ' <p/> ' ).
  19 + gsub( /\n/, ' <br/> ' ).
  20 + gsub( /(^|\s)(www\.[^\s])/, '\1http://\2' ).
  21 + gsub( /(https?:\/\/([^\s]+))/,
  22 + '<a href="\1" target="_blank" rel="nofolow" onclick="return confirm(\'' +
  23 + escape_javascript( _('Are you sure you want to visit this web site?') ) +
  24 + '\n\n\'+this.href)">\2</a>' )
  25 + end
  26 +end
app/helpers/enterprise_homepage_helper.rb
@@ -22,5 +22,4 @@ module EnterpriseHomepageHelper @@ -22,5 +22,4 @@ module EnterpriseHomepageHelper
22 end 22 end
23 content_tag('div', content_tag('ul', data), :class => 'enterprise-info') 23 content_tag('div', content_tag('ul', data), :class => 'enterprise-info')
24 end 24 end
25 -  
26 end 25 end
app/models/enterprise_homepage.rb
@@ -14,8 +14,12 @@ class EnterpriseHomepage &lt; Article @@ -14,8 +14,12 @@ class EnterpriseHomepage &lt; Article
14 include ActionController::UrlWriter 14 include ActionController::UrlWriter
15 include ActionView::Helpers::AssetTagHelper 15 include ActionView::Helpers::AssetTagHelper
16 include EnterpriseHomepageHelper 16 include EnterpriseHomepageHelper
  17 + include CatalogHelper
  18 +
17 def to_html 19 def to_html
18 - display_profile_info(self.profile) + content_tag('div', self.body || '') 20 + products = self.profile.products
  21 + display_profile_info(self.profile) + content_tag('div', self.body || '') +
  22 + (self.profile.environment.enabled?('disable_products_for_enterprises') ? '' : display_products_list(self.profile, products))
19 end 23 end
20 24
21 end 25 end
app/views/catalog/index.rhtml
1 -<h1> <%= _('Products/Services') % @profile.name %> </h1>  
2 -  
3 -<ul id="product_list">  
4 -<% @products.each do |product| %>  
5 - <li class="product">  
6 - <%= link_to_product product, :class => 'product-pic', :style => 'background-image:url(%s)' %  
7 - ( product.image ? product.image.public_filename(:portrait) : '/images/icons-app/product-default-pic-portrait.png' ) %>  
8 - <h3>  
9 - <%= link_to_product product %>  
10 - </h3>  
11 - <ul>  
12 - <% if product.price %>  
13 - <li class="product_price"> <%= _('Price: %s') % ( "%.2f" % product.price) %> </li>  
14 - <% end %>  
15 - <li class="product_category"> <%= link_to_category(product.product_category) %> </li>  
16 - </ul>  
17 - <% if product.description %>  
18 - <div class="description">  
19 - <%= txt2html product.description %>  
20 - <div>  
21 - <% else %>  
22 - <br style="clear:both" />  
23 - <% end %>  
24 - </li>  
25 -<% end %>  
26 -</ul>  
27 - 1 +<%= display_products_list @profile, @products %>
public/stylesheets/controller_catalog.css
1 -  
2 -/* * * List Products * * * * * * * * * * * * */  
3 -  
4 -#product_list {  
5 - margin: 0px;  
6 - padding: 0px;  
7 -}  
8 -  
9 -#product_list ul {  
10 - margin: 0px;  
11 - padding: 0px;  
12 -}  
13 -  
14 -#content #product_list li {  
15 - margin: 0px;  
16 - padding: 0px;  
17 - list-style: none;  
18 -}  
19 -  
20 -#content #product_list li.product {  
21 - border: 1px solid #888;  
22 - margin-bottom: 10px;  
23 - padding: 5px 10px;  
24 -}  
25 -  
26 -#product_list .product-pic {  
27 - display: block;  
28 - width: 64px;  
29 - height: 64px;  
30 - background-repeat: no-repeat;  
31 - background-position: 50% 50%;  
32 - float: left;  
33 - margin-right: 15px;  
34 - position: relative; /* work arround msie bug */  
35 -}  
36 -  
37 -#product_list .product-pic span {  
38 - display: none;  
39 -}  
40 -  
41 -#content #product_list h3 {  
42 - margin: 0px;  
43 - padding: 0px;  
44 - font-size: 120%;  
45 -}  
46 -.msie #content #product_list h3 {  
47 - margin-top: -15px;  
48 -}  
49 -#product_list h3 a {  
50 - text-decoration: none;  
51 -}  
52 -  
53 -#product_list .product_category {  
54 - font-size: 11px;  
55 -}  
56 -  
57 -#product_list .description {  
58 - clear: left;  
59 - font-size: 11px;  
60 - text-align: justify;  
61 - padding: 5px 10px 0px 10px;  
62 -}  
63 -.msie #product_list .description {  
64 - padding: 5px 10px 10px 10px;  
65 -}  
66 -  
67 -/* * * Show Product * * * * * * * * * * * * */  
68 -  
69 -#show_product .product-pic {  
70 - float: left;  
71 - margin-right: 15px;  
72 - border: 1px solid #444;  
73 - padding: 2px;  
74 - background: #FFF;  
75 -}  
76 -  
77 -#show_product .product_category {  
78 - padding-top: 10px;  
79 - clear: left;  
80 -}  
81 - 1 +@import url('products.css');
public/stylesheets/controller_content_viewer.css
  1 +@import url('products.css');
  2 +
1 /************* enterprise homepage style *****************/ 3 /************* enterprise homepage style *****************/
2 4
3 div.event-info { 5 div.event-info {
public/stylesheets/products.css 0 → 100644
@@ -0,0 +1,80 @@ @@ -0,0 +1,80 @@
  1 +/* * * List Products * * * * * * * * * * * * */
  2 +
  3 +#product_list {
  4 + margin: 0px;
  5 + padding: 0px;
  6 +}
  7 +
  8 +#product_list ul {
  9 + margin: 0px;
  10 + padding: 0px;
  11 +}
  12 +
  13 +#content #product_list li {
  14 + margin: 0px;
  15 + padding: 0px;
  16 + list-style: none;
  17 +}
  18 +
  19 +#content #product_list li.product {
  20 + border: 1px solid #888;
  21 + margin-bottom: 10px;
  22 + padding: 5px 10px;
  23 +}
  24 +
  25 +#product_list .product-pic {
  26 + display: block;
  27 + width: 64px;
  28 + height: 64px;
  29 + background-repeat: no-repeat;
  30 + background-position: 50% 50%;
  31 + float: left;
  32 + margin-right: 15px;
  33 + position: relative; /* work arround msie bug */
  34 +}
  35 +
  36 +#product_list .product-pic span {
  37 + display: none;
  38 +}
  39 +
  40 +#content #product_list h3 {
  41 + margin: 0px;
  42 + padding: 0px;
  43 + font-size: 120%;
  44 +}
  45 +.msie #content #product_list h3 {
  46 + margin-top: -15px;
  47 +}
  48 +#product_list h3 a {
  49 + text-decoration: none;
  50 +}
  51 +
  52 +#product_list .product_category {
  53 + font-size: 11px;
  54 +}
  55 +
  56 +#product_list .description {
  57 + clear: left;
  58 + font-size: 11px;
  59 + text-align: justify;
  60 + padding: 5px 10px 0px 10px;
  61 +}
  62 +.msie #product_list .description {
  63 + padding: 5px 10px 10px 10px;
  64 +}
  65 +
  66 +/* * * Show Product * * * * * * * * * * * * */
  67 +
  68 +#show_product .product-pic {
  69 + float: left;
  70 + margin-right: 15px;
  71 + border: 1px solid #444;
  72 + padding: 2px;
  73 + background: #FFF;
  74 +}
  75 +
  76 +#show_product .product_category {
  77 + padding-top: 10px;
  78 + clear: left;
  79 +}
  80 +
test/unit/application_helper_test.rb
@@ -62,9 +62,11 @@ class ApplicationHelperTest &lt; Test::Unit::TestCase @@ -62,9 +62,11 @@ class ApplicationHelperTest &lt; Test::Unit::TestCase
62 cat = mock 62 cat = mock
63 cat.expects(:path).returns('my-category/my-subcatagory') 63 cat.expects(:path).returns('my-category/my-subcatagory')
64 cat.expects(:full_name).returns('category name') 64 cat.expects(:full_name).returns('category name')
  65 + cat.expects(:environment).returns(Environment.default)
  66 + Environment.any_instance.expects(:default_hostname).returns('example.com')
65 67
66 result = "/cat/my-category/my-subcatagory" 68 result = "/cat/my-category/my-subcatagory"
67 - expects(:link_to).with('category name', :controller => 'search', :action => 'category_index', :category_path => ['my-category', 'my-subcatagory']).returns(result) 69 + expects(:link_to).with('category name', :controller => 'search', :action => 'category_index', :category_path => ['my-category', 'my-subcatagory'], :host => 'example.com').returns(result)
68 assert_same result, link_to_category(cat) 70 assert_same result, link_to_category(cat)
69 end 71 end
70 72
test/unit/enterprise_homepage_test.rb
@@ -24,4 +24,33 @@ class EnterpriseHomepageTest &lt; Test::Unit::TestCase @@ -24,4 +24,33 @@ class EnterpriseHomepageTest &lt; Test::Unit::TestCase
24 assert_match /5555 5555/, result 24 assert_match /5555 5555/, result
25 end 25 end
26 26
  27 + should 'display products list' do
  28 + ent = Enterprise.create!(:identifier => 'test_enterprise', :name => 'Test enteprise')
  29 + prod = ent.products.create!(:name => 'Product test')
  30 + a = EnterpriseHomepage.new(:name => 'article homepage')
  31 + ent.articles << a
  32 + result = a.to_html
  33 + assert_match /Product test/, result
  34 + end
  35 +
  36 + should 'not display products list if environment do not let' do
  37 + e = Environment.default
  38 + e.enable('disable_products_for_enterprises')
  39 + e.save!
  40 + ent = Enterprise.create!(:identifier => 'test_enterprise', :name => 'Test enteprise', :environment => e)
  41 + prod = ent.products.create!(:name => 'Product test')
  42 + a = EnterpriseHomepage.new(:name => 'article homepage')
  43 + ent.articles << a
  44 + result = a.to_html
  45 + assert_no_match /Product test/, result
  46 + end
  47 +
  48 + should 'display link to product' do
  49 + ent = Enterprise.create!(:identifier => 'test_enterprise', :name => 'Test enteprise')
  50 + prod = ent.products.create!(:name => 'Product test')
  51 + a = EnterpriseHomepage.new(:name => 'article homepage')
  52 + ent.articles << a
  53 + result = a.to_html
  54 + assert_match /catalog\/test_enterprise\/#{prod.id}/, result
  55 + end
27 end 56 end