diff --git a/app/controllers/family_memberships_controller.rb b/app/controllers/family_memberships_controller.rb index 307cf5d4..e6d63ed3 100644 --- a/app/controllers/family_memberships_controller.rb +++ b/app/controllers/family_memberships_controller.rb @@ -4,17 +4,7 @@ class FamilyMembershipsController < ApplicationController before_action :authenticate_user! before_action :ensure_family_feature_enabled! before_action :set_family - before_action :set_membership, only: %i[show destroy] - - def index - authorize @family, :show? - - @members = @family.members.includes(:family_membership) - end - - def show - authorize @membership, :show? - end + before_action :set_membership, only: %i[destroy] def destroy authorize @membership diff --git a/app/views/families/show.html.erb b/app/views/families/show.html.erb index 3ab4bab5..1cbde3e1 100644 --- a/app/views/families/show.html.erb +++ b/app/views/families/show.html.erb @@ -51,10 +51,6 @@ <%= t('families.show.members_title', default: 'Family Members') %> (<%= @members.count %>) - <%= link_to family_members_path(@family), - class: "text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300 text-sm font-medium" do %> - <%= t('families.show.manage_members', default: 'Manage') %> - <% end %>
diff --git a/app/views/family_memberships/index.html.erb b/app/views/family_memberships/index.html.erb deleted file mode 100644 index 0743d298..00000000 --- a/app/views/family_memberships/index.html.erb +++ /dev/null @@ -1,168 +0,0 @@ -
-
- -
-
-
-

- Family Members -

-

- Manage members of <%= @family.name %> -

-
- - <%= link_to family_path(@family), - class: "bg-gray-200 hover:bg-gray-300 dark:bg-gray-600 dark:hover:bg-gray-500 text-gray-700 dark:text-gray-200 px-4 py-2 rounded-md font-medium transition-colors duration-200" do %> - ← Back to Family - <% end %> -
-
- - -
-
-

- All Members (<%= @members.count %>) -

-
- -
- <% @members.each do |member| %> -
-
- -
-
-
- - <%= member.email.first.upcase %> - -
-
- -
-
-

- <%= member.email %> -

- - <% if member.family_membership.role == 'owner' %> - - Owner - - <% else %> - - <%= member.family_membership.role.humanize %> - - <% end %> - - <% if member == current_user %> - - You - - <% end %> -
- -
-

- Joined <%= member.family_membership.created_at.strftime('%B %d, %Y') %> -

- - <% if member.family_membership.role == 'owner' %> -

- Created this family -

- <% end %> -
-
-
- - -
- <%= link_to family_member_path(@family, member.family_membership), - class: "text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300 text-sm font-medium" do %> - View - <% end %> - - <% if policy(member.family_membership).destroy? %> - <% if !member.family_membership.owner? %> - <%= link_to family_member_path(@family, member.family_membership), - method: :delete, - confirm: "Are you sure you want to remove #{member.email} from the family?", - class: "text-red-600 hover:text-red-800 dark:text-red-400 dark:hover:text-red-300 text-sm font-medium" do %> - Remove - <% end %> - <% end %> - <% end %> -
-
-
- <% end %> -
-
- - -
-
-
-
- - - -
-
-
-
- Total Members -
-
- <%= @members.count %> -
-
-
-
-
- -
-
-
- - - -
-
-
-
- Active Members -
-
- <%= @members.count %> -
-
-
-
-
- -
-
-
- - - -
-
-
-
- Family Age -
-
- <%= time_ago_in_words(@family.created_at) %> -
-
-
-
-
-
-
-
diff --git a/app/views/family_memberships/show.html.erb b/app/views/family_memberships/show.html.erb deleted file mode 100644 index dfb5c192..00000000 --- a/app/views/family_memberships/show.html.erb +++ /dev/null @@ -1,202 +0,0 @@ -
-
- -
-
-
-
- - <%= @membership.user.email.first.upcase %> - -
- -
-

- <%= @membership.user.email %> -

-
- <% if @membership.role == 'owner' %> - - Family Owner - - <% else %> - - <%= @membership.role.humanize %> - - <% end %> - - <% if @membership.user == current_user %> - - You - - <% end %> -
-
-
- -
- <%= link_to family_members_path(@family), - class: "bg-gray-200 hover:bg-gray-300 dark:bg-gray-600 dark:hover:bg-gray-500 text-gray-700 dark:text-gray-200 px-4 py-2 rounded-md font-medium transition-colors duration-200" do %> - ← All Members - <% end %> - - <% if policy(@membership).destroy? && !@membership.owner? %> - <%= link_to family_member_path(@family, @membership), - method: :delete, - confirm: "Are you sure you want to remove #{@membership.user.email} from the family?", - class: "bg-red-600 hover:bg-red-700 dark:bg-red-500 dark:hover:bg-red-600 text-white px-4 py-2 rounded-md font-medium transition-colors duration-200" do %> - Remove Member - <% end %> - <% end %> -
-
-
- - -
- -
-

- Basic Information -

- -
-
-
- Email Address -
-
<%= @membership.user.email %>
-
- -
-
- Family Role -
-
- <%= @membership.role.humanize %> - <% if @membership.role == 'owner' %> - - - Can manage family settings and members - - <% end %> -
-
- -
-
- Joined Date -
-
- <%= @membership.created_at.strftime('%B %d, %Y at %I:%M %p') %> -
-
- -
-
- Time in Family -
-
- <%= time_ago_in_words(@membership.created_at) %> -
-
-
-
- - -
-

