Commit 3f355c740e00b15f09da59331d15a00d564d42a4

Authored by Rodrigo Souto
2 parents f323c51d 9be859d4

Merge branch 'profile-fields-master' into 'master'

Profile fields master

Fix issue #14

See merge request !337
app/helpers/profile_helper.rb
1 1 module ProfileHelper
2 2  
3   - def display_field(title, profile, field, force = false)
  3 + COMMON_CATEGORIES = ActiveSupport::OrderedHash.new
  4 + COMMON_CATEGORIES[:content] = [:blogs, :image_galleries, :events, :tags]
  5 + COMMON_CATEGORIES[:interests] = [:interests]
  6 + COMMON_CATEGORIES[:general] = nil
  7 +
  8 + PERSON_CATEGORIES = ActiveSupport::OrderedHash.new
  9 + PERSON_CATEGORIES[:basic_information] = [:nickname, :sex, :birth_date, :location, :privacy_setting, :created_at]
  10 + PERSON_CATEGORIES[:contact] = [:contact_phone, :cell_phone, :comercial_phone, :contact_information, :email, :personal_website, :jabber_id]
  11 + PERSON_CATEGORIES[:location] = [:address, :address_reference, :zip_code, :city, :state, :district, :country, :nationality]
  12 + PERSON_CATEGORIES[:work] = [:organization, :organization_website, :professional_activity]
  13 + PERSON_CATEGORIES[:study] = [:schooling, :formation, :area_of_study]
  14 + PERSON_CATEGORIES[:network] = [:friends, :communities, :enterprises]
  15 + PERSON_CATEGORIES.merge!(COMMON_CATEGORIES)
  16 +
  17 + ORGANIZATION_CATEGORIES = ActiveSupport::OrderedHash.new
  18 + ORGANIZATION_CATEGORIES[:basic_information] = [:display_name, :created_at, :foundation_year, :type, :language, :members_count, :location, :address_reference, :historic_and_current_context, :admins]
  19 + ORGANIZATION_CATEGORIES[:contact] = [:contact_person, :contact_phone, :contact_email, :organization_website, :jabber_id]
  20 + ORGANIZATION_CATEGORIES[:economic] = [:business_name, :acronym, :economic_activity, :legal_form, :products, :activities_short_description, :management_information]
  21 + ORGANIZATION_CATEGORIES.merge!(COMMON_CATEGORIES)
  22 +
  23 + CATEGORY_MAP = ActiveSupport::OrderedHash.new
  24 + CATEGORY_MAP[:person] = PERSON_CATEGORIES
  25 + CATEGORY_MAP[:organization] = ORGANIZATION_CATEGORIES
  26 +
  27 + FORCE = {
  28 + :person => [:privacy_setting],
  29 + :organization => [:privacy_setting, :location],
  30 + }
  31 +
  32 + MULTIPLE = {
  33 + :person => [:blogs, :image_galleries, :interests],
  34 + :organization => [:blogs, :image_galleries, :interests],
  35 + }
  36 +
  37 + CUSTOM_LABELS = {
  38 + :zip_code => _('ZIP code'),
  39 + :email => _('e-Mail'),
  40 + :jabber_id => _('Jabber'),
  41 + :birth_date => _('Date of birth'),
  42 + :created_at => _('Profile created at'),
  43 + :members_count => _('Members'),
  44 + }
  45 +
  46 + EXCEPTION = {
  47 + :person => [:image, :preferred_domain, :description, :tag_list],
  48 + :organization => [:image, :preferred_domain, :description, :tag_list, :address, :zip_code, :city, :state, :country, :district]
  49 + }
  50 +
  51 + def general_fields
  52 + categorized_fields = CATEGORY_MAP[kind].values.flatten
  53 + profile.class.fields.map(&:to_sym) - categorized_fields - EXCEPTION[kind]
  54 + end
  55 +
  56 + def kind
  57 + if profile.kind_of?(Person)
  58 + :person
  59 + else
  60 + :organization
  61 + end
  62 + end
  63 +
  64 + def title(field, entry = nil)
  65 + return self.send("#{field}_title", entry) if MULTIPLE[kind].include?(field) && entry.present?
  66 + CUSTOM_LABELS[field.to_sym] || field.to_s.humanize
  67 + end
  68 +
  69 + def display_field(field)
  70 + force = FORCE[kind].include?(field)
  71 + multiple = MULTIPLE[kind].include?(field)
