0
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-08-06 09:05:23 +08:00
discourse/spec/system/group_moderator_self_lockout_spec.rb
Kris 0477f91046
UX: combine group visibility and access configuration (#40758)
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"
/>
2026-06-11 11:20:29 -04:00

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