Merge branch 'master' of github.com:diaspora/diaspora

This commit is contained in:
maxwell 2010-12-15 18:05:54 -08:00
commit d5ba34f245
15 changed files with 195 additions and 78 deletions

View file

@ -11,7 +11,7 @@ class AspectsController < ApplicationController
def index def index
@posts = current_user.visible_posts(:_type => "StatusMessage").paginate :page => params[:page], :per_page => 15, :order => 'created_at DESC' @posts = current_user.visible_posts(:_type => "StatusMessage").paginate :page => params[:page], :per_page => 15, :order => 'created_at DESC'
@post_hashes = hashes_for_posts @posts @post_hashes = hashes_for_posts @posts
@contacts = current_user.contacts(:pending => false) @contacts = Contact.all(:user_id => current_user.id, :pending => false)
@aspect_hashes = hashes_for_aspects @aspects.all, @contacts, :limit => 8 @aspect_hashes = hashes_for_aspects @aspects.all, @contacts, :limit => 8
@aspect = :all @aspect = :all
@ -62,7 +62,7 @@ class AspectsController < ApplicationController
unless @aspect unless @aspect
render :file => "#{Rails.root}/public/404.html", :layout => false, :status => 404 render :file => "#{Rails.root}/public/404.html", :layout => false, :status => 404
else else
@aspect_contacts = hashes_for_contacts @aspect.contacts(:pending => false) @aspect_contacts = hashes_for_contacts Contact.all(:user_id => current_user.id, :aspect_ids.in => [@aspect.id], :pending => false)
@aspect_contacts_count = @aspect_contacts.count @aspect_contacts_count = @aspect_contacts.count
@posts = @aspect.posts.find_all_by__type("StatusMessage", :order => 'created_at desc').paginate :page => params[:page], :per_page => 15 @posts = @aspect.posts.find_all_by__type("StatusMessage", :order => 'created_at desc').paginate :page => params[:page], :per_page => 15
@ -116,6 +116,12 @@ class AspectsController < ApplicationController
current_user.add_contact_to_aspect(@contact, @aspect) current_user.add_contact_to_aspect(@contact, @aspect)
else else
current_user.send_contact_request_to(@person, @aspect) current_user.send_contact_request_to(@person, @aspect)
contact = current_user.contact_for(@person)
if request = Request.from(@person).to(current_user).first
request.destroy
contact.update_attributes(:pending => false)
end
end end
flash.now[:notice] = I18n.t 'aspects.add_to_aspect.success' flash.now[:notice] = I18n.t 'aspects.add_to_aspect.success'

View file

@ -113,6 +113,22 @@ class PeopleController < ApplicationController
end end
end end
def share_with
@person = Person.find(params[:id].to_id)
@contact = current_user.contact_for(@person)
@aspects_with_person = []
if @contact
@aspects_with_person = @contact.aspects
end
@aspects_without_person = @aspects.reject do |aspect|
@aspects_with_person.include?(aspect)
end
render :layout => nil
end
private private
def hashes_for_posts posts def hashes_for_posts posts
post_ids = posts.map{|p| p.id} post_ids = posts.map{|p| p.id}

View file

@ -34,12 +34,12 @@ class Profile
validates_length_of :first_name, :maximum => 32 validates_length_of :first_name, :maximum => 32
validates_length_of :last_name, :maximum => 32 validates_length_of :last_name, :maximum => 32
before_save :strip_names before_save :strip_names
attr_accessible :first_name, :last_name, :image_url, :image_url_medium, attr_accessible :first_name, :last_name, :image_url, :image_url_medium,
:image_url_small, :birthday, :gender, :bio, :searchable, :date :image_url_small, :birthday, :gender, :bio, :searchable, :date
def person def person
self._parent_document self._parent_document
end end

View file

@ -37,23 +37,14 @@
= link_to "edit aspect membership", "#", :id=> "edit_contact_aspects" = link_to "edit aspect membership", "#", :id=> "edit_contact_aspects"
.edit{:class => ("hidden" if contact)} .edit{:class => ("hidden" if contact)}
.contact_list#aspects_list
%ul
- for aspect in aspects_with_person
%li{:data=>{:guid=>aspect.id}}
%span.name
= link_to aspect.name, aspect
.right
= aspect_membership_button(aspect.id, contact, person)
- for aspect in aspects_without_person = render :partial => 'people/share_with_pane',
%li{:data=>{:guid=>aspect.id}} :locals => {:person => person,
%span.name :contact => contact,
= link_to aspect.name, aspect :aspects_with_person => aspects_with_person,
.right :aspects_without_person => aspects_without_person}
= aspect_membership_button(aspect.id, contact, person)
.right
= link_to "done editing", "#", :id => "done_contact_aspects"
- if contact - if contact
.right
= link_to "done editing", "#", :id => "done_contact_aspects"
= link_to t('people.profile_sidebar.remove_contact'), person, :confirm => t('are_you_sure'), :method => :delete = link_to t('people.profile_sidebar.remove_contact'), person, :confirm => t('are_you_sure'), :method => :delete