4 72 unless force || profile.may_display_field_to?(field, user)
5 73 return ''
6 74 end
7   - value = profile.send(field)
  75 + value = begin profile.send(field) rescue nil end
  76 + p field
8 77 if !value.blank?
9   - if block_given?
10   - value = yield(value)
11   - end
12   - content_tag('tr', content_tag('td', title, :class => 'field-name') + content_tag('td', value))
  78 + entries = multiple ? value : [] << value
  79 + entries.map do |entry|
  80 + content = self.send("treat_#{field}", entry)
  81 + content_tag('tr', content_tag('td', title(field, entry), :class => 'field-name') + content_tag('td', content))
  82 + end.join("\n")
13 83 else
14 84 ''
15 85 end
16 86 end
17 87  
18   - def display_contact(profile)
19   - fields = []
20   - fields << display_field(_('Address:'), profile, :address).html_safe
21   - fields << display_field(_('ZIP code:'), profile, :zip_code).html_safe
22   - fields << display_field(_('Contact phone:'), profile, :contact_phone).html_safe
23   - fields << display_field(_('e-Mail:'), profile, :email) { |email| link_to_email(email) }.html_safe
24   - fields << display_field(_('Personal website:'), profile, :personal_website).html_safe
25   - fields << display_field(_('Jabber:'), profile, :jabber_id).html_safe
26   - if fields.reject!(&:blank?).empty?
27   - ''
28   - else
29   - content_tag('tr', content_tag('th', _('Contact'), { :colspan => 2 })) + fields.join.html_safe
  88 + def treat_email(email)
  89 + link_to_email(email)
  90 + end
  91 +
  92 + def treat_organization_website(url)
  93 + link_to(url, url)
  94 + end
  95 +
  96 + def treat_sex(gender)
  97 + { 'male' => _('Male'), 'female' => _('Female') }[gender]
  98 + end
  99 +
  100 + def treat_date(date)
  101 + puts date.inspect
  102 + show_date(date.to_date)
  103 + end
  104 + alias :treat_birth_date :treat_date
  105 + alias :treat_created_at :treat_date
  106 +
  107 + def treat_friends(friends)
  108 + link_to friends.count, :controller => 'profile', :action => 'friends'
  109 + end
  110 +
  111 + def treat_communities(communities)
  112 + link_to communities.count, :controller => "profile", :action => 'communities'
  113 + end
  114 +
  115 + def treat_enterprises(enterprises)
  116 + if environment.disabled?('disable_asset_enterprises')
  117 + link_to enterprises.count, :controller => "profile", :action => 'enterprises'
