Commit 9be859d42aea93e04ea8f520ee5258021abf3c05
1 parent
f323c51d
Exists in
master
and in
22 other branches
profile: refactor profile fields display process
Also displays every field that is not defined in any category in the last category called "General". Fields are now easily moved between categories and categories a easily created. Fields html generation centered in only one method and the field name and value are customizable through methods. Fix #14
Showing
5 changed files
with
188 additions
and
143 deletions
Show diff stats
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 { | ... | ... |