mirror of
https://github.com/discourse/discourse.git
synced 2026-08-06 09:05:23 +08:00
Group access is tied to visibility, but these sections aren't currently grouped in the settings, which makes the relationship difficult to see. This change merges them into a single section on group creation and edit, so the relationship is more apparent. "Who can join?" is now first, which gives it more control over the "who can see" options. There was also some dead code cleaned up here. Before: <img width="892" height="904" alt="image" src="https://github.com/user-attachments/assets/52ba2ea1-4201-414d-b044-b5a57ac9d39d" /> After: <img width="350" alt="image" src="https://github.com/user-attachments/assets/7ed6b7a2-f826-43e4-8861-5e8f05f60428" /> <img width="400" alt="image" src="https://github.com/user-attachments/assets/917d583a-3f54-4e1e-9545-5511f3eb7d37" /> <img width="400" alt="image" src="https://github.com/user-attachments/assets/5db59aab-6896-406b-9a71-68b60b18afda" />
134 lines
4.5 KiB
Ruby
Vendored
134 lines
4.5 KiB
Ruby
Vendored
# frozen_string_literal: true
|
|
|
|
describe "Group moderator self-lockout warning" do
|
|
fab!(:moderator)
|
|
# Invite-only so the restrictive visibility levels remain available — a freely
|
|
# joinable group can't be hidden to members/staff/owners only.
|
|
fab!(:group) { Fabricate(:group, public_admission: false) }
|
|
|
|
let(:group_page) { PageObjects::Pages::Group.new }
|
|
let(:dialog) { PageObjects::Components::Dialog.new }
|
|
let(:visibility_chooser) do
|
|
PageObjects::Components::SelectKit.new(".groups-form-visibility-level")
|
|
end
|
|
let(:members_visibility_chooser) do
|
|
PageObjects::Components::SelectKit.new(".groups-form-members-visibility-level")
|
|
end
|
|
let(:member_dropdown) { PageObjects::Components::SelectKit.new(".group-member-dropdown") }
|
|
|
|
before { SiteSetting.moderators_manage_groups = true }
|
|
|
|
def visit_membership_settings
|
|
group_page.visit(group)
|
|
group_page.click_manage
|
|
page.find(".user-secondary-navigation li", text: "Membership").click
|
|
end
|
|
|
|
context "when non-owner moderator changes visibility to 'Owners only'" do
|
|
before { sign_in(moderator) }
|
|
|
|
it "shows confirmation dialog for visibility_level change" do
|
|
visit_membership_settings
|
|
visibility_chooser.expand
|
|
visibility_chooser.select_row_by_value(Group.visibility_levels[:owners])
|
|
group_page.click_save
|
|
|
|
expect(dialog).to be_open
|
|
expect(dialog).to have_content(I18n.t("js.groups.manage.interaction.self_lockout"))
|
|
end
|
|
|
|
it "shows confirmation dialog for members_visibility_level change" do
|
|
visit_membership_settings
|
|
members_visibility_chooser.expand
|
|
members_visibility_chooser.select_row_by_value(Group.visibility_levels[:owners])
|
|
group_page.click_save
|
|
|
|
expect(dialog).to be_open
|
|
expect(dialog).to have_content(I18n.t("js.groups.manage.interaction.self_lockout"))
|
|
end
|
|
|
|
it "saves when confirmed" do
|
|
visit_membership_settings
|
|
visibility_chooser.expand
|
|
visibility_chooser.select_row_by_value(Group.visibility_levels[:owners])
|
|
group_page.click_save
|
|
dialog.click_yes
|
|
|
|
expect(page).to have_no_current_path(%r{/g/#{group.name}/manage})
|
|
expect(group.reload.visibility_level).to eq(Group.visibility_levels[:owners])
|
|
end
|
|
|
|
it "does not save when cancelled" do
|
|
visit_membership_settings
|
|
visibility_chooser.expand
|
|
visibility_chooser.select_row_by_value(Group.visibility_levels[:owners])
|
|
group_page.click_save
|
|
dialog.click_no
|
|
|
|
visit_membership_settings
|
|
expect(visibility_chooser).to have_selected_value(Group.visibility_levels[:public])
|
|
end
|
|
|
|
it "saves without dialog for non-restrictive visibility levels" do
|
|
visit_membership_settings
|
|
visibility_chooser.expand
|
|
visibility_chooser.select_row_by_value(Group.visibility_levels[:staff])
|
|
group_page.click_save
|
|
|
|
expect(dialog).to be_closed
|
|
expect(group.reload.visibility_level).to eq(Group.visibility_levels[:staff])
|
|
end
|
|
end
|
|
|
|
context "when owner moderator changes visibility to 'Owners only'" do
|
|
before do
|
|
group.add_owner(moderator)
|
|
sign_in(moderator)
|
|
end
|
|
|
|
it "saves without showing dialog" do
|
|
visit_membership_settings
|
|
visibility_chooser.expand
|
|
visibility_chooser.select_row_by_value(Group.visibility_levels[:owners])
|
|
group_page.click_save
|
|
|
|
expect(dialog).to be_closed
|
|
expect(group.reload.visibility_level).to eq(Group.visibility_levels[:owners])
|
|
end
|
|
end
|
|
|
|
context "when owner moderator removes self with restrictive visibility" do
|
|
before do
|
|
group.update!(visibility_level: Group.visibility_levels[:owners])
|
|
group.add_owner(moderator)
|
|
sign_in(moderator)
|
|
end
|
|
|
|
it "shows confirmation dialog when removing self as owner" do
|
|
group_page.visit(group)
|
|
member_dropdown.expand
|
|
member_dropdown.select_row_by_value("removeOwner")
|
|
|
|
expect(dialog).to be_open
|
|
expect(dialog).to have_content(I18n.t("js.groups.members.remove_owner_self_lockout"))
|
|
end
|
|
|
|
it "shows confirmation dialog when removing self as member" do
|
|
group_page.visit(group)
|
|
member_dropdown.expand
|
|
member_dropdown.select_row_by_value("removeMember")
|
|
|
|
expect(dialog).to be_open
|
|
expect(dialog).to have_content(I18n.t("js.groups.members.remove_member_self_lockout"))
|
|
end
|
|
|
|
it "does not remove when cancelled" do
|
|
group_page.visit(group)
|
|
member_dropdown.expand
|
|
member_dropdown.select_row_by_value("removeOwner")
|
|
dialog.click_no
|
|
|
|
expect(group.reload.group_users.find_by(user: moderator).owner).to be true
|
|
end
|
|
end
|
|
end
|