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