FEATURE: allows browse page in chat drawer (#27919)
This commit ensures the browse page can be loaded in the drawer and doesn’t force full page mode. Other notable changes of this commit: - be consistent about wrapping each full page route with "c-routes.--route-name" and each drawer container with "c-drawer-routes.--route-name" - move browse channels into its own component, it was before in the template of the channels browse
This commit is contained in:
parent
600f2854c7
commit
c74fa300e7
|
@ -0,0 +1,129 @@
|
|||
import Component from "@glimmer/component";
|
||||
import { cached, tracked } from "@glimmer/tracking";
|
||||
import { concat, hash } from "@ember/helper";
|
||||
import { action } from "@ember/object";
|
||||
import didInsert from "@ember/render-modifiers/modifiers/did-insert";
|
||||
import { LinkTo } from "@ember/routing";
|
||||
import { schedule } from "@ember/runloop";
|
||||
import { service } from "@ember/service";
|
||||
import { eq } from "truth-helpers";
|
||||
import DButton from "discourse/components/d-button";
|
||||
import { INPUT_DELAY } from "discourse-common/config/environment";
|
||||
import i18n from "discourse-common/helpers/i18n";
|
||||
import discourseDebounce from "discourse-common/lib/debounce";
|
||||
import List from "discourse/plugins/chat/discourse/components/chat/list";
|
||||
import ChatModalNewMessage from "discourse/plugins/chat/discourse/components/chat/modal/new-message";
|
||||
import ChatChannelCard from "discourse/plugins/chat/discourse/components/chat-channel-card";
|
||||
import DcFilterInput from "discourse/plugins/chat/discourse/components/dc-filter-input";
|
||||
|
||||
const ARCHIVED = "archived";
|
||||
const ALL = "all";
|
||||
const OPEN = "open";
|
||||
const CLOSED = "closed";
|
||||
const TABS = [ALL, OPEN, CLOSED, ARCHIVED];
|
||||
|
||||
export default class BrowseChannels extends Component {
|
||||
@service chatApi;
|
||||
@service modal;
|
||||
@service siteSettings;
|
||||
|
||||
@tracked filter = "";
|
||||
|
||||
get currentTab() {
|
||||
return this.args.currentTab ?? ALL;
|
||||
}
|
||||
|
||||
@cached
|
||||
get channelsCollection() {
|
||||
return this.chatApi.channels({
|
||||
filter: this.filter,
|
||||
status: this.currentTab,
|
||||
});
|
||||
}
|
||||
|
||||
get tabs() {
|
||||
if (this.siteSettings.chat_allow_archiving_channels) {
|
||||
return TABS;
|
||||
} else {
|
||||
return [...TABS].removeObject(ARCHIVED);
|
||||
}
|
||||
}
|
||||
|
||||
@action
|
||||
showChatNewMessageModal() {
|
||||
this.modal.show(ChatModalNewMessage);
|
||||
}
|
||||
|
||||
@action
|
||||
setFilter(event) {
|
||||
this.filter = event.target.value;
|
||||
discourseDebounce(this.debouncedLoad, INPUT_DELAY);
|
||||
}
|
||||
|
||||
@action
|
||||
debouncedLoad() {
|
||||
this.channelsCollection.load({ limit: 10 });
|
||||
}
|
||||
|
||||
@action
|
||||
focusFilterInput(input) {
|
||||
schedule("afterRender", () => input?.focus());
|
||||
}
|
||||
|
||||
<template>
|
||||
<div class="chat-browse-view">
|
||||
<div class="chat-browse-view__actions">
|
||||
<nav>
|
||||
<ul class="nav-pills chat-browse-view__filters">
|
||||
{{#each this.tabs as |tab|}}
|
||||
<li class={{concat "chat-browse-view__filter -" tab}}>
|
||||
<LinkTo
|
||||
@route={{concat "chat.browse." tab}}
|
||||
class={{concat "chat-browse-view__filter-link -" tab}}
|
||||
@current-when={{eq tab this.currentTab}}
|
||||
>
|
||||
{{i18n (concat "chat.browse.filter_" tab)}}
|
||||
</LinkTo>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<DcFilterInput
|
||||
{{didInsert this.focusFilterInput}}
|
||||
@filterAction={{this.setFilter}}
|
||||
@icons={{hash right="search"}}
|
||||
@containerClass="filter-input"
|
||||
placeholder={{i18n "chat.browse.filter_input_placeholder"}}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="chat-browse-view__content_wrapper">
|
||||
<div class="chat-browse-view__content">
|
||||
<List
|
||||
@collection={{this.channelsCollection}}
|
||||
class="chat-browse-view__cards"
|
||||
as |list|
|
||||
>
|
||||
<list.Item as |channel|>
|
||||
<ChatChannelCard @channel={{channel}} />
|
||||
</list.Item>
|
||||
|
||||
<list.EmptyState>
|
||||
<span class="empty-state-title">
|
||||
{{i18n "chat.empty_state.title"}}
|
||||
</span>
|
||||
<div class="empty-state-body">
|
||||
<p>{{i18n "chat.empty_state.direct_message"}}</p>
|
||||
<DButton
|
||||
@action={{this.showChatNewMessageModal}}
|
||||
@label="chat.empty_state.direct_message_cta"
|
||||
/>
|
||||
</div>
|
||||
</list.EmptyState>
|
||||
</List>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
}
|
|
@ -702,7 +702,6 @@ export default class ChatChannel extends Component {
|
|||
{{didUpdate this.loadMessages @targetMessageId}}
|
||||
data-id={{@channel.id}}
|
||||
>
|
||||
|
||||
<ChatChannelStatus @channel={{@channel}} />
|
||||
<ChatNotices @channel={{@channel}} />
|
||||
<ChatMentionWarnings />
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
import Component from "@glimmer/component";
|
||||
import { tracked } from "@glimmer/tracking";
|
||||
import { array } from "@ember/helper";
|
||||
import { service } from "@ember/service";
|
||||
import i18n from "discourse-common/helpers/i18n";
|
||||
import BrowseChannels from "discourse/plugins/chat/discourse/components/browse-channels";
|
||||
import Navbar from "discourse/plugins/chat/discourse/components/chat/navbar";
|
||||
|
||||
export default class ChatDrawerRoutesBrowse extends Component {
|
||||
@service chat;
|
||||
@service chatStateManager;
|
||||
@service chatChannelsManager;
|
||||
@service chatHistory;
|
||||
|
||||
@tracked showThreadFullTitle = false;
|
||||
|
||||
get showfullTitle() {
|
||||
return this.chatStateManager.isDrawerExpanded && this.showThreadFullTitle;
|
||||
}
|
||||
|
||||
<template>
|
||||
<div class="c-drawer-routes --browse">
|
||||
<Navbar
|
||||
@onClick={{this.chat.toggleDrawer}}
|
||||
@showFullTitle={{this.showfullTitle}}
|
||||
as |navbar|
|
||||
>
|
||||
<navbar.BackButton @route="chat.channels" />
|
||||
<navbar.Title @title={{i18n "chat.browse.title"}} />
|
||||
<navbar.Actions as |a|>
|
||||
<a.NewChannelButton />
|
||||
<a.ToggleDrawerButton />
|
||||
<a.FullPageButton />
|
||||
<a.CloseDrawerButton />
|
||||
</navbar.Actions>
|
||||
</Navbar>
|
||||
|
||||
{{#if this.chatStateManager.isDrawerExpanded}}
|
||||
<div class="chat-drawer-content">
|
||||
{{#each (array @params.currentTab) as |tab|}}
|
||||
<BrowseChannels @currentTab={{tab}} />
|
||||
{{/each}}
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</template>
|
||||
}
|
|
@ -34,6 +34,11 @@ export default class ChatDrawerRoutesMembers extends Component {
|
|||
}
|
||||
|
||||
<template>
|
||||
<div
|
||||
class="c-drawer-routes --channel-info-members"
|
||||
{{didInsert this.fetchChannel}}
|
||||
>
|
||||
{{#if this.chat.activeChannel}}
|
||||
<Navbar @onClick={{this.chat.toggleDrawer}} as |navbar|>
|
||||
<navbar.BackButton
|
||||
@title={{this.backButton.title}}
|
||||
|
@ -49,12 +54,15 @@ export default class ChatDrawerRoutesMembers extends Component {
|
|||
</Navbar>
|
||||
|
||||
{{#if this.chatStateManager.isDrawerExpanded}}
|
||||
<div class="chat-drawer-content" {{didInsert this.fetchChannel}}>
|
||||
{{#if this.chat.activeChannel}}
|
||||
<ChannelInfoNav @channel={{this.chat.activeChannel}} @tab="members" />
|
||||
<div class="chat-drawer-content">
|
||||
<ChannelInfoNav
|
||||
@channel={{this.chat.activeChannel}}
|
||||
@tab="members"
|
||||
/>
|
||||
<ChannelMembers @channel={{this.chat.activeChannel}} />
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</template>
|
||||
}
|
|
@ -34,6 +34,11 @@ export default class ChatDrawerRoutesSettings extends Component {
|
|||
}
|
||||
|
||||
<template>
|
||||
<div
|
||||
class="c-drawer-routes --channel-info-settings"
|
||||
{{didInsert this.fetchChannel}}
|
||||
>
|
||||
{{#if this.chat.activeChannel}}
|
||||
<Navbar @onClick={{this.chat.toggleDrawer}} as |navbar|>
|
||||
<navbar.BackButton
|
||||
@title={{this.backButton.title}}
|
||||
|
@ -49,15 +54,15 @@ export default class ChatDrawerRoutesSettings extends Component {
|
|||
</Navbar>
|
||||
|
||||
{{#if this.chatStateManager.isDrawerExpanded}}
|
||||
<div class="chat-drawer-content" {{didInsert this.fetchChannel}}>
|
||||
{{#if this.chat.activeChannel}}
|
||||
<div class="chat-drawer-content">
|
||||
<ChannelInfoNav
|
||||
@channel={{this.chat.activeChannel}}
|
||||
@tab="settings"
|
||||
/>
|
||||
<ChannelSettings @channel={{this.chat.activeChannel}} />
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</template>
|
||||
}
|
|
@ -78,6 +78,13 @@ export default class ChatDrawerRoutesChannelThread extends Component {
|
|||
}
|
||||
|
||||
<template>
|
||||
<div
|
||||
class="c-drawer-routes --channel-thread"
|
||||
{{didInsert this.fetchChannelAndThread}}
|
||||
{{didUpdate this.fetchChannelAndThread @params.channelId}}
|
||||
{{didUpdate this.fetchChannelAndThread @params.threadId}}
|
||||
>
|
||||
{{#if this.chat.activeChannel}}
|
||||
<Navbar
|
||||
@onClick={{this.chat.toggleDrawer}}
|
||||
@showFullTitle={{this.showfullTitle}}
|
||||
|
@ -97,12 +104,7 @@ export default class ChatDrawerRoutesChannelThread extends Component {
|
|||
</Navbar>
|
||||
|
||||
{{#if this.chatStateManager.isDrawerExpanded}}
|
||||
<div
|
||||
class="chat-drawer-content"
|
||||
{{didInsert this.fetchChannelAndThread}}
|
||||
{{didUpdate this.fetchChannelAndThread @params.channelId}}
|
||||
{{didUpdate this.fetchChannelAndThread @params.threadId}}
|
||||
>
|
||||
<div class="chat-drawer-content">
|
||||
{{#each (array this.chat.activeChannel.activeThread) as |thread|}}
|
||||
{{#if thread}}
|
||||
<ChatThread
|
||||
|
@ -114,5 +116,7 @@ export default class ChatDrawerRoutesChannelThread extends Component {
|
|||
{{/each}}
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</template>
|
||||
}
|
||||
|
|
|
@ -40,6 +40,7 @@ export default class ChatDrawerRoutesChannelThreads extends Component {
|
|||
}
|
||||
|
||||
<template>
|
||||
<div class="c-drawer-routes --channel-threads">
|
||||
{{#if this.chat.activeChannel}}
|
||||
<Navbar @onClick={{this.chat.toggleDrawer}} as |navbar|>
|
||||
<navbar.BackButton
|
||||
|
@ -64,5 +65,6 @@ export default class ChatDrawerRoutesChannelThreads extends Component {
|
|||
/>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
}
|
||||
|
|
|
@ -11,9 +11,12 @@ export default class ChatDrawerRoutesChannel extends Component {
|
|||
@service chat;
|
||||
@service chatStateManager;
|
||||
@service chatChannelsManager;
|
||||
@service chatHistory;
|
||||
|
||||
get backBtnRoute() {
|
||||
if (this.chat.activeChannel?.isDirectMessageChannel) {
|
||||
if (this.chatHistory.previousRoute?.name === "chat.browse") {
|
||||
return "chat.browse";
|
||||
} else if (this.chat.activeChannel?.isDirectMessageChannel) {
|
||||
return "chat.direct-messages";
|
||||
} else {
|
||||
return "chat.channels";
|
||||
|
@ -34,6 +37,7 @@ export default class ChatDrawerRoutesChannel extends Component {
|
|||
}
|
||||
|
||||
<template>
|
||||
<div class="c-drawer-routes --channel">
|
||||
<Navbar @onClick={{this.chat.toggleDrawer}} as |navbar|>
|
||||
<navbar.BackButton @route={{this.backBtnRoute}} />
|
||||
<navbar.ChannelTitle @channel={{this.chat.activeChannel}} />
|
||||
|
@ -63,5 +67,6 @@ export default class ChatDrawerRoutesChannel extends Component {
|
|||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</template>
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@ export default class ChatDrawerRoutesChannels extends Component {
|
|||
@service chatStateManager;
|
||||
|
||||
<template>
|
||||
<div class="c-drawer-routes --channels">
|
||||
<Navbar @onClick={{this.chat.toggleDrawer}} as |navbar|>
|
||||
<navbar.Title @title={{i18n "chat.heading"}} />
|
||||
<navbar.Actions as |a|>
|
||||
|
@ -26,5 +27,6 @@ export default class ChatDrawerRoutesChannels extends Component {
|
|||
|
||||
<ChatFooter />
|
||||
{{/if}}
|
||||
</div>
|
||||
</template>
|
||||
}
|
||||
|
|
|
@ -5,11 +5,12 @@ import ChannelsListDirect from "discourse/plugins/chat/discourse/components/chan
|
|||
import Navbar from "discourse/plugins/chat/discourse/components/chat/navbar";
|
||||
import ChatFooter from "discourse/plugins/chat/discourse/components/chat-footer";
|
||||
|
||||
export default class ChatDrawerRoutesChannels extends Component {
|
||||
export default class ChatDrawerRoutesDirectMessages extends Component {
|
||||
@service chat;
|
||||
@service chatStateManager;
|
||||
|
||||
<template>
|
||||
<div class="c-drawer-routes --direct-messages">
|
||||
<Navbar @onClick={{this.chat.toggleDrawer}} as |navbar|>
|
||||
<navbar.Title @title={{i18n "chat.heading"}} />
|
||||
<navbar.Actions as |a|>
|
||||
|
@ -26,5 +27,6 @@ export default class ChatDrawerRoutesChannels extends Component {
|
|||
|
||||
<ChatFooter />
|
||||
{{/if}}
|
||||
</div>
|
||||
</template>
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@ export default class ChatDrawerRoutesThreads extends Component {
|
|||
@service chatStateManager;
|
||||
|
||||
<template>
|
||||
<div class="c-drawer-routes --threads">
|
||||
<Navbar @onClick={{this.chat.toggleDrawer}} as |navbar|>
|
||||
<navbar.Title @title={{i18n "chat.heading"}} />
|
||||
<navbar.Actions as |action|>
|
||||
|
@ -27,5 +28,6 @@ export default class ChatDrawerRoutesThreads extends Component {
|
|||
{{/if}}
|
||||
|
||||
<ChatFooter />
|
||||
</div>
|
||||
</template>
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@ import Component from "@glimmer/component";
|
|||
import { LinkTo } from "@ember/routing";
|
||||
import icon from "discourse-common/helpers/d-icon";
|
||||
import I18n from "I18n";
|
||||
import { FOOTER_NAV_ROUTES } from "discourse/plugins/chat/discourse/lib/chat-constants";
|
||||
|
||||
export default class ChatNavbarBackButton extends Component {
|
||||
get icon() {
|
||||
|
@ -14,11 +13,7 @@ export default class ChatNavbarBackButton extends Component {
|
|||
}
|
||||
|
||||
get targetRoute() {
|
||||
if (FOOTER_NAV_ROUTES.includes(this.args.route)) {
|
||||
return this.args.route;
|
||||
} else {
|
||||
return "chat";
|
||||
}
|
||||
return this.args.route ?? "chat";
|
||||
}
|
||||
|
||||
<template>
|
||||
|
|
|
@ -1,131 +0,0 @@
|
|||
import { cached, tracked } from "@glimmer/tracking";
|
||||
import Component from "@ember/component";
|
||||
import { concat, hash } from "@ember/helper";
|
||||
import { action, computed } from "@ember/object";
|
||||
import didInsert from "@ember/render-modifiers/modifiers/did-insert";
|
||||
import { LinkTo } from "@ember/routing";
|
||||
import { schedule } from "@ember/runloop";
|
||||
import { service } from "@ember/service";
|
||||
import DButton from "discourse/components/d-button";
|
||||
import { INPUT_DELAY } from "discourse-common/config/environment";
|
||||
import i18n from "discourse-common/helpers/i18n";
|
||||
import discourseDebounce from "discourse-common/lib/debounce";
|
||||
import List from "discourse/plugins/chat/discourse/components/chat/list";
|
||||
import ChatModalNewMessage from "discourse/plugins/chat/discourse/components/chat/modal/new-message";
|
||||
import Navbar from "discourse/plugins/chat/discourse/components/chat/navbar";
|
||||
import ChatChannelCard from "discourse/plugins/chat/discourse/components/chat-channel-card";
|
||||
import DcFilterInput from "discourse/plugins/chat/discourse/components/dc-filter-input";
|
||||
|
||||
const TABS = ["all", "open", "closed", "archived"];
|
||||
|
||||
export default class ChatRoutesBrowse extends Component {
|
||||
@service chatApi;
|
||||
@service modal;
|
||||
|
||||
@tracked filter = "";
|
||||
|
||||
@cached
|
||||
get channelsCollection() {
|
||||
return this.chatApi.channels({
|
||||
filter: this.filter,
|
||||
status: this.status,
|
||||
});
|
||||
}
|
||||
|
||||
@computed("siteSettings.chat_allow_archiving_channels")
|
||||
get tabs() {
|
||||
if (this.siteSettings.chat_allow_archiving_channels) {
|
||||
return TABS;
|
||||
} else {
|
||||
return [...TABS].removeObject("archived");
|
||||
}
|
||||
}
|
||||
|
||||
@action
|
||||
showChatNewMessageModal() {
|
||||
this.modal.show(ChatModalNewMessage);
|
||||
}
|
||||
|
||||
@action
|
||||
setFilter(event) {
|
||||
this.filter = event.target.value;
|
||||
discourseDebounce(this.debouncedLoad, INPUT_DELAY);
|
||||
}
|
||||
|
||||
@action
|
||||
debouncedLoad() {
|
||||
this.channelsCollection.load({ limit: 10 });
|
||||
}
|
||||
|
||||
@action
|
||||
focusFilterInput(input) {
|
||||
schedule("afterRender", () => input?.focus());
|
||||
}
|
||||
|
||||
<template>
|
||||
<div class="c-routes-browse">
|
||||
<Navbar as |navbar|>
|
||||
<navbar.BackButton />
|
||||
<navbar.Title @title={{i18n "chat.browse.title"}} />
|
||||
|
||||
<navbar.Actions as |a|>
|
||||
<a.NewChannelButton />
|
||||
</navbar.Actions>
|
||||
</Navbar>
|
||||
|
||||
<div class="chat-browse-view">
|
||||
<div class="chat-browse-view__actions">
|
||||
<nav>
|
||||
<ul class="nav-pills chat-browse-view__filters">
|
||||
{{#each this.tabs as |tab|}}
|
||||
<li class={{concat "chat-browse-view__filter -" tab}}>
|
||||
<LinkTo
|
||||
@route={{concat "chat.browse." tab}}
|
||||
class={{concat "chat-browse-view__filter-link -" tab}}
|
||||
>
|
||||
{{i18n (concat "chat.browse.filter_" tab)}}
|
||||
</LinkTo>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<DcFilterInput
|
||||
{{didInsert this.focusFilterInput}}
|
||||
@filterAction={{this.setFilter}}
|
||||
@icons={{hash right="search"}}
|
||||
@containerClass="filter-input"
|
||||
placeholder={{i18n "chat.browse.filter_input_placeholder"}}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="chat-browse-view__content_wrapper">
|
||||
<div class="chat-browse-view__content">
|
||||
<List
|
||||
@collection={{this.channelsCollection}}
|
||||
class="chat-browse-view__cards"
|
||||
as |list|
|
||||
>
|
||||
<list.Item as |channel|>
|
||||
<ChatChannelCard @channel={{channel}} />
|
||||
</list.Item>
|
||||
|
||||
<list.EmptyState>
|
||||
<span class="empty-state-title">
|
||||
{{i18n "chat.empty_state.title"}}
|
||||
</span>
|
||||
<div class="empty-state-body">
|
||||
<p>{{i18n "chat.empty_state.direct_message"}}</p>
|
||||
<DButton
|
||||
@action={{this.showChatNewMessageModal}}
|
||||
@label="chat.empty_state.direct_message_cta"
|
||||
/>
|
||||
</div>
|
||||
</list.EmptyState>
|
||||
</List>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
}
|
|
@ -125,6 +125,7 @@ export default class ChatRouteChannelInfoMembers extends Component {
|
|||
}
|
||||
|
||||
<template>
|
||||
<div class="c-routes --channel-info-members">
|
||||
{{#if this.site.mobileView}}
|
||||
<LinkTo
|
||||
class="c-back-button"
|
||||
|
@ -196,5 +197,6 @@ export default class ChatRouteChannelInfoMembers extends Component {
|
|||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</template>
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ export default class ChatRoutesChannelInfoNav extends Component {
|
|||
}
|
||||
|
||||
<template>
|
||||
<div class="c-routes --channel-info-nav">
|
||||
{{#if this.showTabs}}
|
||||
<nav class="c-channel-info__nav">
|
||||
<ul class="nav nav-pills">
|
||||
|
@ -43,5 +44,6 @@ export default class ChatRoutesChannelInfoNav extends Component {
|
|||
</ul>
|
||||
</nav>
|
||||
{{/if}}
|
||||
</div>
|
||||
</template>
|
||||
}
|
||||
|
|
|
@ -327,6 +327,7 @@ export default class ChatRouteChannelInfoSettings extends Component {
|
|||
}
|
||||
|
||||
<template>
|
||||
<div class="c-routes --channel-info-settings">
|
||||
<div class="c-channel-settings">
|
||||
<ChatForm as |form|>
|
||||
<form.section @title={{this.titleSectionTitle}} as |section|>
|
||||
|
@ -517,7 +518,8 @@ export default class ChatRouteChannelInfoSettings extends Component {
|
|||
{{on
|
||||
"click"
|
||||
(fn
|
||||
this.onToggleThreadingEnabled @channel.threadingEnabled
|
||||
this.onToggleThreadingEnabled
|
||||
@channel.threadingEnabled
|
||||
)
|
||||
}}
|
||||
/>
|
||||
|
@ -602,5 +604,6 @@ export default class ChatRouteChannelInfoSettings extends Component {
|
|||
</form.section>
|
||||
</ChatForm>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@ export default class ChatRoutesChannelInfo extends Component {
|
|||
}
|
||||
|
||||
<template>
|
||||
<div class="c-routes-channel-info">
|
||||
<div class="c-routes --channel-info">
|
||||
<Navbar as |navbar|>
|
||||
{{#if this.chatChannelInfoRouteOriginManager.isBrowse}}
|
||||
<navbar.BackButton
|
||||
|
|
|
@ -14,7 +14,7 @@ export default class ChatRoutesChannelThread extends Component {
|
|||
}
|
||||
|
||||
<template>
|
||||
<div class="c-routes-channel-thread">
|
||||
<div class="c-routes --channel-thread">
|
||||
{{#each (array @thread) as |thread|}}
|
||||
<ThreadHeader
|
||||
@thread={{thread}}
|
||||
|
|
|
@ -2,7 +2,7 @@ import ChatThreadListHeader from "discourse/plugins/chat/discourse/components/ch
|
|||
import ChatThreadList from "discourse/plugins/chat/discourse/components/chat-thread-list";
|
||||
|
||||
const ChatRoutesChannelThreads = <template>
|
||||
<div class="c-routes-channel-threads">
|
||||
<div class="c-routes --channel-threads">
|
||||
<ChatThreadListHeader @channel={{@channel}} />
|
||||
<ChatThreadList @channel={{@channel}} @includeHeader={{true}} />
|
||||
</div>
|
||||
|
|
|
@ -14,7 +14,7 @@ export default class ChatRoutesChannel extends Component {
|
|||
}
|
||||
|
||||
<template>
|
||||
<div class="c-routes-channel">
|
||||
<div class="c-routes --channel">
|
||||
<Navbar as |navbar|>
|
||||
{{#if this.site.mobileView}}
|
||||
<navbar.BackButton @route={{this.getChannelsRoute}} />
|
||||
|
|
|
@ -8,7 +8,7 @@ export default class ChatRoutesChannels extends Component {
|
|||
@service site;
|
||||
|
||||
<template>
|
||||
<div class="c-routes-channels">
|
||||
<div class="c-routes --channels">
|
||||
<Navbar as |navbar|>
|
||||
<navbar.Title @title={{i18n "chat.chat_channels"}} />
|
||||
<navbar.Actions as |action|>
|
||||
|
|
|
@ -8,7 +8,7 @@ export default class ChatRoutesDirectMessages extends Component {
|
|||
@service site;
|
||||
|
||||
<template>
|
||||
<div class="c-routes-direct-messages">
|
||||
<div class="c-routes --direct-messages">
|
||||
<Navbar as |navbar|>
|
||||
<navbar.Title @title={{i18n "chat.direct_messages.title"}} />
|
||||
<navbar.Actions as |action|>
|
||||
|
|
|
@ -8,7 +8,7 @@ export default class ChatRoutesThreads extends Component {
|
|||
@service site;
|
||||
|
||||
<template>
|
||||
<div class="c-routes-threads">
|
||||
<div class="c-routes --threads">
|
||||
<Navbar as |navbar|>
|
||||
<navbar.Title @title={{i18n "chat.my_threads.title"}} />
|
||||
|
||||
|
|
|
@ -78,10 +78,16 @@ export default class ChatChannelComposer extends Service {
|
|||
|
||||
message.channel.resetDraft(this.currentUser);
|
||||
|
||||
try {
|
||||
await this.router.transitionTo(
|
||||
"chat.channel.thread",
|
||||
...message.thread.routeModels
|
||||
);
|
||||
} catch (e) {
|
||||
if (e.name !== "TransitionAborted") {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
this.threadComposer.focus({ ensureAtEnd: true, refreshHeight: true });
|
||||
} else {
|
||||
|
|
|
@ -1,16 +1,43 @@
|
|||
import { tracked } from "@glimmer/tracking";
|
||||
import Service, { service } from "@ember/service";
|
||||
import ChatDrawerRoutesBrowse from "discourse/plugins/chat/discourse/components/chat/drawer-routes/browse";
|
||||
import ChatDrawerRoutesChannel from "discourse/plugins/chat/discourse/components/chat/drawer-routes/channel";
|
||||
import ChatDrawerRoutesChannelInfoMembers from "discourse/plugins/chat/discourse/components/chat/drawer-routes/channel-info-members";
|
||||
import ChatDrawerRoutesChannelInfoSettings from "discourse/plugins/chat/discourse/components/chat/drawer-routes/channel-info-settings";
|
||||
import ChatDrawerRoutesChannelThread from "discourse/plugins/chat/discourse/components/chat/drawer-routes/channel-thread";
|
||||
import ChatDrawerRoutesChannelThreads from "discourse/plugins/chat/discourse/components/chat/drawer-routes/channel-threads";
|
||||
import ChatDrawerRoutesChannels from "discourse/plugins/chat/discourse/components/chat/drawer-routes/channels";
|
||||
import ChatDrawerRoutesDirectMessages from "discourse/plugins/chat/discourse/components/chat/drawer-routes/direct-messages";
|
||||
import ChatDrawerRoutesMembers from "discourse/plugins/chat/discourse/components/chat/drawer-routes/members";
|
||||
import ChatDrawerRoutesSettings from "discourse/plugins/chat/discourse/components/chat/drawer-routes/settings";
|
||||
import ChatDrawerRoutesThreads from "discourse/plugins/chat/discourse/components/chat/drawer-routes/threads";
|
||||
|
||||
const ROUTES = {
|
||||
chat: { name: ChatDrawerRoutesChannels },
|
||||
"chat.index": { name: ChatDrawerRoutesChannels },
|
||||
// order matters, non index before index
|
||||
"chat.browse": {
|
||||
name: ChatDrawerRoutesBrowse,
|
||||
extractParams: () => ({ currentTab: "all" }),
|
||||
},
|
||||
"chat.browse.index": {
|
||||
name: ChatDrawerRoutesBrowse,
|
||||
extractParams: () => ({ currentTab: "all" }),
|
||||
},
|
||||
"chat.browse.open": {
|
||||
name: ChatDrawerRoutesBrowse,
|
||||
extractParams: (r) => ({ currentTab: r.localName }),
|
||||
},
|
||||
"chat.browse.archived": {
|
||||
name: ChatDrawerRoutesBrowse,
|
||||
extractParams: (r) => ({ currentTab: r.localName }),
|
||||
},
|
||||
"chat.browse.closed": {
|
||||
name: ChatDrawerRoutesBrowse,
|
||||
extractParams: (r) => ({ currentTab: r.localName }),
|
||||
},
|
||||
"chat.browse.all": {
|
||||
name: ChatDrawerRoutesBrowse,
|
||||
extractParams: (r) => ({ currentTab: r.localName }),
|
||||
},
|
||||
"chat.channels": { name: ChatDrawerRoutesChannels },
|
||||
"chat.channel": { name: ChatDrawerRoutesChannel },
|
||||
"chat.channel.index": { name: ChatDrawerRoutesChannel },
|
||||
|
@ -56,7 +83,6 @@ const ROUTES = {
|
|||
"chat.threads": {
|
||||
name: ChatDrawerRoutesThreads,
|
||||
},
|
||||
chat: { name: ChatDrawerRoutesChannels },
|
||||
"chat.channel.near-message": {
|
||||
name: ChatDrawerRoutesChannel,
|
||||
extractParams: (route) => {
|
||||
|
@ -76,7 +102,7 @@ const ROUTES = {
|
|||
},
|
||||
},
|
||||
"chat.channel.info.settings": {
|
||||
name: ChatDrawerRoutesSettings,
|
||||
name: ChatDrawerRoutesChannelInfoSettings,
|
||||
extractParams: (route) => {
|
||||
return {
|
||||
channelId: route.parent.params.channelId,
|
||||
|
@ -84,7 +110,7 @@ const ROUTES = {
|
|||
},
|
||||
},
|
||||
"chat.channel.info.members": {
|
||||
name: ChatDrawerRoutesMembers,
|
||||
name: ChatDrawerRoutesChannelInfoMembers,
|
||||
extractParams: (route) => {
|
||||
return {
|
||||
channelId: route.parent.params.channelId,
|
||||
|
|
|
@ -1 +1 @@
|
|||
<Chat::Routes::Browse @status="all" />
|
||||
<BrowseChannels @currentTab="all" />
|
|
@ -1 +1 @@
|
|||
<Chat::Routes::Browse @status="archived" />
|
||||
<BrowseChannels @currentTab="archived" />
|
|
@ -1 +1 @@
|
|||
<Chat::Routes::Browse @status="closed" />
|
||||
<BrowseChannels @currentTab="closed" />
|
|
@ -1 +1 @@
|
|||
<Chat::Routes::Browse @status="open" />
|
||||
<BrowseChannels @currentTab="open" />
|
|
@ -1 +1,13 @@
|
|||
{{outlet}}
|
||||
<div class="c-routes --browse">
|
||||
<Chat::Navbar as |navbar|>
|
||||
<navbar.BackButton />
|
||||
<navbar.Title @title={{i18n "chat.browse.title"}} />
|
||||
|
||||
<navbar.Actions as |a|>
|
||||
<a.NewChannelButton />
|
||||
<a.OpenDrawerButton />
|
||||
</navbar.Actions>
|
||||
</Chat::Navbar>
|
||||
|
||||
{{outlet}}
|
||||
</div>
|
|
@ -35,6 +35,16 @@
|
|||
justify-content: space-between;
|
||||
align-items: end;
|
||||
|
||||
.c-drawer-routes.--browse & {
|
||||
flex-direction: column;
|
||||
gap: 1rem;
|
||||
align-items: flex-start;
|
||||
|
||||
.filter-input {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
@include breakpoint(tablet) {
|
||||
flex-direction: column;
|
||||
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
.c-drawer-routes {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex: 1 0 auto;
|
||||
height: 100%;
|
||||
}
|
|
@ -2,6 +2,7 @@
|
|||
@import "chat-height-mixin";
|
||||
@import "base-common";
|
||||
@import "sidebar-extensions";
|
||||
@import "chat-drawer-routes";
|
||||
@import "chat-browse";
|
||||
@import "chat-channel";
|
||||
@import "chat-channel-card";
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.c-navbar-container {
|
||||
.chat-drawer &,
|
||||
.c-routes-channel-thread &,
|
||||
.c-routes-channel-info & {
|
||||
.c-routes-channel.--thread &,
|
||||
.c-routes-channel.--info & {
|
||||
padding-inline: 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@ html.has-full-page-chat {
|
|||
&.has-side-panel-expanded {
|
||||
grid-template-columns: 1fr;
|
||||
|
||||
.c-routes-channel {
|
||||
.c-routes.--channel {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,9 +8,9 @@
|
|||
}
|
||||
}
|
||||
|
||||
.c-routes-direct-messages,
|
||||
.c-routes-channels,
|
||||
.c-routes-threads {
|
||||
.c-routes.--direct-messages,
|
||||
.c-routes.--channels,
|
||||
.c-routes.--threads {
|
||||
background: var(--primary-very-low);
|
||||
max-width: 100vw;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
.chat-message-thread-indicator {
|
||||
.c-routes-threads & {
|
||||
.c-routes.--threads & {
|
||||
background: var(--secondary);
|
||||
}
|
||||
grid-template-areas:
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
RSpec.describe "Drawer - Browse", type: :system do
|
||||
fab!(:current_user) { Fabricate(:user) }
|
||||
|
||||
let(:drawer_page) { PageObjects::Pages::ChatDrawer.new }
|
||||
|
||||
fab!(:channel_1) { Fabricate(:chat_channel) }
|
||||
|
||||
before do
|
||||
chat_system_bootstrap
|
||||
sign_in(current_user)
|
||||
end
|
||||
|
||||
it "can change status" do
|
||||
drawer_page.visit_browse
|
||||
|
||||
expect(drawer_page.browse).to have_channel(name: channel_1.name)
|
||||
|
||||
drawer_page.browse.change_status("closed")
|
||||
|
||||
expect(drawer_page.browse).to have_no_channel(name: channel_1.name)
|
||||
end
|
||||
end
|
|
@ -42,4 +42,13 @@ RSpec.describe "Drawer - index", type: :system do
|
|||
|
||||
expect(row).to be_non_existent
|
||||
end
|
||||
|
||||
it "can open browse" do
|
||||
channel = Fabricate(:chat_channel)
|
||||
|
||||
drawer_page.visit_index
|
||||
drawer_page.channels_index.open_browse
|
||||
|
||||
expect(drawer_page.browse).to have_channel(name: channel.name)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -9,8 +9,8 @@ describe "Using #hashtag autocompletion to search for and lookup channels", type
|
|||
fab!(:topic)
|
||||
fab!(:post) { Fabricate(:post, topic: topic) }
|
||||
fab!(:message1) { Fabricate(:chat_message, chat_channel: channel1) }
|
||||
|
||||
let(:chat_page) { PageObjects::Pages::Chat.new }
|
||||
let(:chat_drawer_page) { PageObjects::Pages::ChatDrawer.new }
|
||||
let(:chat_channel_page) { PageObjects::Pages::ChatChannel.new }
|
||||
let(:topic_page) { PageObjects::Pages::Topic.new }
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ RSpec.describe "Message notifications - mobile", type: :system, mobile: true do
|
|||
|
||||
let!(:chat_page) { PageObjects::Pages::Chat.new }
|
||||
let!(:chat_channel_page) { PageObjects::Pages::ChatChannel.new }
|
||||
let!(:channel_index_page) { PageObjects::Components::Chat::ChannelIndex.new }
|
||||
let!(:channels_index_page) { PageObjects::Components::Chat::ChannelsIndex.new }
|
||||
|
||||
before do
|
||||
SiteSetting.navigation_menu = "sidebar"
|
||||
|
@ -35,7 +35,7 @@ RSpec.describe "Message notifications - mobile", type: :system, mobile: true do
|
|||
create_message(channel_1, user: user_1)
|
||||
|
||||
expect(page).to have_no_css(".chat-header-icon .chat-channel-unread-indicator")
|
||||
expect(page).to have_no_css(channel_index_page.channel_row_selector(channel_1))
|
||||
expect(page).to have_no_css(channels_index_page.channel_row_selector(channel_1))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -73,7 +73,7 @@ RSpec.describe "Message notifications - mobile", type: :system, mobile: true do
|
|||
create_message(channel_1, user: user_1)
|
||||
|
||||
expect(page).to have_no_css(".chat-header-icon .chat-channel-unread-indicator")
|
||||
expect(channel_index_page).to have_no_unread_channel(channel_1)
|
||||
expect(channels_index_page).to have_no_unread_channel(channel_1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -85,7 +85,7 @@ RSpec.describe "Message notifications - mobile", type: :system, mobile: true do
|
|||
create_message(channel_1, user: user_1)
|
||||
|
||||
expect(page).to have_css(".chat-header-icon .chat-channel-unread-indicator", text: "")
|
||||
expect(channel_index_page).to have_unread_channel(channel_1)
|
||||
expect(channels_index_page).to have_unread_channel(channel_1)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -102,7 +102,7 @@ RSpec.describe "Message notifications - mobile", type: :system, mobile: true do
|
|||
)
|
||||
|
||||
expect(page).to have_css(".chat-header-icon .chat-channel-unread-indicator")
|
||||
expect(channel_index_page).to have_unread_channel(channel_1, count: 1)
|
||||
expect(channels_index_page).to have_unread_channel(channel_1, count: 1)
|
||||
end
|
||||
|
||||
it "shows correct count when there are multiple messages but only 1 is urgent" do
|
||||
|
@ -122,7 +122,7 @@ RSpec.describe "Message notifications - mobile", type: :system, mobile: true do
|
|||
".chat-header-icon .chat-channel-unread-indicator",
|
||||
text: "1",
|
||||
)
|
||||
expect(channel_index_page).to have_unread_channel(channel_1, count: 1)
|
||||
expect(channels_index_page).to have_unread_channel(channel_1, count: 1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -147,7 +147,7 @@ RSpec.describe "Message notifications - mobile", type: :system, mobile: true do
|
|||
text: "1",
|
||||
wait: 25,
|
||||
)
|
||||
expect(channel_index_page).to have_unread_channel(dm_channel_1, wait: 25)
|
||||
expect(channels_index_page).to have_unread_channel(dm_channel_1, wait: 25)
|
||||
|
||||
create_message(dm_channel_1, user: user_1)
|
||||
|
||||
|
@ -198,13 +198,13 @@ RSpec.describe "Message notifications - mobile", type: :system, mobile: true do
|
|||
create_message(channel_1, user: user_1)
|
||||
|
||||
expect(page).to have_css(".chat-header-icon .chat-channel-unread-indicator", text: "")
|
||||
expect(channel_index_page).to have_unread_channel(channel_1)
|
||||
expect(channels_index_page).to have_unread_channel(channel_1)
|
||||
|
||||
visit("/chat/direct-messages")
|
||||
|
||||
create_message(dm_channel_1, user: user_1)
|
||||
|
||||
expect(channel_index_page).to have_unread_channel(dm_channel_1)
|
||||
expect(channels_index_page).to have_unread_channel(dm_channel_1)
|
||||
expect(page).to have_css(".chat-header-icon .chat-channel-unread-indicator", text: "1")
|
||||
end
|
||||
end
|
||||
|
|
|
@ -305,25 +305,13 @@ RSpec.describe "Navigation", type: :system do
|
|||
end
|
||||
end
|
||||
|
||||
context "when opening browse page from drawer in drawer mode" do
|
||||
it "opens browser page in full page" do
|
||||
visit("/")
|
||||
chat_page.open_from_header
|
||||
chat_drawer_page.open_browse
|
||||
|
||||
expect(page).to have_current_path("/chat/browse/open")
|
||||
expect(page).not_to have_css(".chat-drawer.is-expanded")
|
||||
end
|
||||
end
|
||||
|
||||
context "when opening browse page from sidebar in drawer mode" do
|
||||
it "opens browser page in full page" do
|
||||
visit("/")
|
||||
chat_page.open_from_header
|
||||
sidebar_page.open_browse
|
||||
|
||||
expect(page).to have_current_path("/chat/browse/open")
|
||||
expect(page).not_to have_css(".chat-drawer.is-expanded")
|
||||
expect(chat_drawer_page.browse).to have_channel(name: category_channel.name)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -3,8 +3,19 @@
|
|||
module PageObjects
|
||||
module Pages
|
||||
class ChatBrowse < PageObjects::Pages::Base
|
||||
SELECTOR = ".c-routes.--browse"
|
||||
|
||||
def initialize(context = SELECTOR)
|
||||
@context = context
|
||||
end
|
||||
|
||||
def component
|
||||
find(".chat-browse-view")
|
||||
find("#{@context} .chat-browse-view")
|
||||
end
|
||||
|
||||
def change_status(status = "all")
|
||||
component.find(".chat-browse-view__filter.-#{status}").click
|
||||
has_finished_loading?
|
||||
end
|
||||
|
||||
def has_finished_loading?
|
|
@ -4,11 +4,11 @@ module PageObjects
|
|||
module Pages
|
||||
class ChatChannelThreads < PageObjects::Pages::Base
|
||||
def close
|
||||
find(".c-routes-channel-threads .c-navbar__close-threads-button").click
|
||||
find(".c-routes.--channel-threads .c-navbar__close-threads-button").click
|
||||
end
|
||||
|
||||
def back
|
||||
find(".c-routes-channel-threads .c-navbar__back-button").click
|
||||
find(".c-routes.--channel-threads .c-navbar__back-button").click
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -17,7 +17,7 @@ module PageObjects
|
|||
end
|
||||
|
||||
def header
|
||||
@header ||= PageObjects::Components::Chat::ThreadHeader.new(".c-routes-channel-thread")
|
||||
@header ||= PageObjects::Components::Chat::ThreadHeader.new(".c-routes.--channel-thread")
|
||||
end
|
||||
|
||||
def notifications_button
|
||||
|
|
|
@ -3,10 +3,10 @@
|
|||
module PageObjects
|
||||
module Components
|
||||
module Chat
|
||||
class ChannelIndex < PageObjects::Components::Base
|
||||
class ChannelsIndex < PageObjects::Components::Base
|
||||
attr_reader :context
|
||||
|
||||
SELECTOR = ".channels-list-container"
|
||||
SELECTOR = ".c-drawer-routes.--channels"
|
||||
|
||||
def initialize(context = nil)
|
||||
@context = context
|
||||
|
@ -17,6 +17,10 @@ module PageObjects
|
|||
find(context).find(SELECTOR)
|
||||
end
|
||||
|
||||
def open_browse
|
||||
component.find(".open-browse-page-btn").click
|
||||
end
|
||||
|
||||
def open_channel(channel)
|
||||
component.find("#{channel_row_selector(channel)}").click
|
||||
end
|
|
@ -5,7 +5,7 @@ module PageObjects
|
|||
class UserThreads < PageObjects::Pages::Base
|
||||
def has_threads?(count: nil)
|
||||
has_no_css?(".spinner")
|
||||
has_css?(".c-user-thread", count: count)
|
||||
has_css?(".c-user-thread", count: count, visible: :all)
|
||||
end
|
||||
|
||||
def open_thread(thread)
|
||||
|
|
|
@ -5,8 +5,12 @@ module PageObjects
|
|||
class ChatDrawer < PageObjects::Pages::Base
|
||||
VISIBLE_DRAWER = ".chat-drawer.is-expanded"
|
||||
|
||||
def channel_index
|
||||
@channel_index ||= ::PageObjects::Components::Chat::ChannelIndex.new(VISIBLE_DRAWER)
|
||||
def channels_index
|
||||
@channels_index ||= ::PageObjects::Components::Chat::ChannelsIndex.new(VISIBLE_DRAWER)
|
||||
end
|
||||
|
||||
def browse
|
||||
@browse ||= ::PageObjects::Pages::ChatBrowse.new(".c-drawer-routes.--browse")
|
||||
end
|
||||
|
||||
def open_browse
|
||||
|
@ -34,17 +38,22 @@ module PageObjects
|
|||
open_channel(channel)
|
||||
end
|
||||
|
||||
def visit_browse
|
||||
visit_index
|
||||
open_browse
|
||||
end
|
||||
|
||||
def open_channel(channel)
|
||||
channel_index.open_channel(channel)
|
||||
channels_index.open_channel(channel)
|
||||
has_no_css?(".chat-skeleton")
|
||||
end
|
||||
|
||||
def has_unread_channel?(channel)
|
||||
channel_index.has_unread_channel?(channel)
|
||||
channels_index.has_unread_channel?(channel)
|
||||
end
|
||||
|
||||
def has_no_unread_channel?(channel)
|
||||
channel_index.has_no_unread_channel?(channel)
|
||||
channels_index.has_no_unread_channel?(channel)
|
||||
end
|
||||
|
||||
def has_user_threads_section?
|
||||
|
|
|
@ -102,7 +102,7 @@ describe "Single thread in side panel", type: :system do
|
|||
it "doesn’t show back button " do
|
||||
chat_page.visit_thread(thread)
|
||||
|
||||
expect(page).to have_no_css(".c-routes-channel-thread .c-navbar__back-button")
|
||||
expect(page).to have_no_css(".c-routes.--channel-thread .c-navbar__back-button")
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in New Issue