View file

@ -4,22 +4,27 @@
%li.message{:id => person.id} %li.message{:id => person.id}
.right{:style=>"display:inline;"}
- if person.owner_id == current_user.id
= t('.thats_you')
- elsif contact && !contact.pending
= t('.already_connected')
- elsif (contact && contact.pending) || request
= t('.pending_request')
- else
- single_aspect_form ||= nil
= link_to "start sharing",
{:controller => "people",
:action => "share_with",
:id => person.id},
:class => 'button share_with_button'
= person_image_link(person) = person_image_link(person)
.content .content
%span.from %span.from
=person_link(person) =person_link(person)
.right{:style=>"display:inline;"}
- if person.owner_id == current_user.id
= t('.thats_you')
- elsif contact && !contact.pending
= t('.already_connected')
- elsif (contact && contact.pending) || request
= link_to t('.pending_request'), aspects_manage_path
- else
- single_aspect_form ||= nil
= render(:partial => request_partial(single_aspect_form), :locals => {:aspects => aspects, :destination_handle => person.diaspora_handle})
.info .info
= person.diaspora_handle = person.diaspora_handle

View file

@ -0,0 +1,20 @@
-# Copyright (c) 2010, Diaspora Inc. This file is
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
.contact_list#aspects_list
%ul
- for aspect in aspects_with_person
%li{:data=>{:guid=>aspect.id}}
%span.name
= link_to aspect.name, aspect
.right
= aspect_membership_button(aspect.id, contact, person)
- for aspect in aspects_without_person
%li{:data=>{:guid=>aspect.id}}
%span.name
= link_to aspect.name, aspect
.right
= aspect_membership_button(aspect.id, contact, person)

View file

@ -5,6 +5,9 @@
- content_for :page_title do - content_for :page_title do
= t('search') = t('search')
- content_for :head do
= include_javascripts :people
.span-24.last .span-24.last
- if params[:q].blank? - if params[:q].blank?
%h2 %h2
@ -17,7 +20,7 @@
.span-15.append-1 .span-15.append-1
- if @hashes.empty? - if @hashes.empty?
%p %p
=t('.no_one_found') =t('.no_one_found')

View file

@ -0,0 +1,18 @@
-# Copyright (c) 2010, Diaspora Inc. This file is
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
#share_with
.share_with_header
= person_image_link(@person, :size => :thumb_medium)
%h3
= "Start sharing with #{@person.name}"
%p
= "Once #{@person.first_name} accepts, you'll start seeing each other's posts on Diaspora"
= render :partial => 'share_with_pane',
:locals => {:person => @person,
:contact => @contact,
:aspects_with_person => @aspects_with_person,
:aspects_without_person => @aspects_without_person}

View file

@ -3,17 +3,17 @@
-# the COPYRIGHT file. -# the COPYRIGHT file.
%li.message{:data=>{:guid=>post.id}} %li.message{:data=>{:guid=>post.id}}
- if person.owner_id == current_user.id
.right.controls
- reshare_aspects = aspects_without_post(aspects, post)
- unless reshare_aspects.empty?
= render 'shared/reshare', :aspects => reshare_aspects, :post => post
= link_to t('delete'), status_message_path(post), :confirm => t('are_you_sure'), :method => :delete, :remote => true, :class => "delete"
= person_image_link(person, :size => :thumb_small) = person_image_link(person, :size => :thumb_small)
.content .content
.from .from
- if person.owner_id == current_user.id
.right
- reshare_aspects = aspects_without_post(aspects, post)
- unless reshare_aspects.empty?
= render 'shared/reshare', :aspects => reshare_aspects, :post => post
= link_to t('delete'), status_message_path(post), :confirm => t('are_you_sure'), :method => :delete, :remote => true, :class => "delete"
%h4 %h4
=person_link(person) =person_link(person)

View file

@ -28,6 +28,8 @@ javascripts:
- public/javascripts/vendor/jquery-ui-1.8.6.custom.min.js - public/javascripts/vendor/jquery-ui-1.8.6.custom.min.js
- public/javascripts/aspect-edit.js - public/javascripts/aspect-edit.js
- public/javascripts/contact-list.js - public/javascripts/contact-list.js
people:
- public/javascripts/contact-list.js
photos: photos:
- public/javascripts/photo-show.js - public/javascripts/photo-show.js

