Rework the user details screen to be less crap... Highlights include:

- Map is smaller and placed to the side with lists of friends
    and nearby users (now excluding friends) beside it.

  - Map includes friends as well as nearby users.

  - Friend and nearby user lists include photos and links to
    friend/unfriend as appropriate.

  - OAuth settings link moved up with all the other links in the
    main navigation bar.

The addition of friends to the map also carries through to the user
settings page.
This commit is contained in:
Tom Hughes 2010-02-27 18:11:04 +00:00
parent 150ae06104
commit acd72861ed
9 changed files with 194 additions and 152 deletions

View file

@ -287,7 +287,11 @@ class UserController < ApplicationController
flash[:warning] = t 'user.make_friend.already_a_friend', :name => name
end
redirect_to :controller => 'user', :action => 'view'
if params[:referer]
redirect_to params[:referer]
else
redirect_to :controller => 'user', :action => 'view'
end
end
end
@ -302,7 +306,11 @@ class UserController < ApplicationController
flash[:error] = t 'user.remove_friend.not_a_friend', :name => friend.display_name
end
redirect_to :controller => 'user', :action => 'view'
if params[:referer]
redirect_to params[:referer]
else
redirect_to :controller => 'user', :action => 'view'
end
end
end

View file

@ -0,0 +1,31 @@
<tr>
<td rowspan="2">
<% if contact.image %>
<%= image_tag url_for_file_column(contact, "image"), :class => "user_thumbnail" %>
<% else %>
<%= image_tag "anon_small.png" %>
<% end %>
</td>
<td>
<%= link_to h(contact.display_name), :controller => 'user', :action => 'view', :display_name => contact.display_name %>
<% if contact.home_lon and contact.home_lat %>
<% distance = @this_user.distance(contact) %>
<% if distance < 1 %>
(<%= t 'user.view.m away', :count => (distance * 1000).round %>)
<% else %>
(<%= t 'user.view.km away', :count => distance.round %>)
<% end %>
<% end %>
</td>
</tr>
<tr>
<td>
<%= link_to t('user.view.send message'), :controller => 'message', :action => 'new', :display_name => contact.display_name %>
|
<% if @user.is_friends_with?(contact) %>
<%= link_to t('user.view.remove as friend'), :controller => 'user', :action => 'remove_friend', :display_name => contact.display_name, :referer => request.request_uri %>
<% else %>
<%= link_to t('user.view.add as friend'), :controller => 'user', :action => 'make_friend', :display_name => contact.display_name, :referer => request.request_uri %>
<% end %>
</td>
</tr>

View file

