diff --git a/app/controllers/aspects_controller.rb b/app/controllers/aspects_controller.rb
index c6282b1ff..78b70a22f 100644
--- a/app/controllers/aspects_controller.rb
+++ b/app/controllers/aspects_controller.rb
@@ -57,10 +57,17 @@ class AspectsController < ApplicationController
redirect_to :back
elsif request.env['HTTP_REFERER'].include?("aspects/manage")
redirect_to :back
- elsif params[:aspect][:share_with]
- @contact = Contact.where(:id => params[:aspect][:contact_id]).first
+ elsif params[:aspect][:person_id]
@person = Person.where(:id => params[:aspect][:person_id]).first
- @contact = current_user.contact_for(@person) || Contact.new
+
+ if @contact = current_user.contact_for(@person)
+ @contact.aspects << @aspect
+ else
+ @contact = current_user.share_with(@person, @aspect)
+ end
+
+
+
else
respond_with @aspect
end
diff --git a/app/helpers/aspect_global_helper.rb b/app/helpers/aspect_global_helper.rb
index 65ecc4b12..361ee173f 100644
--- a/app/helpers/aspect_global_helper.rb
+++ b/app/helpers/aspect_global_helper.rb
@@ -81,4 +81,14 @@ module AspectGlobalHelper
aspects_path
end
end
-end
\ No newline at end of file
+
+ def aspect_dropdown_list_item(aspect, contact, person)
+ checked = contact.persisted? && aspect.contacts.include?(contact) ? "checked=\"checked\"" : ""
+ str = "
"
+ str << ""
+ str << aspect.name
+ str << ""
+ str << aspect_membership_button(aspect, contact, person)
+ str.html_safe
+ end
+end
diff --git a/app/views/aspects/create.js.erb b/app/views/aspects/create.js.erb
index 68e98c38c..c6402dead 100644
--- a/app/views/aspects/create.js.erb
+++ b/app/views/aspects/create.js.erb
@@ -1,3 +1,2 @@
-$('#aspects_list ul').append("<%= escape_javascript( render('aspects/aspect_list_item', :aspect => @aspect, :person => @person, :contact => @contact)) %>");
-$("#aspects_list ul li[data-guid='<%= @aspect.id %>'] .add.button").click();
+$('ul.dropdown_list[data-person_id=<%= @person.id %>] .newItem').before("<%= escape_javascript( render('contacts/aspect_dropdown_list_item', :aspect => @aspect, :person => @person, :contact => @contact)) %>");
diff --git a/app/views/contacts/_aspect_dropdown.html.haml b/app/views/contacts/_aspect_dropdown.html.haml
index 799bf50d2..bbb3ce58a 100644
--- a/app/views/contacts/_aspect_dropdown.html.haml
+++ b/app/views/contacts/_aspect_dropdown.html.haml
@@ -8,12 +8,21 @@
▼
.wrapper
- %ul.dropdown_list{:unSelectable => 'on'}
+ %ul.dropdown_list{:unSelectable => 'on', 'data-person_id' => ((@person.id) if @person)}
- for aspect in @all_aspects
- %li{:data => {:aspect_id => aspect.id}}
- = check_box_tag "in_aspect", "in_aspect", (contact.persisted? && aspect.contacts.include?(contact))
- = aspect.name
-
- .hidden
- = aspect_membership_button(aspect, contact, person)
+ = aspect_dropdown_list_item(aspect, contact, person)
+
+ %li.newItem
+ .add_aspect
+ = form_for(Aspect.new, :remote => true) do |aspect|
+ = aspect.error_messages
+ = aspect.hidden_field :person_id, :value => person.id if person
+ = aspect.hidden_field :share_with, :value => true
+ %p
+ = aspect.text_field :name, :style => "display:inline;"
+ %p.checkbox_select
+ = aspect.label :contacts_visible, t('aspects.edit.make_aspect_list_visible')
+ = aspect.check_box :contacts_visible, :checked => true, :default => true
+ .right
+ = aspect.submit t('contacts.share_with_pane.add_new_aspect'), :class => 'button'
diff --git a/app/views/contacts/_aspect_dropdown_list_item.haml b/app/views/contacts/_aspect_dropdown_list_item.haml
new file mode 100644
index 000000000..d7508aa0c
--- /dev/null
+++ b/app/views/contacts/_aspect_dropdown_list_item.haml
@@ -0,0 +1,6 @@
+-# Copyright (c) 2011, Diaspora Inc. This file is
+-# licensed under the Affero General Public License version 3 or later. See
+-# the COPYRIGHT file.
+
+= aspect_dropdown_list_item(aspect, contact, person)
+
diff --git a/public/javascripts/contact-edit.js b/public/javascripts/contact-edit.js
index 78208e2f9..57effc149 100644
--- a/public/javascripts/contact-edit.js
+++ b/public/javascripts/contact-edit.js
@@ -11,13 +11,14 @@
}
};
var processClick = function(li, evt){
+ var button = li.find('.button');
+ if(button.hasClass('disabled') || li.hasClass('newItem')){ return; }
evt.preventDefault();
- if(li.find('.button').hasClass('disabled')){ return; }
var checkbox = li.find('input[type=checkbox]');
toggleCheckbox(checkbox);
- $.fn.callRemote.apply(li.find(".button"));
+ $.fn.callRemote.apply(button);
};
$(document).ready(function(){
diff --git a/spec/controllers/aspects_controller_spec.rb b/spec/controllers/aspects_controller_spec.rb
index 61a8bd917..5079d8a26 100644
--- a/spec/controllers/aspects_controller_spec.rb
+++ b/spec/controllers/aspects_controller_spec.rb
@@ -221,6 +221,26 @@ describe AspectsController do
post :create, "aspect" => {"name" => "new aspect"}
response.should redirect_to(aspect_path(Aspect.find_by_name("new aspect")))
end
+
+ context "with person_id param" do
+ it "creates a contact if one does not already exist" do
+ lambda {
+ post :create, :format => 'js', :aspect => {:name => "new", :person_id => eve.person.id}
+ }.should change{
+ alice.contacts.count
+ }.by(1)
+ end
+
+ it "adds a new contact to the new aspect" do
+ post :create, :format => 'js', :aspect => {:name => "new", :person_id => eve.person.id}
+ alice.aspects.find_by_name("new").contacts.count.should == 1
+ end
+
+ it "adds an existing contact to the new aspect" do
+ post :create, :format => 'js', :aspect => {:name => "new", :person_id => bob.person.id}
+ alice.aspects.find_by_name("new").contacts.count.should == 1
+ end
+ end
end
context "with invalid params" do
it "does not create an aspect" do