30 118 end
31 119 end
32 120  
33   - def display_work_info(profile)
34   - organization = display_field(_('Organization:'), profile, :organization)
35   - organization_site = display_field(_('Organization website:'), profile, :organization_website) { |url| link_to(url, url) }
36   - if organization.blank? && organization_site.blank?
37   - ''
  121 + def treat_members_count(count)
  122 + link_to count, :controller => 'profile', :action => 'members'
  123 + end
  124 +
  125 + def treat_products(products)
  126 + if profile.kind_of?(Enterprise) && profile.environment.enabled?('products_for_enterprises')
  127 + link_to _('Products/Services'), :controller => 'catalog', :action => 'index'
  128 + end
  129 + end
  130 +
  131 + def treat_admins(admins)
  132 + profile.admins.map { |admin| link_to(admin.short_name, admin.url)}.join(', ')
  133 + end
  134 +
  135 + def treat_blogs(blog)
  136 + p blog
  137 + link_to(n_('One post', '%{num} posts', blog.posts.published.count) % { :num => blog.posts.published.count }, blog.url)
  138 + end
  139 +
  140 + def treat_image_galleries(gallery)
  141 + p gallery
  142 + link_to(n_('One picture', '%{num} pictures', gallery.images.published.count) % { :num => gallery.images.published.count }, gallery.url)
  143 + end
  144 +
  145 + def treat_events(events)
  146 + link_to events.published.count, :controller => 'events', :action => 'events'
  147 + end
  148 +
  149 + def treat_tags(tags)
  150 + tag_cloud @tags, :id, { :action => 'tags' }, :max_size => 18, :min_size => 10
  151 + end
  152 +
  153 + def treat_interests(interest)
  154 + link_to interest.name, :controller => 'search', :action => 'category_index', :category_path => interest.explode_path
  155 + end
  156 +
  157 + def article_title(article)
  158 + article.name
  159 + end
  160 + alias :blogs_title :article_title
  161 + alias :image_galleries_title :article_title
  162 +
  163 + def interests_title(interest)
  164 + ''
  165 + end
  166 +
  167 + def method_missing(method, *args, &block)
  168 + if method.to_s =~ /^treat_(.+)$/
  169 + args[0]
  170 + elsif method.to_s =~ /^display_(.+)$/ && CATEGORY_MAP[kind].has_key?($1.to_sym)
  171 + category = $1.to_sym
  172 + fields = category == :general ? general_fields : CATEGORY_MAP[kind][category]
  173 + contents = []
  174 +
  175 + fields.each do |field|
  176 + contents << display_field(field).html_safe
  177 + end
  178 +
  179 + contents = contents.delete_if(&:blank?)
  180 +
  181 + unless contents.empty?
  182 + content_tag('tr', content_tag('th', title(category), { :colspan => 2 })) + contents.join.html_safe
  183 + else
  184 + ''
  185 + end
38 186 else
39   - content_tag('tr', content_tag('th', _('Work'), { :colspan => 2 })) + organization + organization_site
  187 + super
40 188 end
41 189 end
42 190  
... ...
app/views/profile/_common.html.erb
1 1 <% unless @action %>
2 2 <% cache_timeout(profile.cache_key + '-profile-general-info', 4.hours) do %>
3   - <tr>
4   - <th colspan='2'>
5   - <%= _('Content') %>
6   - </th>
7   - </tr>
8   -
9   - <% profile.blogs.each do |blog| %>
10   - <tr>
11   - <td><%= blog.name + ':' %></td>
12   - <td>
13   - <%= link_to(n_('One post', '%{num} posts', blog.posts.published.count) % { :num => blog.posts.published.count }, blog.url) %>
14   - </td>
15   - </tr>
16   - <% end %>
17   - <% profile.image_galleries.each do |gallery| %>
18   - <tr>
19   - <td><%= gallery.name + ':' %></td>
20   - <td>
21   - <%= link_to(n_('One picture', '%{num} pictures', gallery.images.published.count) % { :num => gallery.images.published.count }, gallery.url) %>
22   - </td>
23   - </tr>
24   - <% end %>
25   -
26   - <tr>
27   - <td><%= _('Events:') %></td>
28   - <td>
29   - <%= link_to profile.events.published.count, :controller => 'events', :action => 'events' %>
30   - </td>
31   - </tr>
32   - <tr>
33   - <td>
34   - <%= _('Tags:') %>
35   - </td>
36   - <td>
37   - <%= tag_cloud @tags, :id, { :action => 'tags' }, :max_size => 18, :min_size => 10%>
38   - </td>
39   - </tr>
  3 + <%= display_content %>
40 4  
41 5 <% if !environment.enabled?('disable_categories') && !profile.interests.empty? %>
42   - <tr>
43   - <th colspan='2'><%= _('Interests') %></th>
44   - </tr>
45   - <% profile.interests.each do |item| %>
46   - <tr>
47   - <td></td>
48   - <td><%= link_to item.name, :controller => 'search', :action => 'category_index', :category_path => item.explode_path %></td>
49   - </tr>
50   - <% end %>
  6 + <%= display_interests %>
51 7 <% end %>
  8 +
  9 + <%= display_general %>
