From 178fba7b303a18d8e17ec8e9e95bc554e51046f3 Mon Sep 17 00:00:00 2001 From: Benjamin Meichsner Date: Sun, 2 Aug 2009 19:41:09 +0200 Subject: [PATCH] Create restful invites controller and ajaxified the workflow. --- app/controllers/foodcoop_controller.rb | 20 ---------------- app/controllers/invites_controller.rb | 26 +++++++++++++++++++++ app/models/invite.rb | 4 +--- app/views/foodcoop/invite.haml | 14 ----------- app/views/invites/_new.html.haml | 16 +++++++++++++ app/views/invites/_success.html.haml | 7 ++++++ app/views/shared/memberships/_members.rhtml | 4 +++- config/routes.rb | 2 ++ public/stylesheets/main.css | 14 +++++------ public/stylesheets/print.css | 14 +++++------ test/functional/invites_controller_test.rb | 20 ++++++++++++++++ 11 files changed, 89 insertions(+), 52 deletions(-) delete mode 100644 app/controllers/foodcoop_controller.rb create mode 100644 app/controllers/invites_controller.rb delete mode 100644 app/views/foodcoop/invite.haml create mode 100644 app/views/invites/_new.html.haml create mode 100644 app/views/invites/_success.html.haml create mode 100644 test/functional/invites_controller_test.rb diff --git a/app/controllers/foodcoop_controller.rb b/app/controllers/foodcoop_controller.rb deleted file mode 100644 index f56897a9..00000000 --- a/app/controllers/foodcoop_controller.rb +++ /dev/null @@ -1,20 +0,0 @@ -class FoodcoopController < ApplicationController - - before_filter :authenticate_membership_or_admin - - # Invites a new user to join foodsoft in this group. - def invite - @invite = Invite.new - end - - # Sends an email - def send_invitation - @invite = Invite.new(:user => @current_user, :group => @group, :email => params[:invite][:email]) - if @invite.save - flash[:notice] = format('Es wurde eine Einladung an %s geschickt.', @invite.email) - redirect_to root_path - else - render :action => 'invite' - end - end -end diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb new file mode 100644 index 00000000..d4ef712d --- /dev/null +++ b/app/controllers/invites_controller.rb @@ -0,0 +1,26 @@ +class InvitesController < ApplicationController + + before_filter :authenticate_membership_or_admin, :only => [:new] + #TODO: auhtorize also for create action. + + def new + @invite = Invite.new(:user => @current_user, :group => @group) + + render :update do |page| + page.replace_html :edit_box, :partial => "new" + page.show :edit_box + end + end + + def create + @invite = Invite.new(params[:invite]) + + render :update do |page| + if @invite.save + page.replace_html :edit_box, :partial => "success" + else + page.replace_html :edit_box, :partial => "new" + end + end + end +end diff --git a/app/models/invite.rb b/app/models/invite.rb index 588dfeb7..470d5396 100644 --- a/app/models/invite.rb +++ b/app/models/invite.rb @@ -23,9 +23,7 @@ class Invite < ActiveRecord::Base validates_presence_of :group validates_presence_of :token validates_presence_of :expires_at - - attr_accessible :email, :user, :group - + protected # Before validation, set token and expires_at. diff --git a/app/views/foodcoop/invite.haml b/app/views/foodcoop/invite.haml deleted file mode 100644 index b224069e..00000000 --- a/app/views/foodcoop/invite.haml +++ /dev/null @@ -1,14 +0,0 @@ -- title "Neues Foodcoop-Mitglied einladen" - -%p - Hier kannst du eine Person in die Gruppe - %b=h @group.name - einladen, die noch nicht Mitglied der Foodcoop ist. -.edit_form{:style => 'width:35em'} - - form_for(@invite, :url => {:action => 'send_invitation', :id => @group}) do |form| - = form.error_messages - %p - Email-Adresse: - = form.text_field('email', :size => 40, :maxlength => 128) - %p - = submit_tag('Einladung abschicken') diff --git a/app/views/invites/_new.html.haml b/app/views/invites/_new.html.haml new file mode 100644 index 00000000..ddf78c65 --- /dev/null +++ b/app/views/invites/_new.html.haml @@ -0,0 +1,16 @@ +%p + Hier kannst du eine Person in die Gruppe + %b=h @invite.group.name + einladen, die noch nicht Mitglied der Foodcoop ist. +.edit_form{:style => 'width:35em'} + - remote_form_for @invite do |form| + = form.error_messages :header_message => nil + = form.hidden_field :user_id + = form.hidden_field :group_id + %p + Email-Adresse: + = form.text_field :email, :size => 40, :maxlength => 128 + %p + = submit_tag('Einladung abschicken') + oder + = link_to_function "Abbrechen", "Element.hide('edit_box')" diff --git a/app/views/invites/_success.html.haml b/app/views/invites/_success.html.haml new file mode 100644 index 00000000..99bd9132 --- /dev/null +++ b/app/views/invites/_success.html.haml @@ -0,0 +1,7 @@ +%p + %b= @invite.email + wurde erfolgreich eingeladen. +%p + = link_to_function "Schließen", "Element.hide('edit_box')" + oder + = remote_link_to "Weitere Person einladen", :url => new_invite_path(:id => @invite.group) \ No newline at end of file diff --git a/app/views/shared/memberships/_members.rhtml b/app/views/shared/memberships/_members.rhtml index 0e55b937..7934285d 100644 --- a/app/views/shared/memberships/_members.rhtml +++ b/app/views/shared/memberships/_members.rhtml @@ -2,7 +2,7 @@