View file

@ -10,6 +10,10 @@ Diaspora::Application.routes.draw do
resources :notifications, :only => [:destroy, :index] resources :notifications, :only => [:destroy, :index]
resources :posts, :only => [:show], :path => '/p/' resources :posts, :only => [:show], :path => '/p/'
match '/people/share_with' => 'people#share_with', :as => 'share_with'
resources :people do resources :people do
resources :status_messages resources :status_messages
resources :photos resources :photos

View file

@ -3,7 +3,7 @@
* the COPYRIGHT file. * the COPYRIGHT file.
*/ */
var View = { var View = {
initialize: function() { initialize: function() {
/* Buttons */ /* Buttons */
$("input[type='submit']").addClass("button"); $("input[type='submit']").addClass("button");
@ -45,7 +45,7 @@ var View = {
$(this.newRequest.selector) $(this.newRequest.selector)
.live("submit", this.newRequest.submit); .live("submit", this.newRequest.submit);
/* Button fancyboxes */ /* Button fancyboxes */
$(this.fancyBoxButtons.selectors.join(", ")) $(this.fancyBoxButtons.selectors.join(", "))
.fancybox({ .fancybox({
'titleShow': false, 'titleShow': false,
@ -67,34 +67,35 @@ var View = {
.click(this.userMenu.removeFocus) .click(this.userMenu.removeFocus)
.click(this.reshareButton.removeFocus); .click(this.reshareButton.removeFocus);
}, },
addAspectButton: { addAspectButton: {
click: function() { click: function() {
$("#aspect_name").focus(); $("#aspect_name").focus();
}, },
selector: ".add_aspect_button" selector: ".add_aspect_button"
}, },
fancyBoxButtons: { fancyBoxButtons: {
selectors: [ selectors: [
".add_aspect_button", ".add_aspect_button",
".manage_aspect_contacts_button", ".manage_aspect_contacts_button",
".invite_user_button", ".invite_user_button",
".add_photo_button", ".add_photo_button",
".remove_person_button", ".remove_person_button",
".question_mark" ".question_mark",
".share_with_button"
] ]
}, },
debug: { debug: {
click: function() { click: function() {
$("#debug_more").toggle("fast"); $("#debug_more").toggle("fast");
}, },
selector: "#debug_info" selector: "#debug_info"
}, },
flashes: { flashes: {
animate: function() { animate: function() {
var $this = $(View.flashes.selector); var $this = $(View.flashes.selector);
$this.animate({ $this.animate({
top: 0 top: 0
@ -108,10 +109,10 @@ var View = {
gettingStarted: { gettingStarted: {
click: function() { click: function() {
var $this = $(this); var $this = $(this);
$this.animate({ $this.animate({
left: parseInt($this.css("left"), 30) === 0 ? -$this.outerWidth() : 0 left: parseInt($this.css("left"), 30) === 0 ? -$this.outerWidth() : 0
}, function() { }, function() {
$this.css("left", "1000px"); $this.css("left", "1000px");
}); });
}, },
@ -120,7 +121,7 @@ var View = {
newRequest: { newRequest: {
submit: function() { submit: function() {
$(this).hide().parent().find(".message").removeClass("hidden"); $(this).hide().parent().find(".message").removeClass("hidden");
}, },
selector: ".new_request" selector: ".new_request"
}, },
@ -135,18 +136,18 @@ var View = {
}, },
search: { search: {
blur: function() { blur: function() {
$(this).removeClass("active"); $(this).removeClass("active");
}, },
focus: function() { focus: function() {
$(this).addClass("active"); $(this).addClass("active");
}, },
selector: "#q" selector: "#q"
}, },
tooltips: { tooltips: {
addAspect: { addAspect: {
bind: function() { bind: function() {
$(".add_aspect_button", "#aspect_nav").tipsy({ $(".add_aspect_button", "#aspect_nav").tipsy({
gravity:"w" gravity:"w"
}); });
@ -154,7 +155,7 @@ var View = {
}, },
avatars: { avatars: {
bind: function() { bind: function() {
$("#left_pane img.avatar, #manage_aspect_zones img.avatar").tipsy({ $("#left_pane img.avatar, #manage_aspect_zones img.avatar").tipsy({
live: true live: true
}); });
@ -162,7 +163,7 @@ var View = {
}, },
public_badge: { public_badge: {
bind: function() { bind: function() {
$(".public_badge img").tipsy({ $(".public_badge img").tipsy({
live: true live: true
}); });
@ -170,7 +171,7 @@ var View = {
}, },
whatIsThis: { whatIsThis: {
bind: function() { bind: function() {
$(".what_is_this").tipsy({ $(".what_is_this").tipsy({
live: true, live: true,
delayIn: 400 delayIn: 400
@ -178,9 +179,9 @@ var View = {
} }
}, },
bindAll: function() { bindAll: function() {
for(var element in this) { for(var element in this) {
if(element !== "bindAll") { if(element !== "bindAll") {
this[element].bind(); this[element].bind();
} }
}; };
@ -197,10 +198,10 @@ var View = {
}, },
userMenu: { userMenu: {
click: function() { click: function() {
$(this).toggleClass("active"); $(this).toggleClass("active");
}, },
removeFocus: function(evt) { removeFocus: function(evt) {
var $target = $(evt.target); var $target = $(evt.target);
if(!$target.closest("#user_menu").length) { if(!$target.closest("#user_menu").length) {
$(View.userMenu.selector).removeClass("active"); $(View.userMenu.selector).removeClass("active");
@ -210,7 +211,7 @@ var View = {
}, },
webFingerForm: { webFingerForm: {
submit: function(evt) { submit: function(evt) {
$(evt.currentTarget).siblings("#loader").show(); $(evt.currentTarget).siblings("#loader").show();
$("#request_result li:first").hide(); $("#request_result li:first").hide();
}, },
@ -218,7 +219,7 @@ var View = {
} }
}; };
$(function() { $(function() {
/* Make sure this refers to View, not the document */ /* Make sure this refers to View, not the document */
View.initialize.apply(View); View.initialize.apply(View);
}); });

View file

@ -617,20 +617,22 @@ ul.comments
a a
:padding 3px :padding 3px
li.message .from .right li.message .right
:display none :display none
:position absolute :position absolute
:right 12px :right 12px
:font
:size 12px &.controls
:color #999
a
:color #999
:font :font
:weight normal :size 12px
&:hover :color #999
:text a
:decoration underline :color #999
:font
:weight normal
&:hover
:text
:decoration underline
li.message:hover li.message:hover
.right .right
@ -2041,3 +2043,22 @@ h3,h4
.aspect_badge .aspect_badge
:top -0.2em :top -0.2em
#share_with
:min-width 400px
:max-width 400px
.share_with_header
:min-height 100px
.avatar
:width 100px
:height 100px
:float left
h3,p
:padding
:left 120px
h3
:margin 0
#aspects_list
:height auto

View file

@ -227,6 +227,27 @@ describe AspectsController do
end end
describe "#add_to_aspect" do describe "#add_to_aspect" do
context 'with an incoming request' do
before do
@user3 = make_user
@user3.send_contact_request_to(@user.person, @user3.aspects.create(:name => "Walruses"))
end
it 'deletes the request' do
post 'add_to_aspect',
:format => 'js',
:person_id => @user3.person.id,
:aspect_id => @aspect1.id
Request.from(@user3).to(@user).first.should be_nil
end
it 'does not leave the contact pending' do
post 'add_to_aspect',
:format => 'js',
:person_id => @user3.person.id,
:aspect_id => @aspect1.id
@user.contact_for(@user3.person).should_not be_pending
end
end
context 'with a non-contact' do context 'with a non-contact' do
before do before do
@person = Factory(:person) @person = Factory(:person)

View file

@ -14,6 +14,15 @@ describe PeopleController do
sign_in :user, user sign_in :user, user
end end
describe '#share_with' do
before do
@person = Factory.create(:person)
end
it 'succeeds' do
get :share_with, :id => @person.id
response.should be_success
end
end
describe '#hashes_from_people' do describe '#hashes_from_people' do
before do before do
@everyone = [] @everyone = []
@ -127,14 +136,14 @@ describe PeopleController do
get :show, :id => user.id get :show, :id => user.id
response.should redirect_to people_path response.should redirect_to people_path
end end
it "renders the show page of a contact" do it "renders the show page of a contact" do
user2 = make_user user2 = make_user
connect_users(user, aspect, user2, user2.aspects.create(:name => 'Neuroscience')) connect_users(user, aspect, user2, user2.aspects.create(:name => 'Neuroscience'))
get :show, :id => user2.person.id get :show, :id => user2.person.id
response.should be_success response.should be_success
end end
it "renders the show page of a non-contact" do it "renders the show page of a non-contact" do
user2 = make_user user2 = make_user
get :show, :id => user2.person.id get :show, :id => user2.person.id