52 10 <% end %>
53 11 <% end %>
... ...
app/views/profile/_organization_profile.html.erb
1 1 <table>
2   - <tr>
3   - <th colspan='2'><%= _('Basic information')%></th>
4   - </tr>
5   -
6   - <tr>
7   - <td class='field-name'><%= _('Members') %></td>
8   - <td>
9   - <%= link_to profile.members_count, :controller => 'profile', :action => 'members' %>
10   - </td>
11   - </tr>
12   -
13   - <%= display_field(_('Type:'), profile, :privacy_setting, true) %>
14   -
15   - <%= display_field(_('Location:'), profile, :location, true) %>
16   -
17   - <tr>
18   - <td class='field-name'><%= _('Profile created at:') %></td>
19   - <td><%= show_date(profile.created_at) %></td>
20   - </tr>
21   -
22   - <% if profile.kind_of?(Enterprise) && profile.environment.enabled?('products_for_enterprises') %>
23   - <tr>
24   - <td></td>
25   - <td>
26   - <%= link_to _('Products/Services'), :controller => 'catalog', :action => 'index' %>
27   - </td>
28   - </tr>
29   - <% end %>
30   -
31   - <tr>
32   - <td class='field-name'><%= _('Administrators:') %></td>
33   - <td>
34   - <%= profile.admins.map { |admin| link_to(admin.short_name, admin.url)}.join(', ') %>
35   - </td>
36   - </tr>
37   -
  2 + <%= display_basic_information %>
  3 + <%= display_contact %>
  4 + <%= display_economic %>
38 5 <%= render :partial => 'common' %>
39 6 </table>
... ...
app/views/profile/_person_profile.html.erb
1 1 <table>
2   - <tr>
3   - <th colspan='2'><%= _('Basic information')%></th>
4   - </tr>
5   - <%= display_field(_('Sex:'), profile, :sex) { |gender| { 'male' => _('Male'), 'female' => _('Female') }[gender] } %>
6   - <%= display_field(_('Date of birth:'), profile, :birth_date) { |date| show_date(date) }%>
7   - <%= display_field _('Location:'), profile, :location %>
8   -
9   - <%= display_field(_('Type:'), profile, :privacy_setting, true) %>
10   -
11   - <tr>
12   - <td class='field-name'><%= _('Profile created at:') %></td>
13   - <td><%= show_date(profile.created_at) %></td>
14   - </tr>
15   -
16   - <%= display_contact profile %>
  2 + <%= display_basic_information %>
  3 + <%= display_contact %>
  4 + <%= display_location %>
17 5  
18 6 <% cache_timeout(profile.relationships_cache_key, 4.hours) do %>
19   - <%= display_work_info profile %>
20   -
21   - <tr>
22   - <th colspan='2'><%= _('Network')%></th>
23   - </tr>
24   - <tr>
25   - <td><%= _('Friends') + ':' %></td>
26   - <td><%= link_to profile.friends.count, { :controller => 'profile', :action => 'friends' } %></td>
27   - </tr>
28   - <tr>
29   - <td><%= _('Communities') + ':' %></td>
30   - <td><%= link_to profile.communities.count, :controller => "profile", :action => 'communities' %></td>
31   - </tr>
32   - <% if environment.disabled?('disable_asset_enterprises') %>
33   - <tr id="person-profile-network-enterprises">
34   - <td><%= _('Enterprises') + ':' %></td>
35   - <td><%= link_to profile.enterprises.count, :controller => "profile", :action => 'enterprises' %></td>
36   - </tr>
37   - <% end %>
  7 + <%= display_work %>
  8 + <%= display_study %>
  9 + <%= display_network %>
38 10  
39 11 <%= render :partial => 'common' %>
40   -
41 12 <% end %>
42 13 </table>
43 14  
... ...
public/stylesheets/application.css
... ... @@ -242,10 +242,11 @@ table.noborder:hover td.selected, td.selected {
242 242 td .button {
243 243 background-color: transparent;
244 244 }
245   -td.field-name {
  245 +table.profile td.field-name {
246 246 width: 150px;
247 247 text-align: left;
248   - vertical-align: top;
  248 + vertical-align: middle;
  249 + padding-right: 5px;
249 250 }
250 251  
251 252 table.profile .ui-tabs .ui-tabs-panel {
... ...