diff --git a/plugins/chat/app/services/chat/create_category_channel.rb b/plugins/chat/app/services/chat/create_category_channel.rb index e13a35fb449..a9cf36d5c8b 100644 --- a/plugins/chat/app/services/chat/create_category_channel.rb +++ b/plugins/chat/app/services/chat/create_category_channel.rb @@ -27,6 +27,7 @@ module Chat # @option params_to_create [Boolean] threading_enabled # @return [Service::Base::Context] + policy :public_channels_enabled policy :can_create_channel contract model :category, :fetch_category @@ -57,6 +58,10 @@ module Chat private + def public_channels_enabled + SiteSetting.enable_public_channels + end + def can_create_channel(guardian:, **) guardian.can_create_chat_channel? end diff --git a/plugins/chat/app/services/chat/search_chatable.rb b/plugins/chat/app/services/chat/search_chatable.rb index 6382d1b48b1..d0edb6435dd 100644 --- a/plugins/chat/app/services/chat/search_chatable.rb +++ b/plugins/chat/app/services/chat/search_chatable.rb @@ -56,6 +56,7 @@ module Chat def fetch_category_channels(guardian:, **) return if context.mode == :user + return if !SiteSetting.enable_public_channels context.category_channels = ::Chat::ChannelFetcher.secured_public_channel_search( diff --git a/plugins/chat/assets/javascripts/discourse/components/channels-list.js b/plugins/chat/assets/javascripts/discourse/components/channels-list.js index 9f6e96e87c0..b7011cfbae8 100644 --- a/plugins/chat/assets/javascripts/discourse/components/channels-list.js +++ b/plugins/chat/assets/javascripts/discourse/components/channels-list.js @@ -12,6 +12,7 @@ export default class ChannelsList extends Component { @service chatStateManager; @service chatChannelsManager; @service site; + @service siteSettings; @service session; @service currentUser; @service modal; @@ -71,6 +72,10 @@ export default class ChannelsList extends Component { } get displayPublicChannels() { + if (!this.siteSettings.enable_public_channels) { + return false; + } + if (this.publicMessageChannelsEmpty) { return ( this.currentUser?.staff || diff --git a/plugins/chat/assets/javascripts/discourse/components/chat/message-creator.js b/plugins/chat/assets/javascripts/discourse/components/chat/message-creator.js index 28a81bd9750..292b78098d1 100644 --- a/plugins/chat/assets/javascripts/discourse/components/chat/message-creator.js +++ b/plugins/chat/assets/javascripts/discourse/components/chat/message-creator.js @@ -113,6 +113,7 @@ export default class ChatMessageCreator extends Component { @service site; @service router; @service currentUser; + @service siteSettings; @tracked selection = new TrackedArray(); @tracked activeSelection = new TrackedArray(); @@ -124,10 +125,25 @@ export default class ChatMessageCreator extends Component { @tracked _activeResultIdentifier = null; get placeholder() { - if (this.hasSelectedUsers) { - return I18n.t("chat.new_message_modal.user_search_placeholder"); - } else { - return I18n.t("chat.new_message_modal.default_search_placeholder"); + if ( + this.siteSettings.enable_public_channels && + this.chat.userCanDirectMessage + ) { + if (this.hasSelectedUsers) { + return I18n.t("chat.new_message_modal.user_search_placeholder"); + } else { + return I18n.t("chat.new_message_modal.default_search_placeholder"); + } + } else if (this.siteSettings.enable_public_channels) { + return I18n.t( + "chat.new_message_modal.default_channel_search_placeholder" + ); + } else if (this.chat.userCanDirectMessage) { + if (this.hasSelectedUsers) { + return I18n.t("chat.new_message_modal.user_search_placeholder"); + } else { + return I18n.t("chat.new_message_modal.default_user_search_placeholder"); + } } } diff --git a/plugins/chat/assets/javascripts/discourse/components/chat/modal/new-message.hbs b/plugins/chat/assets/javascripts/discourse/components/chat/modal/new-message.hbs index 05b535f5e6c..883cf9903b2 100644 --- a/plugins/chat/assets/javascripts/discourse/components/chat/modal/new-message.hbs +++ b/plugins/chat/assets/javascripts/discourse/components/chat/modal/new-message.hbs @@ -1,8 +1,10 @@ - - - \ No newline at end of file +{{#if this.shouldRender}} + + + +{{/if}} \ No newline at end of file diff --git a/plugins/chat/assets/javascripts/discourse/components/chat/modal/new-message.js b/plugins/chat/assets/javascripts/discourse/components/chat/modal/new-message.js new file mode 100644 index 00000000000..14bf3e405e0 --- /dev/null +++ b/plugins/chat/assets/javascripts/discourse/components/chat/modal/new-message.js @@ -0,0 +1,14 @@ +import Component from "@glimmer/component"; + +import { inject as service } from "@ember/service"; + +export default class ChatModalNewMessage extends Component { + @service chat; + @service siteSettings; + + get shouldRender() { + return ( + this.siteSettings.enable_public_channels || this.chat.userCanDirectMessage + ); + } +} diff --git a/plugins/chat/assets/javascripts/discourse/initializers/chat-sidebar.js b/plugins/chat/assets/javascripts/discourse/initializers/chat-sidebar.js index 7462a216b71..acb1bd1c225 100644 --- a/plugins/chat/assets/javascripts/discourse/initializers/chat-sidebar.js +++ b/plugins/chat/assets/javascripts/discourse/initializers/chat-sidebar.js @@ -21,155 +21,159 @@ export default { return; } + this.siteSettings = container.lookup("service:site-settings"); + withPluginApi("1.3.0", (api) => { - api.addSidebarSection( - (BaseCustomSidebarSection, BaseCustomSidebarSectionLink) => { - const SidebarChatChannelsSectionLink = class extends BaseCustomSidebarSectionLink { - constructor({ channel, chatService }) { - super(...arguments); - this.channel = channel; - this.chatService = chatService; - } - - get name() { - return dasherize(this.channel.slugifiedTitle); - } - - get classNames() { - const classes = []; - - if (this.channel.currentUserMembership.muted) { - classes.push("sidebar-section-link--muted"); + if (this.siteSettings.enable_public_channels) { + api.addSidebarSection( + (BaseCustomSidebarSection, BaseCustomSidebarSectionLink) => { + const SidebarChatChannelsSectionLink = class extends BaseCustomSidebarSectionLink { + constructor({ channel, chatService }) { + super(...arguments); + this.channel = channel; + this.chatService = chatService; } - if (this.channel.id === this.chatService.activeChannel?.id) { - classes.push("sidebar-section-link--active"); + get name() { + return dasherize(this.channel.slugifiedTitle); } - classes.push(`channel-${this.channel.id}`); + get classNames() { + const classes = []; - return classes.join(" "); - } + if (this.channel.currentUserMembership.muted) { + classes.push("sidebar-section-link--muted"); + } - get route() { - return "chat.channel"; - } + if (this.channel.id === this.chatService.activeChannel?.id) { + classes.push("sidebar-section-link--active"); + } - get models() { - return this.channel.routeModels; - } + classes.push(`channel-${this.channel.id}`); - get text() { - return htmlSafe(emojiUnescape(this.channel.escapedTitle)); - } - - get prefixType() { - return "icon"; - } - - get prefixValue() { - return "d-chat"; - } - - get prefixColor() { - return this.channel.chatable.color; - } - - get title() { - return this.channel.escapedDescription - ? htmlSafe(this.channel.escapedDescription) - : `${this.channel.escapedTitle} ${I18n.t("chat.title")}`; - } - - get prefixBadge() { - return this.channel.chatable.read_restricted ? "lock" : ""; - } - - get suffixType() { - return "icon"; - } - - get suffixValue() { - return this.channel.tracking.unreadCount > 0 ? "circle" : ""; - } - - get suffixCSSClass() { - return this.channel.tracking.mentionCount > 0 - ? "urgent" - : "unread"; - } - }; - - const SidebarChatChannelsSection = class extends BaseCustomSidebarSection { - @tracked currentUserCanJoinPublicChannels = - this.sidebar.currentUser && - (this.sidebar.currentUser.staff || - this.sidebar.currentUser.has_joinable_public_channels); - - constructor() { - super(...arguments); - - if (container.isDestroyed) { - return; + return classes.join(" "); } - this.chatService = container.lookup("service:chat"); - this.chatChannelsManager = container.lookup( - "service:chat-channels-manager" - ); - this.router = container.lookup("service:router"); - } - get sectionLinks() { - return this.chatChannelsManager.publicMessageChannels.map( - (channel) => - new SidebarChatChannelsSectionLink({ - channel, - chatService: this.chatService, - }) - ); - } + get route() { + return "chat.channel"; + } - get name() { - return "chat-channels"; - } + get models() { + return this.channel.routeModels; + } - get title() { - return I18n.t("chat.chat_channels"); - } + get text() { + return htmlSafe(emojiUnescape(this.channel.escapedTitle)); + } - get text() { - return I18n.t("chat.chat_channels"); - } + get prefixType() { + return "icon"; + } - get actions() { - return [ - { - id: "browseChannels", - title: I18n.t("chat.channels_list_popup.browse"), - action: () => this.router.transitionTo("chat.browse.open"), - }, - ]; - } + get prefixValue() { + return "d-chat"; + } - get actionsIcon() { - return "pencil-alt"; - } + get prefixColor() { + return this.channel.chatable.color; + } - get links() { - return this.sectionLinks; - } + get title() { + return this.channel.escapedDescription + ? htmlSafe(this.channel.escapedDescription) + : `${this.channel.escapedTitle} ${I18n.t("chat.title")}`; + } - get displaySection() { - return ( - this.sectionLinks.length > 0 || - this.currentUserCanJoinPublicChannels - ); - } - }; + get prefixBadge() { + return this.channel.chatable.read_restricted ? "lock" : ""; + } - return SidebarChatChannelsSection; - } - ); + get suffixType() { + return "icon"; + } + + get suffixValue() { + return this.channel.tracking.unreadCount > 0 ? "circle" : ""; + } + + get suffixCSSClass() { + return this.channel.tracking.mentionCount > 0 + ? "urgent" + : "unread"; + } + }; + + const SidebarChatChannelsSection = class extends BaseCustomSidebarSection { + @tracked currentUserCanJoinPublicChannels = + this.sidebar.currentUser && + (this.sidebar.currentUser.staff || + this.sidebar.currentUser.has_joinable_public_channels); + + constructor() { + super(...arguments); + + if (container.isDestroyed) { + return; + } + this.chatService = container.lookup("service:chat"); + this.chatChannelsManager = container.lookup( + "service:chat-channels-manager" + ); + this.router = container.lookup("service:router"); + } + + get sectionLinks() { + return this.chatChannelsManager.publicMessageChannels.map( + (channel) => + new SidebarChatChannelsSectionLink({ + channel, + chatService: this.chatService, + }) + ); + } + + get name() { + return "chat-channels"; + } + + get title() { + return I18n.t("chat.chat_channels"); + } + + get text() { + return I18n.t("chat.chat_channels"); + } + + get actions() { + return [ + { + id: "browseChannels", + title: I18n.t("chat.channels_list_popup.browse"), + action: () => this.router.transitionTo("chat.browse.open"), + }, + ]; + } + + get actionsIcon() { + return "pencil-alt"; + } + + get links() { + return this.sectionLinks; + } + + get displaySection() { + return ( + this.sectionLinks.length > 0 || + this.currentUserCanJoinPublicChannels + ); + } + }; + + return SidebarChatChannelsSection; + } + ); + } api.addSidebarSection( (BaseCustomSidebarSection, BaseCustomSidebarSectionLink) => { diff --git a/plugins/chat/assets/javascripts/discourse/routes/chat-browse-index.js b/plugins/chat/assets/javascripts/discourse/routes/chat-browse-index.js index 12fd2d14672..927e5ed122e 100644 --- a/plugins/chat/assets/javascripts/discourse/routes/chat-browse-index.js +++ b/plugins/chat/assets/javascripts/discourse/routes/chat-browse-index.js @@ -1,8 +1,16 @@ import DiscourseRoute from "discourse/routes/discourse"; import { inject as service } from "@ember/service"; +import { defaultHomepage } from "discourse/lib/utilities"; export default class ChatBrowseIndexRoute extends DiscourseRoute { @service chat; + @service siteSettings; + + beforeModel() { + if (!this.siteSettings.enable_public_channels) { + return this.transitionTo(`discovery.${defaultHomepage()}`); + } + } activate() { this.chat.activeChannel = null; diff --git a/plugins/chat/config/locales/client.en.yml b/plugins/chat/config/locales/client.en.yml index ade698a41d9..5a4d15c0e3f 100644 --- a/plugins/chat/config/locales/client.en.yml +++ b/plugins/chat/config/locales/client.en.yml @@ -330,6 +330,8 @@ en: add_user_short: Add user open_channel: Open channel default_search_placeholder: "#a-channel, @somebody or anything" + default_channel_search_placeholder: "#a-channel" + default_user_search_placeholder: "@somebody" user_search_placeholder: "...add more users" disabled_user: "has disabled chat" no_items: "No items" diff --git a/plugins/chat/config/locales/server.en.yml b/plugins/chat/config/locales/server.en.yml index 8e4cbabb7c1..afc1fcc06b4 100644 --- a/plugins/chat/config/locales/server.en.yml +++ b/plugins/chat/config/locales/server.en.yml @@ -1,6 +1,7 @@ en: site_settings: chat_enabled: "Enable the chat plugin." + enable_public_channels: "Enable public channels based on categories." chat_allowed_groups: "Users in these groups can chat. Note that staff can always access chat." chat_channel_retention_days: "Chat messages in regular channels will be retained for this many days. Set to '0' to retain messages forever." chat_dm_retention_days: "Chat messages in personal chat channels will be retained for this many days. Set to '0' to retain messages forever." diff --git a/plugins/chat/config/settings.yml b/plugins/chat/config/settings.yml index 27b29a5a8a3..97e8575ddb0 100644 --- a/plugins/chat/config/settings.yml +++ b/plugins/chat/config/settings.yml @@ -2,6 +2,9 @@ chat: chat_enabled: default: true client: true + enable_public_channels: + default: true + client: true chat_allowed_groups: client: true type: group_list diff --git a/plugins/chat/lib/chat/channel_fetcher.rb b/plugins/chat/lib/chat/channel_fetcher.rb index 4a9c1f87854..9cef651fa23 100644 --- a/plugins/chat/lib/chat/channel_fetcher.rb +++ b/plugins/chat/lib/chat/channel_fetcher.rb @@ -86,6 +86,8 @@ module Chat end def self.secured_public_channel_search(guardian, options = {}) + return ::Chat::Channel.none if !SiteSetting.enable_public_channels + allowed_channel_ids = generate_allowed_channel_ids_sql(guardian, exclude_dm_channels: true) channels = Chat::Channel.includes(:last_message, chatable: [:topic_only_relative_url]) diff --git a/plugins/chat/lib/chat/channel_hashtag_data_source.rb b/plugins/chat/lib/chat/channel_hashtag_data_source.rb index e31e96d0b22..538e5566f50 100644 --- a/plugins/chat/lib/chat/channel_hashtag_data_source.rb +++ b/plugins/chat/lib/chat/channel_hashtag_data_source.rb @@ -23,7 +23,7 @@ module Chat end def self.lookup(guardian, slugs) - if SiteSetting.enable_experimental_hashtag_autocomplete + if SiteSetting.enable_experimental_hashtag_autocomplete && SiteSetting.enable_public_channels return [] if !guardian.can_chat? Chat::ChannelFetcher .secured_public_channel_slug_lookup(guardian, slugs) @@ -39,7 +39,7 @@ module Chat limit, condition = HashtagAutocompleteService.search_conditions[:contains] ) - if SiteSetting.enable_experimental_hashtag_autocomplete + if SiteSetting.enable_experimental_hashtag_autocomplete && SiteSetting.enable_public_channels return [] if !guardian.can_chat? Chat::ChannelFetcher .secured_public_channel_search( @@ -61,7 +61,7 @@ module Chat end def self.search_without_term(guardian, limit) - if SiteSetting.enable_experimental_hashtag_autocomplete + if SiteSetting.enable_experimental_hashtag_autocomplete && SiteSetting.enable_public_channels return [] if !guardian.can_chat? allowed_channel_ids_sql = Chat::ChannelFetcher.generate_allowed_channel_ids_sql(guardian, exclude_dm_channels: true) diff --git a/plugins/chat/spec/lib/chat/channel_fetcher_spec.rb b/plugins/chat/spec/lib/chat/channel_fetcher_spec.rb index 65f02b4bd39..6d0a31f3e9d 100644 --- a/plugins/chat/spec/lib/chat/channel_fetcher_spec.rb +++ b/plugins/chat/spec/lib/chat/channel_fetcher_spec.rb @@ -201,6 +201,12 @@ describe Chat::ChannelFetcher do ).to match_array([category_channel.id]) end + it "returns an empty array when public channels are disabled" do + SiteSetting.enable_public_channels = false + + expect(described_class.secured_public_channels(guardian, following: nil)).to be_empty + end + it "can filter by channel name, or category name" do expect( described_class.secured_public_channels( diff --git a/plugins/chat/spec/lib/chat/channel_hashtag_data_source_spec.rb b/plugins/chat/spec/lib/chat/channel_hashtag_data_source_spec.rb index 4aff20fb3f4..f6f9a46e87d 100644 --- a/plugins/chat/spec/lib/chat/channel_hashtag_data_source_spec.rb +++ b/plugins/chat/spec/lib/chat/channel_hashtag_data_source_spec.rb @@ -79,6 +79,11 @@ RSpec.describe Chat::ChannelHashtagDataSource do Group.refresh_automatic_groups! expect(described_class.lookup(Guardian.new(user), ["random"])).to be_empty end + + it "returns an empty array if public channels are disabled" do + SiteSetting.enable_public_channels = false + expect(described_class.lookup(guardian, ["random"])).to eq([]) + end end describe "#search" do @@ -144,6 +149,11 @@ RSpec.describe Chat::ChannelHashtagDataSource do Group.refresh_automatic_groups! expect(described_class.search(Guardian.new(user), "rand", 10)).to be_empty end + + it "returns an empty array if public channels are disabled" do + SiteSetting.enable_public_channels = false + expect(described_class.search(guardian, "rand", 10)).to eq([]) + end end describe "#search_without_term" do @@ -172,6 +182,11 @@ RSpec.describe Chat::ChannelHashtagDataSource do ) end + it "returns an empty array if public channels are disabled" do + SiteSetting.enable_public_channels = false + expect(described_class.search_without_term(guardian, 5)).to eq([]) + end + it "does not return channels the user does not have permission to view" do expect(described_class.search_without_term(guardian, 5).map(&:slug)).not_to include("secret") end diff --git a/plugins/chat/spec/services/chat/create_category_channel_spec.rb b/plugins/chat/spec/services/chat/create_category_channel_spec.rb index 0ad01dfe3b1..ef4742a9c70 100644 --- a/plugins/chat/spec/services/chat/create_category_channel_spec.rb +++ b/plugins/chat/spec/services/chat/create_category_channel_spec.rb @@ -16,6 +16,14 @@ RSpec.describe Chat::CreateCategoryChannel do let(:guardian) { Guardian.new(current_user) } let(:params) { { guardian: guardian, category_id: category_id, name: "cool channel" } } + context "when public channels are disabled" do + fab!(:current_user) { Fabricate(:user) } + + before { SiteSetting.enable_public_channels = false } + + it { is_expected.to fail_a_policy(:public_channels_enabled) } + end + context "when the current user cannot make a channel" do fab!(:current_user) { Fabricate(:user) } diff --git a/plugins/chat/spec/services/chat/search_chatable_spec.rb b/plugins/chat/spec/services/chat/search_chatable_spec.rb index 46da6e84fc1..831032a7f58 100644 --- a/plugins/chat/spec/services/chat/search_chatable_spec.rb +++ b/plugins/chat/spec/services/chat/search_chatable_spec.rb @@ -52,6 +52,14 @@ RSpec.describe Chat::SearchChatable do expect(result.category_channels).to_not include(private_channel_1) end end + + context "when public channels are disabled" do + it "does not return category channels" do + SiteSetting.enable_public_channels = false + + expect(described_class.call(params).category_channels).to be_blank + end + end end context "when term is prefixed with #" do diff --git a/plugins/chat/spec/system/browse_page_spec.rb b/plugins/chat/spec/system/browse_page_spec.rb index 30d7905884b..2568a04c801 100644 --- a/plugins/chat/spec/system/browse_page_spec.rb +++ b/plugins/chat/spec/system/browse_page_spec.rb @@ -20,6 +20,15 @@ RSpec.describe "Browse page", type: :system do end end + context "when public channels are disabled" do + before { SiteSetting.enable_public_channels = false } + + it "redirects to homepage" do + visit("/chat/browse") # no page object here as we actually don't load it + expect(page).to have_current_path("/latest") + end + end + context "when user has chat enabled" do context "when visiting browse page" do it "defaults to open filer" do diff --git a/plugins/chat/spec/system/new_message_spec.rb b/plugins/chat/spec/system/new_message_spec.rb index 8a1877a53f0..f82e4951e69 100644 --- a/plugins/chat/spec/system/new_message_spec.rb +++ b/plugins/chat/spec/system/new_message_spec.rb @@ -20,6 +20,47 @@ RSpec.describe "New message", type: :system do expect(chat_page.message_creator).to be_opened end + context "when public channels are disabled" do + fab!(:channel_1) { Fabricate(:chat_channel) } + + before do + SiteSetting.enable_public_channels = false + channel_1.add(current_user) + end + + it "doesn’t list public channels" do + visit("/") + chat_page.open_new_message + + expect(chat_page.message_creator).to be_not_listing(channel_1) + end + + it "has a correct placeholder" do + visit("/") + chat_page.open_new_message + + expect(chat_page.message_creator.input["placeholder"]).to eq( + I18n.t("js.chat.new_message_modal.default_user_search_placeholder"), + ) + end + end + + context "when public channels are disabled and user can't create direct message" do + fab!(:current_user) { Fabricate(:user) } + + before do + SiteSetting.enable_public_channels = false + SiteSetting.direct_message_enabled_groups = Group::AUTO_GROUPS[:staff] + end + + it "doesn’t list public channels" do + visit("/") + chat_page.open_new_message(ensure_open: false) + + expect(chat_page.message_creator).to be_closed + end + end + context "when the the content is not filtered" do fab!(:channel_1) { Fabricate(:chat_channel) } fab!(:channel_2) { Fabricate(:chat_channel) } diff --git a/plugins/chat/spec/system/page_objects/chat/chat.rb b/plugins/chat/spec/system/page_objects/chat/chat.rb index 9c2289a1dc5..fe58d03c73a 100644 --- a/plugins/chat/spec/system/page_objects/chat/chat.rb +++ b/plugins/chat/spec/system/page_objects/chat/chat.rb @@ -29,9 +29,9 @@ module PageObjects visit("/chat") end - def open_new_message + def open_new_message(ensure_open: true) send_keys([PLATFORM_KEY_MODIFIER, "k"]) - find(".chat-modal-new-message") + find(".chat-modal-new-message") if ensure_open end def has_drawer?(channel_id: nil, expanded: true) diff --git a/plugins/chat/spec/system/page_objects/chat/components/message_creator.rb b/plugins/chat/spec/system/page_objects/chat/components/message_creator.rb index 896c3b27776..d6e8c692eb9 100644 --- a/plugins/chat/spec/system/page_objects/chat/components/message_creator.rb +++ b/plugins/chat/spec/system/page_objects/chat/components/message_creator.rb @@ -24,6 +24,10 @@ module PageObjects page.has_css?(SELECTOR) end + def closed? + page.has_no_css?(SELECTOR) + end + def enter_shortcut input.send_keys(:enter) end diff --git a/plugins/chat/spec/system/page_objects/sidebar/sidebar.rb b/plugins/chat/spec/system/page_objects/sidebar/sidebar.rb index a7e88361d45..70de387e958 100644 --- a/plugins/chat/spec/system/page_objects/sidebar/sidebar.rb +++ b/plugins/chat/spec/system/page_objects/sidebar/sidebar.rb @@ -3,19 +3,27 @@ module PageObjects module Pages class Sidebar < PageObjects::Pages::Base + PUBLIC_CHANNELS_SECTION_SELECTOR = ".sidebar-section[data-section-name='chat-channels']" + DM_CHANNELS_SECTION_SELECTOR = ".sidebar-section[data-section-name='chat-dms']" + + def has_no_public_channels_section? + has_no_css?(PUBLIC_CHANNELS_SECTION_SELECTOR) + end + def channels_section - find(".sidebar-section[data-section-name='chat-channels']") + find(PUBLIC_CHANNELS_SECTION_SELECTOR) + end + + def channels_section + find(PUBLIC_CHANNELS_SECTION_SELECTOR) end def dms_section - find(".sidebar-section[data-section-name='chat-dms']") + find(DM_CHANNELS_SECTION_SELECTOR) end def open_browse - find( - ".sidebar-section[data-section-name='chat-channels'] .sidebar-section-header-button", - visible: false, - ).click + channels_section.find(".sidebar-section-header-button", visible: false).click end def open_channel(channel) diff --git a/plugins/chat/spec/system/sidebars_spec.rb b/plugins/chat/spec/system/sidebars_spec.rb index 2fa654ce373..d1df0415164 100644 --- a/plugins/chat/spec/system/sidebars_spec.rb +++ b/plugins/chat/spec/system/sidebars_spec.rb @@ -8,6 +8,7 @@ RSpec.describe "Navigation", type: :system do fab!(:category_channel) { Fabricate(:category_channel) } fab!(:category_channel_2) { Fabricate(:category_channel) } let(:chat_page) { PageObjects::Pages::Chat.new } + let(:sidebar_page) { PageObjects::Pages::Sidebar.new } before do chat_system_bootstrap(user, [category_channel, category_channel_2]) @@ -40,6 +41,16 @@ RSpec.describe "Navigation", type: :system do expect(page).to have_no_css("#d-sidebar") end end + + context "when public channels are disabled" do + before { SiteSetting.enable_public_channels = false } + + it "has public channels section" do + visit("/") + + expect(sidebar_page).to have_no_public_channels_section + end + end end context "when visiting on mobile" do