@ -1,14 +1,23 @@
<% nearest_str = "" %>
<% if !@user.home_lat.nil? and !@user.home_lon.nil? %>
<% if !@user.nearby.empty? %>
<% @user.nearby.each do |nearby| %>
<% nearest_str += "nearest.push( { 'display_name' : '#{escape_javascript(nearby.display_name)}', 'home_lat' : #{nearby.home_lat}, 'home_lon' : #{nearby.home_lon} } );\n" %>
<script type="text/javascript">
var nearest = [], friends = [];
<% friends = @user.friends.collect { |f| f.befriendee } %>
<% friends.each do |friend| %>
<% if !friend.home_lat.nil? and !friend.home_lon.nil? %>
friends.push({
display_name : "<%= escape_javascript(friend.display_name) %>",
home_lat : <%= friend.home_lat %>,
home_lon : <%= friend.home_lon %>
});
<% end %>
<% end %>
<% end %>
<script type="text/javascript">
var nearest = [], friends = [];
<%= nearest_str %>
<% nearest = @user.nearby - friends %>
<% nearest.each do |nearby| %>
nearest.push({
display_name : "<%= escape_javascript(nearby.display_name) %>",
home_lat : <%= nearby.home_lat %>,
home_lon : <%= nearby.home_lon %>
});
<% end %>
</script>
<% if @user.home_lat.nil? or @user.home_lon.nil? %>
@ -47,17 +56,25 @@
setMapCenter(centre, zoom);
<% if marker %>
marker = addMarkerToMap(new OpenLayers.LonLat(<%= mlon %>, <%= mlat %>), null, "<%= t 'user.friend_map.your location' %>");
marker = addMarkerToMap(new OpenLayers.LonLat(<%= mlon %>, <%= mlat %>), null, "<%= t 'user.map.your location' %>");
<% end %>
var near_icon = OpenLayers.Marker.defaultIcon();
near_icon.url = OpenLayers.Util.getImagesLocation() + "marker-green.png";;
var i = nearest.length;
while( i-- ) {
var description = i18n('<%= t 'user.friend_map.nearby mapper'%>', { nearby_user: '<a href="/user/'+nearest[i].display_name+'">'+nearest[i].display_name+'</a>' });
var description = i18n('<%= t 'user.map.nearby mapper'%>', { nearby_user: '<a href="/user/'+nearest[i].display_name+'">'+nearest[i].display_name+'</a>' });
var nearmarker = addMarkerToMap(new OpenLayers.LonLat(nearest[i].home_lon, nearest[i].home_lat), near_icon.clone(), description);
}
var friend_icon = OpenLayers.Marker.defaultIcon();
friend_icon.url = OpenLayers.Util.getImagesLocation() + "marker-blue.png";;
var i = friends.length;
while( i-- ) {
var description = i18n('<%= t 'user.map.friend'%>', { friend_user: '<a href="/user/'+friends[i].display_name+'">'+friends[i].display_name+'</a>' });
var friendmarker = addMarkerToMap(new OpenLayers.LonLat(friends[i].home_lon, friends[i].home_lat), friend_icon.clone(), description);
}
if (document.getElementById('updatehome')) {
map.events.register("click", map, setHome);
}
@ -77,7 +94,7 @@
removeMarkerFromMap(marker);
}
marker = addMarkerToMap(lonlat, null, "<%= t 'user.friend_map.your location' %>");
marker = addMarkerToMap(lonlat, null, "<%= t 'user.map.your location' %>");
}
}

View file

@ -59,7 +59,7 @@
<% else %>
<table>
<tr>
<td rowspan="3" valign="top"><%= image_tag url_for_file_column(@user, "image") %></td>
<td rowspan="3" valign="top"><%= image_tag url_for_file_column(@user, "image"), :class => "user_image" %></td>
<td><%= radio_button_tag "image_action", "keep", true %></td>
<td><%= t 'user.account.keep image' %></td>
</tr>
@ -96,7 +96,7 @@
</table>
<% end %>
<%= render :partial => 'friend_map' %>
<%= render :partial => 'map' %>
<% unless @user.data_public? %>
<a name="public"></a>

View file