- Family Information -

- -
-
-
- Family Name -
-
<%= @family.name %>
-
- -
-
- Family Creator -
-
<%= @family.creator.email %>
-
- -
-
- Family Created -
-
- <%= @family.created_at.strftime('%B %d, %Y') %> -
-
- -
-
- Total Members -
-
- <%= pluralize(@family.members.count, 'member') %> -
-
-
-
-
- - -
- - <% if @membership.owner? %> -
-
-
- - - -
-
-

- Family Owner Protection -

-
-

- Family owners cannot remove their own membership. To leave the family, the owner must delete the entire family instead. -

-
-
-
-
- <% end %> - - - <% if @membership.user == current_user %> -
-
-
- - - -
-
-

- Your Membership -

-
-

- This is your own membership. <% if @membership.owner? %>As the owner, you can delete the family to leave it.<% else %>You can leave the family at any time from the family page.<% end %> -

-
-
- <%= link_to family_path(@family), - class: "text-blue-800 hover:text-blue-900 dark:text-blue-200 dark:hover:text-blue-100 font-medium" do %> - Go to Family Page → - <% end %> -
-
-
-
- <% end %> -
-
-
\ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 23cc97a2..3807ac51 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -69,7 +69,7 @@ Rails.application.routes.draw do post :accept end end - resources :members, only: %i[index show destroy], controller: 'family_memberships' + resources :members, only: %i[destroy], controller: 'family_memberships' end # Public family invitation acceptance (no auth required) diff --git a/spec/requests/family_memberships_spec.rb b/spec/requests/family_memberships_spec.rb index b65e1041..d90bd7f8 100644 --- a/spec/requests/family_memberships_spec.rb +++ b/spec/requests/family_memberships_spec.rb @@ -15,70 +15,6 @@ RSpec.describe 'Family Memberships', type: :request do sign_in user end - describe 'GET /families/:family_id/members' do - it 'shows all family members' do - get "/families/#{family.id}/members" - expect(response).to have_http_status(:ok) - end - - context 'when user is not in the family' do - let(:outsider) { create(:user) } - - before { sign_in outsider } - - it 'redirects to families index' do - get "/families/#{family.id}/members" - expect(response).to redirect_to(families_path) - end - end - - context 'when not authenticated' do - before { sign_out user } - - it 'redirects to login' do - get "/families/#{family.id}/members" - expect(response).to redirect_to(new_user_session_path) - end - end - end - - describe 'GET /families/:family_id/members/:id' do - it 'shows a specific membership' do - get "/families/#{family.id}/members/#{member_membership.id}" - expect(response).to have_http_status(:ok) - end - - context 'when membership does not belong to the family' do - let(:other_family) { create(:family) } - let(:other_membership) { create(:family_membership, family: other_family) } - - it 'returns not found' do - get "/families/#{family.id}/members/#{other_membership.id}" - expect(response).to have_http_status(:not_found) - end - end - - context 'when user is not in the family' do - let(:outsider) { create(:user) } - - before { sign_in outsider } - - it 'redirects to families index' do - get "/families/#{family.id}/members/#{member_membership.id}" - expect(response).to redirect_to(families_path) - end - end - - context 'when not authenticated' do - before { sign_out user } - - it 'redirects to login' do - get "/families/#{family.id}/members/#{member_membership.id}" - expect(response).to redirect_to(new_user_session_path) - end - end - end - describe 'DELETE /families/:family_id/members/:id' do context 'when removing a regular member' do it 'removes the member from the family' do @@ -170,23 +106,6 @@ RSpec.describe 'Family Memberships', type: :request do end end - context 'when member views another member' do - before { sign_in member_user } - - it 'allows viewing membership' do - get "/families/#{family.id}/members/#{owner_membership.id}" - expect(response).to have_http_status(:ok) - end - end - - context 'when member views members list' do - before { sign_in member_user } - - it 'allows viewing members list' do - get "/families/#{family.id}/members" - expect(response).to have_http_status(:ok) - end - end end describe 'member removal workflow' do diff --git a/spec/requests/family_workflows_spec.rb b/spec/requests/family_workflows_spec.rb index bf448b9f..4832d20f 100644 --- a/spec/requests/family_workflows_spec.rb +++ b/spec/requests/family_workflows_spec.rb @@ -79,12 +79,9 @@ RSpec.describe 'Family Workflows', type: :request do expect(user3.reload.family).to eq(family) expect(family.reload.members.count).to eq(3) - # Step 6: Family owner views and manages members + # Step 6: Family owner views members on family show page sign_in user1 - get "/families/#{family.id}/members" - expect(response).to have_http_status(:ok) - - get "/families/#{family.id}/members/#{user2.family_membership.id}" + get "/families/#{family.id}" expect(response).to have_http_status(:ok) # Step 7: Owner removes a member @@ -257,9 +254,6 @@ RSpec.describe 'Family Workflows', type: :request do sign_in user3 get "/families/#{family.id}" expect(response).to redirect_to(families_path) - - get "/families/#{family.id}/members" - expect(response).to redirect_to(families_path) end end