diff --git a/app/controllers/members_controller.rb b/app/controllers/members_controller.rb index d84b2ff4..ad585bb4 100644 --- a/app/controllers/members_controller.rb +++ b/app/controllers/members_controller.rb @@ -2,11 +2,11 @@ class MembersController < ApplicationController before_action :authenticate_user! def destroy - find_member + @member = Member.find(params[:id]) toggle_active_posts @member.destroy - redirect_to manage_users_path + redirect_to request.referer.include?(organizations_path) ? organizations_path : manage_users_path end def toggle_manager diff --git a/app/controllers/organizations_controller.rb b/app/controllers/organizations_controller.rb index 42eae556..01389658 100644 --- a/app/controllers/organizations_controller.rb +++ b/app/controllers/organizations_controller.rb @@ -2,7 +2,12 @@ class OrganizationsController < ApplicationController before_action :load_resource, only: [:show, :edit, :update, :set_current] def index - organizations = Organization.all + if current_user + user_organizations = Organization.left_outer_joins(:petitions).where(petitions: { user_id: current_user.id }) + @user_organizations = user_organizations.or(Organization.where(id: current_user.organizations.pluck(:id))).distinct + end + + organizations = Organization.where.not(id: @user_organizations&.pluck(:id)) organizations = organizations.search_by_query(params[:q]) if params[:q].present? @organizations = organizations.page(params[:page]).per(25) end diff --git a/app/controllers/petitions_controller.rb b/app/controllers/petitions_controller.rb index c19ccea5..4ddb81cd 100644 --- a/app/controllers/petitions_controller.rb +++ b/app/controllers/petitions_controller.rb @@ -10,11 +10,11 @@ def create redirect_to organizations_path end - + def update petition = Petition.find params[:id] status = params[:status] - + if petition.update(status: status) User.find(params[:user_id]).add_to_organization(current_organization) if status == 'accepted' flash[:notice] = "Application #{status}" @@ -24,7 +24,7 @@ def update redirect_to manage_petitions_path end - + def manage @status = params[:status] || 'pending' @users = User.joins(:petitions).where(petitions: { organization_id: current_organization.id, status: @status }).page(params[:page]).per(20) diff --git a/app/models/user.rb b/app/models/user.rb index d1470032..fd1ba040 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -124,4 +124,8 @@ def has_valid_email? def email_if_real has_valid_email? ? email : "" end + + def was_member?(petition) + petition.status == 'accepted' && Member.where(organization: petition.organization, user: self).none? + end end diff --git a/app/views/application/menus/_user_admin_menu_items.html.erb b/app/views/application/menus/_user_admin_menu_items.html.erb index b145ff05..f2d10c9b 100644 --- a/app/views/application/menus/_user_admin_menu_items.html.erb +++ b/app/views/application/menus/_user_admin_menu_items.html.erb @@ -21,6 +21,13 @@ <% end %> +
  • + <%= link_to organizations_path do %> + <%= glyph :list %> + Manage memberships + <% end %> +
  • + <% current_user.members.where(manager: true).each do |m| %>
  • <%= link_to m.organization do %> diff --git a/app/views/organizations/_organizations_row.html.erb b/app/views/organizations/_organizations_row.html.erb new file mode 100644 index 00000000..232eb231 --- /dev/null +++ b/app/views/organizations/_organizations_row.html.erb @@ -0,0 +1,24 @@ + + <%= link_to(org.name, org) %> + <%= org.city %> + <%= org.neighborhood %> + <%= link_to(org.web, org.web) if org.web.present? %> + <%= org.members.count %> + + <% if current_user %> + <% petition = current_user.petitions.where(organization_id: org.id).last %> + + <% if member = Member.where(user: current_user, organization: org).first %> + <%= link_to 'Delete membership', + member, + method: :delete, + data: { confirm: "Are you sure you want to delete your membership from #{org.name}?" }, + class: 'btn btn-danger' %> + <% elsif petition && !current_user.was_member?(petition) %> + <%= petition.status %> + <% else %> + <%= link_to 'Apply to join', petitions_path(user_id: current_user.id, organization_id: org.id, status: 'pending'), method: :post %> + <% end %> + <% end %> + + diff --git a/app/views/organizations/index.html.erb b/app/views/organizations/index.html.erb index 0e4a29d6..64082bf5 100644 --- a/app/views/organizations/index.html.erb +++ b/app/views/organizations/index.html.erb @@ -31,24 +31,8 @@ - <% @organizations.each do |org| %> - - <%= link_to(org.name, org) %> - <%= org.city %> - <%= org.neighborhood %> - <%= link_to(org.web, org.web) if org.web.present? %> - <%= org.members.count %> - - <% if current_user %> - <% if petition = current_user.petitions.where(organization_id: org.id).last %> - <%= petition.status %> - <% else %> - <%= link_to 'Apply to join', petitions_path(user_id: current_user.id, organization_id: org.id, status: 'pending'), method: :post %> - <% end %> - <% end %> - - - <% end %> + <%= render partial: 'organizations_row', collection: @user_organizations, as: :org if !params[:page] || params[:page] == '1' %> + <%= render partial: 'organizations_row', collection: @organizations, as: :org %>