@ -1,148 +1,124 @@
<% if @this_user.image %>
<%= image_tag url_for_file_column(@this_user, "image"), :align => "right", :float => "left" %>
<%= image_tag url_for_file_column(@this_user, "image"), :style => "float: right; margin-top: 19px", :class => "user_image" %>
<% end %>
<h2><%= h(@this_user.display_name) %>
<% UserRole::ALL_ROLES.each do |role| %>
<% if @user and @user.administrator? %>
<% if @this_user.has_role? role %>
<%= link_to(image_tag("roles/#{role}.png", :size => "20x20", :border => 0, :alt => t("user.view.role.revoke.#{role}"), :title => t("user.view.role.revoke.#{role}")), :controller => 'user_roles', :action => 'revoke', :display_name => @this_user.display_name, :role => role) %>
<% else %>
<%= link_to(image_tag("roles/blank_#{role}.png", :size => "20x20", :border => 0, :alt => t("user.view.role.grant.#{role}"), :title => t("user.view.role.grant.#{role}")), :controller => 'user_roles', :action => 'grant', :display_name => @this_user.display_name, :role => role) %>
<% end %>
<% elsif @this_user.has_role? role %>
<%= image_tag("roles/#{role}.png", :size => "20x20", :border => 0, :alt => t("user.view.role.#{role}"), :title => t("user.view.role.#{role}")) %>
<% end %>
<% if @user and @user.administrator? %>
<% if @this_user.has_role? role %>
<%= link_to(image_tag("roles/#{role}.png", :size => "20x20", :border => 0, :alt => t("user.view.role.revoke.#{role}"), :title => t("user.view.role.revoke.#{role}")), :controller => 'user_roles', :action => 'revoke', :display_name => @this_user.display_name, :role => role) %>
<% else %>
<%= link_to(image_tag("roles/blank_#{role}.png", :size => "20x20", :border => 0, :alt => t("user.view.role.grant.#{role}"), :title => t("user.view.role.grant.#{role}")), :controller => 'user_roles', :action => 'grant', :display_name => @this_user.display_name, :role => role) %>
<% end %>
<% elsif @this_user.has_role? role %>
<%= image_tag("roles/#{role}.png", :size => "20x20", :border => 0, :alt => t("user.view.role.#{role}"), :title => t("user.view.role.#{role}")) %>
<% end %>
<% end %></h2>
<div id="userinformation">
<% if @user and @this_user.id == @user.id %>
<!-- Displaying user's own profile page -->
<%= link_to t('user.view.my diary'), :controller => 'diary_entry', :action => 'list', :display_name => @user.display_name %>
| <%= link_to t('user.view.new diary entry'), :controller => 'diary_entry', :action => 'new', :display_name => @user.display_name %>
| <%= link_to t('user.view.my edits'), :controller => 'changeset', :action => 'list', :display_name => @user.display_name %>
| <%= link_to t('user.view.my traces'), :controller => 'trace', :action=>'mine' %>
| <%= link_to t('user.view.my settings'), :controller => 'user', :action => 'account', :display_name => @user.display_name %>
| <%= link_to t('user.view.blocks on me'), :controller => 'user_blocks', :action => 'blocks_on', :display_name => @user.display_name %>
<% if @user and @user.moderator? %>
| <%= link_to t('user.view.blocks by me'), :controller => 'user_blocks', :action => 'blocks_by', :display_name => @user.display_name %>
<% end %>
<% else %>
<!-- Displaying another user's profile page -->
<%= link_to t('user.view.send message'), :controller => 'message', :action => 'new', :display_name => @this_user.display_name %>
| <%= link_to t('user.view.diary'), :controller => 'diary_entry', :action => 'list', :display_name => @this_user.display_name %>
| <%= link_to t('user.view.edits'), :controller => 'changeset', :action => 'list', :display_name => @this_user.display_name %>
| <%= link_to t('user.view.traces'), :controller => 'trace', :action => 'view', :display_name => @this_user.display_name %>
| <% if @user and @user.is_friends_with?(@this_user) %>
<%= link_to t('user.view.remove as friend'), :controller => 'user', :action => 'remove_friend', :display_name => @this_user.display_name %>
<% else %>
<%= link_to t('user.view.add as friend'), :controller => 'user', :action => 'make_friend', :display_name => @this_user.display_name %>
<% end %>
| <%= link_to t('user.view.block_history'), :controller => 'user_blocks', :action => 'blocks_on', :display_name => @this_user.display_name %>
<% if @this_user.moderator? %>
| <%= link_to t('user.view.moderator_history'), :controller => 'user_blocks', :action => 'blocks_by', :display_name => @this_user.display_name %>
<% end %>
<% if @user and @user.moderator? %>
| <%= link_to t('user.view.create_block'), :controller => 'user_blocks', :action => 'new', :display_name => @this_user.display_name %>
<% end %>
<% end %>
<% if @user and @user.administrator? %>
<br/>
<% if @this_user.active? %>
<%= link_to t('user.view.deactivate_user'), {:controller => 'user', :action => 'deactivate', :display_name => @this_user.display_name}, {:confirm => t('user.view.confirm')} %>
<% else %>
<%= link_to t('user.view.activate_user'), {:controller => 'user', :action => 'activate', :display_name => @this_user.display_name}, {:confirm => t('user.view.confirm')} %>
<% end %>
<% if @this_user.visible? %>
| <%= link_to t('user.view.hide_user'), {:controller => 'user', :action => 'hide', :display_name => @this_user.display_name}, {:confirm => t('user.view.confirm')} %>
| <%= link_to t('user.view.delete_user'), {:controller => 'user', :action => 'delete', :display_name => @this_user.display_name}, {:confirm => t('user.view.confirm')} %>
<% else %>
| <%= link_to t('user.view.unhide_user'), {:controller => 'user', :action => 'unhide', :display_name => @this_user.display_name}, {:confirm => t('user.view.confirm')} %>
<% end %>
<% end %>
<% if @user and @this_user.id == @user.id %>
<!-- Displaying user's own profile page -->
<%= link_to t('user.view.my diary'), :controller => 'diary_entry', :action => 'list', :display_name => @user.display_name %>
|
<%= link_to t('user.view.new diary entry'), :controller => 'diary_entry', :action => 'new', :display_name => @user.display_name %>
|
<%= link_to t('user.view.my edits'), :controller => 'changeset', :action => 'list', :display_name => @user.display_name %>
|
<%= link_to t('user.view.my traces'), :controller => 'trace', :action=>'mine' %>
|
<%= link_to t('user.view.my settings'), :controller => 'user', :action => 'account', :display_name => @user.display_name %>
|
<%= link_to t('user.view.oauth settings'), :controller => 'oauth_clients', :action => 'index' %>
|
<%= link_to t('user.view.blocks on me'), :controller => 'user_blocks', :action => 'blocks_on', :display_name => @user.display_name %>
<% if @user and @user.moderator? %>
| <%= link_to t('user.view.blocks by me'), :controller => 'user_blocks', :action => 'blocks_by', :display_name => @user.display_name %>
<% end %>
<% else %>
<!-- Displaying another user's profile page -->
<%= link_to t('user.view.send message'), :controller => 'message', :action => 'new', :display_name => @this_user.display_name %>
|
<%= link_to t('user.view.diary'), :controller => 'diary_entry', :action => 'list', :display_name => @this_user.display_name %>
|
<%= link_to t('user.view.edits'), :controller => 'changeset', :action => 'list', :display_name => @this_user.display_name %>
|
<%= link_to t('user.view.traces'), :controller => 'trace', :action => 'view', :display_name => @this_user.display_name %>
|
<% if @user and @user.is_friends_with?(@this_user) %>
<%= link_to t('user.view.remove as friend'), :controller => 'user', :action => 'remove_friend', :display_name => @this_user.display_name %>
<% else %>
<%= link_to t('user.view.add as friend'), :controller => 'user', :action => 'make_friend', :display_name => @this_user.display_name %>
<% end %>
|
<%= link_to t('user.view.block_history'), :controller => 'user_blocks', :action => 'blocks_on', :display_name => @this_user.display_name %>
<% if @this_user.moderator? %>
| <%= link_to t('user.view.moderator_history'), :controller => 'user_blocks', :action => 'blocks_by', :display_name => @this_user.display_name %>
<% end %>
<% if @user and @user.moderator? %>
| <%= link_to t('user.view.create_block'), :controller => 'user_blocks', :action => 'new', :display_name => @this_user.display_name %>
<% end %>
<% end %>
<% if @user and @user.administrator? %>
<br/>
<% if @this_user.active? %>
<%= link_to t('user.view.deactivate_user'), {:controller => 'user', :action => 'deactivate', :display_name => @this_user.display_name}, {:confirm => t('user.view.confirm')} %>
<% else %>
<%= link_to t('user.view.activate_user'), {:controller => 'user', :action => 'activate', :display_name => @this_user.display_name}, {:confirm => t('user.view.confirm')} %>
<% end %>
|
<% if @this_user.visible? %>
<%= link_to t('user.view.hide_user'), {:controller => 'user', :action => 'hide', :display_name => @this_user.display_name}, {:confirm => t('user.view.confirm')} %>
|
<%= link_to t('user.view.delete_user'), {:controller => 'user', :action => 'delete', :display_name => @this_user.display_name}, {:confirm => t('user.view.confirm')} %>
<% else %>
<%= link_to t('user.view.unhide_user'), {:controller => 'user', :action => 'unhide', :display_name => @this_user.display_name}, {:confirm => t('user.view.confirm')} %>
<% end %>
<% end %>
</div>
<p><b><%= t 'user.view.mapper since' %></b> <%= l @this_user.creation_time %> <%= t 'user.view.ago', :time_in_words_ago => time_ago_in_words(@this_user.creation_time) %></p>
<% if @user and @user.administrator? %>
<p><b><%= t 'user.view.email address' %></b> <%= @this_user.email %></p>
<p><b><%= t 'user.view.created from' %></b> <%= @this_user.creation_ip %></p>
<p><b><%= t 'user.view.email address' %></b> <%= @this_user.email %></p>
<p><b><%= t 'user.view.created from' %></b> <%= @this_user.creation_ip %></p>
<% end %>
<h3><%= t 'user.view.description' %></h3>
<div id="description"><%= htmlize(@this_user.description) %></div>
<% if @this_user.home_lat.nil? or @this_user.home_lon.nil? %>
<h3><%= t 'user.view.user location' %></h3>
<%= t 'user.view.no home location' %>
<% if @user and @this_user.id == @user.id %>
<%= t 'user.view.if set location', :settings_link => (link_to t('user.view.settings_link_text'), :controller => 'user', :action => 'account', :display_name => @user.display_name) %>
<% end %>
<% else %>
<% if @user and @this_user.id == @user.id %>
<h3><%= t 'user.view.your friends' %></h3>
<% if @this_user.friends.empty? %>
<%= t 'user.view.no friends' %>
<% else %>
<table id="friends">
<% @this_user.friends.each do |friend| %>
<% @friend = User.find_by_id(friend.friend_user_id) %>
<tr>
<td class="image">
<% if @friend.image %>
<%= image_tag url_for_file_column(@friend, "image") %>
<% end %>
</td>
<td class="username"><%= link_to h(@friend.display_name), :controller => 'user', :action => 'view', :display_name => @friend.display_name %></td>
<td>
<% if @friend.home_lon and @friend.home_lat %>
<% distance = @this_user.distance(@friend) %>
<% if distance < 1 %>
<%= t 'user.view.m away', :count => (distance * 1000).round %>
<% else %>
<%= t 'user.view.km away', :count => distance.round %>
<% end %>
<% end %>
</td>
<td class="message">(<%= link_to t('user.view.send message'), :controller => 'message', :action => 'new', :display_name => @friend.display_name %>)</td>
</tr>
<%end%>
</table>
<%end%>
<br/>
<%end%>
<% if @user and @this_user.id == @user.id %>
<h3><%= t 'user.view.nearby users' %></h3>
<% if @this_user.nearby.empty? %>
<%= t 'user.view.no nearby users' %>
<% else %>
<div id="map" style="border: 1px solid black; position: relative; width : 90%; height : 400px;"></div>
<%= render :partial => 'friend_map' %>
<table id="nearbyusers">
<% @this_user.nearby.each do |nearby| %>
<tr>
<td class="username"><%= link_to h(nearby.display_name), :controller => 'user', :action => 'view', :display_name => nearby.display_name %></td>
<td>
<% distance = @this_user.distance(nearby) %>
<% if distance < 1 %>
<%= t 'user.view.m away', :count => (distance * 1000).round %>
<% else %>
<%= t 'user.view.km away', :count => distance.round %>
<% end %>
</td>
<td class="message">(<%= link_to t('user.view.send message'), :controller => 'message', :action => 'new', :display_name => nearby.display_name %>)</td>
</tr>
<% end %>
</table>
<% end %>
<% end %>
<% end %>
<br/>
<br/>
<% if @user and @this_user.id == @user.id %>
<%= link_to t('user.view.my_oauth_details'), :controller => 'oauth_clients', :action => 'index' %>
<div id="map" style="border: 1px solid black; position: relative; width: 400px; height: 400px; float: right;">
<% if @this_user.home_lat.nil? or @this_user.home_lon.nil? %>
<p style="position: absolute; top: 0; bottom: 0; width: 90%; height: 30%; margin: auto 5%">
<%= t 'user.view.if set location', :settings_link => (link_to t('user.view.settings_link_text'), :controller => 'user', :action => 'account', :display_name => @user.display_name) %>
</p>
<% else %>
<%= render :partial => 'map' %>
<% end %>
</div>
<% friends = @this_user.friends.collect { |f| f.befriendee } %>
<% nearby = @this_user.nearby - friends %>
<h3 style="margin-top: 0"><%= t 'user.view.your friends' %></h3>
<% if friends.empty? %>
<%= t 'user.view.no friends' %>
<% else %>
<table id="friends">
<%= render :partial => "contact", :collection => friends %>
</table>
<% end %>
<h3><%= t 'user.view.nearby users' %></h3>
<% if nearby.empty? %>
<%= t 'user.view.no nearby users' %>
<% else %>
<table id="nearbyusers">
<%= render :partial => "contact", :collection => nearby %>
</table>
<% end %>
<% end %>