Hier kannst Du die Mitglieder der Gruppe verwalten oder ein neues Foodcoop-Mitglied in die Gruppe - <%= link_to('einladen', :controller => '/foodcoop', :action => 'invite', :id => @group) %>. + <%= remote_link_to('einladen', :url => new_invite_path(:id => @group)) %>.

@@ -22,3 +22,5 @@ <%= link_to('Person einladen', :controller => '/foodcoop', :action => 'invite', :id => @group) %>
+ + diff --git a/config/routes.rb b/config/routes.rb index 764af184..f8caba4a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -10,6 +10,8 @@ ActionController::Routing::Routes.draw do |map| map.resources :messages, :only => [:index, :show, :new, :create], :member => { :reply => :get, :user => :get, :group => :get } + map.resources :invites, :only => [:new, :create] + map.namespace :foodcoop do |foodcoop| foodcoop.root :controller => "users", :action => "index" foodcoop.resources :users, :only => [:index] diff --git a/public/stylesheets/main.css b/public/stylesheets/main.css index db2dbd7e..b73b68b1 100644 --- a/public/stylesheets/main.css +++ b/public/stylesheets/main.css @@ -161,31 +161,31 @@ span.click-me { background: #f5f5f5; padding: 0 10px 0px 5px; float: left; } - .menu ul, #start_nav ul { + .menu ul, #start_nav ul { list-style-type: none; margin: 0 0 0.2em 0; padding: 0; } - .menu ul li, #start_nav ul li { + .menu ul li, #start_nav ul li { border-bottom: 1px solid #dedede; color: #666; margin: 0.8em 0 0 0; font-weight: bold; } - .menu ul li a:link, .menu ul li a:visited, #start_nav ul li a:link, #start_nav ul li a:visited { + .menu ul li a:link, .menu ul li a:visited, #start_nav ul li a:link, #start_nav ul li a:visited { display: block; padding: 0.25em 1em; text-decoration: none; width: 12em; } - .menu ul li a:hover, .menu ul li a:focus, #start_nav ul li a:hover, #start_nav ul li a:focus { + .menu ul li a:hover, .menu ul li a:focus, #start_nav ul li a:hover, #start_nav ul li a:focus { background-color: #e3e3e3; } - .menu ul li ul, #start_nav ul li ul { + .menu ul li ul, #start_nav ul li ul { margin: 0; padding: 0; } - .menu ul li ul li, #start_nav ul li ul li { + .menu ul li ul li, #start_nav ul li ul li { border-top: 1px solid #dedede; border-bottom: none; margin: 0; font-weight: normal; } - .menu ul li ul li a:link, .menu ul li ul li a:visited, #start_nav ul li ul li a:link, #start_nav ul li ul li a:visited { + .menu ul li ul li a:link, .menu ul li ul li a:visited, #start_nav ul li ul li a:link, #start_nav ul li ul li a:visited { width: 11.5em; padding: 0 1em 0.1em 1.5em; font-weight: normal; diff --git a/public/stylesheets/print.css b/public/stylesheets/print.css index 14afed69..643d62c9 100644 --- a/public/stylesheets/print.css +++ b/public/stylesheets/print.css @@ -161,31 +161,31 @@ span.click-me { background: #f5f5f5; padding: 0 10px 0px 5px; float: left; } - .menu ul, #start_nav ul { + .menu ul, #start_nav ul { list-style-type: none; margin: 0 0 0.2em 0; padding: 0; } - .menu ul li, #start_nav ul li { + .menu ul li, #start_nav ul li { border-bottom: 1px solid #dedede; color: #666; margin: 0.8em 0 0 0; font-weight: bold; } - .menu ul li a:link, .menu ul li a:visited, #start_nav ul li a:link, #start_nav ul li a:visited { + .menu ul li a:link, .menu ul li a:visited, #start_nav ul li a:link, #start_nav ul li a:visited { display: block; padding: 0.25em 1em; text-decoration: none; width: 12em; } - .menu ul li a:hover, .menu ul li a:focus, #start_nav ul li a:hover, #start_nav ul li a:focus { + .menu ul li a:hover, .menu ul li a:focus, #start_nav ul li a:hover, #start_nav ul li a:focus { background-color: #e3e3e3; } - .menu ul li ul, #start_nav ul li ul { + .menu ul li ul, #start_nav ul li ul { margin: 0; padding: 0; } - .menu ul li ul li, #start_nav ul li ul li { + .menu ul li ul li, #start_nav ul li ul li { border-top: 1px solid #dedede; border-bottom: none; margin: 0; font-weight: normal; } - .menu ul li ul li a:link, .menu ul li ul li a:visited, #start_nav ul li ul li a:link, #start_nav ul li ul li a:visited { + .menu ul li ul li a:link, .menu ul li ul li a:visited, #start_nav ul li ul li a:link, #start_nav ul li ul li a:visited { width: 11.5em; padding: 0 1em 0.1em 1.5em; font-weight: normal; diff --git a/test/functional/invites_controller_test.rb b/test/functional/invites_controller_test.rb new file mode 100644 index 00000000..59d4748f --- /dev/null +++ b/test/functional/invites_controller_test.rb @@ -0,0 +1,20 @@ +require 'test_helper' + +class InvitesControllerTest < ActionController::TestCase + def test_new + get :new + assert_template 'new' + end + + def test_create_invalid + Invite.any_instance.stubs(:valid?).returns(false) + post :create + assert_template 'new' + end + + def test_create_valid + Invite.any_instance.stubs(:valid?).returns(true) + post :create + assert_redirected_to root_url + end +end