Skip to content

Commit b0b7e83

Browse files
UX: add welcome banner page visibility setting (#34119)
Enhances customizability of the core welcome banner by adding an Interface setting: *page visibility* to the core welcome banner. This allows us to replace [advanced search banner](https://meta.discourse.org/t/advanced-search-banner/122939). --------- Co-authored-by: Martin Brennan <martin@discourse.org>
1 parent 16be391 commit b0b7e83

File tree

9 files changed

+117
-15
lines changed

9 files changed

+117
-15
lines changed

app/assets/javascripts/discourse/app/components/welcome-banner.gjs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import SearchMenu from "discourse/components/search-menu";
99
import bodyClass from "discourse/helpers/body-class";
1010
import concatClass from "discourse/helpers/concat-class";
1111
import { prioritizeNameFallback } from "discourse/lib/settings";
12+
import { defaultHomepage } from "discourse/lib/utilities";
1213
import I18n, { i18n } from "discourse-i18n";
1314

1415
export default class WelcomeBanner extends Component {
@@ -49,11 +50,25 @@ export default class WelcomeBanner extends Component {
4950
});
5051

5152
get displayForRoute() {
52-
return this.siteSettings.top_menu
53-
.split("|")
54-
.any(
55-
(menuItem) => `discovery.${menuItem}` === this.router.currentRouteName
56-
);
53+
switch (this.siteSettings.welcome_banner_page_visibility) {
54+
case "top_menu_pages":
55+
return this.siteSettings.top_menu
56+
.split("|")
57+
.any(
58+
(menuItem) =>
59+
`discovery.${menuItem}` === this.router.currentRouteName
60+
);
61+
case "homepage":
62+
return (
63+
this.router.currentRouteName === `discovery.${defaultHomepage()}`
64+
);
65+
case "discovery":
66+
return this.router.currentRouteName.startsWith("discovery.");
67+
case "all_pages":
68+
return true;
69+
default:
70+
return false;
71+
}
5772
}
5873

5974
get headerText() {
@@ -91,7 +106,7 @@ export default class WelcomeBanner extends Component {
91106
}
92107

93108
get locationClass() {
94-
return `--${dasherize(this.siteSettings.welcome_banner_location)}`;
109+
return `--location-${dasherize(this.siteSettings.welcome_banner_location)}`;
95110
}
96111

97112
<template>

app/assets/javascripts/discourse/tests/integration/components/welcome-banner-test.gjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ module(
1818
test("applies the welcome_banner_location CSS class", async function (assert) {
1919
this.siteSettings.welcome_banner_location = "above_topic_content";
2020
await render(<template><WelcomeBanner /></template>);
21-
assert.dom(".welcome-banner.--above-topic-content").exists();
21+
assert.dom(".welcome-banner.--location-above-topic-content").exists();
2222

2323
this.siteSettings.welcome_banner_location = "below_site_header";
2424
await render(<template><WelcomeBanner /></template>);
25-
assert.dom(".welcome-banner.--below-site-header").exists();
25+
assert.dom(".welcome-banner.--location-below-site-header").exists();
2626
});
2727

2828
test("shows the logged in user message with the user's username", async function (assert) {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# frozen_string_literal: true
2+
3+
require "enum_site_setting"
4+
5+
class WelcomeBannerPageVisibility < EnumSiteSetting
6+
def self.valid_value?(val)
7+
values.any? { |v| v[:value].to_s == val.to_s }
8+
end
9+
10+
def self.values
11+
@values ||= [
12+
{ name: "welcome_banner_page_visibility.top_menu_pages", value: "top_menu_pages" },
13+
{ name: "welcome_banner_page_visibility.homepage", value: "homepage" },
14+
{ name: "welcome_banner_page_visibility.discovery", value: "discovery" },
15+
{ name: "welcome_banner_page_visibility.all_pages", value: "all_pages" },
16+
]
17+
end
18+
19+
def self.translate_names?
20+
true
21+
end
22+
end

config/locales/client.en.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2785,6 +2785,11 @@ en:
27852785
welcome_banner_location:
27862786
above_topic_content: "Above topic content"
27872787
below_site_header: "Below site header"
2788+
welcome_banner_page_visibility:
2789+
top_menu_pages: "Top menu pages"
2790+
homepage: "Homepage"
2791+
discovery: "Discovery"
2792+
all_pages: "All pages"
27882793
composition_mode:
27892794
markdown: "Markdown"
27902795
rich: "Rich text"

config/locales/server.en.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2718,6 +2718,7 @@ en:
27182718
show_topic_map_in_topics_without_replies: "Shows the topic map even if the topic has no replies."
27192719
enable_welcome_banner: "Display a banner on your main topic list pages to welcome members and allow them to search site content"
27202720
welcome_banner_location: "Determines where on the page the welcome banner will appear."
2721+
welcome_banner_page_visibility: "Determines on which pages the welcome banner will appear."
27212722

27222723
splash_screen: "Displays a temporary loading screen while site assets load"
27232724
navigation_menu: "Specify sidebar or header dropdown as the main navigation menu for your site. Sidebar is recommended."

config/site_settings.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3678,6 +3678,12 @@ uncategorized:
36783678
default: "above_topic_content"
36793679
area: "interface"
36803680

3681+
welcome_banner_page_visibility:
3682+
client: true
3683+
enum: "WelcomeBannerPageVisibility"
3684+
default: "top_menu_pages"
3685+
area: "interface"
3686+
36813687
user_preferences:
36823688
default_email_digest_frequency:
36833689
enum: "DigestEmailSiteSetting"

spec/system/page_objects/components/welcome_banner.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,11 @@ def has_logged_in_subheader?
4949
end
5050

5151
def above_topic_content?
52-
has_css?("#main-outlet > .--above-topic-content", visible: :visible)
52+
has_css?("#main-outlet > .--location-above-topic-content", visible: :visible)
5353
end
5454

5555
def below_site_header?
56-
has_css?(".discourse-root > .--below-site-header", visible: :visible)
56+
has_css?(".discourse-root > .--location-below-site-header", visible: :visible)
5757
end
5858
end
5959
end

spec/system/welcome_banner_spec.rb

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,59 @@
159159
expect(banner).to be_below_site_header
160160
end
161161
end
162+
163+
context "with interface page visibility setting" do
164+
before { current_user.update!(admin: true) }
165+
166+
it "should show on all pages" do
167+
SiteSetting.welcome_banner_page_visibility = "all_pages"
168+
169+
visit "/"
170+
expect(banner).to be_visible
171+
sign_in(current_user)
172+
%W[/ /u/#{current_user.username}/preferences/emails /my/messages].each do |path|
173+
visit path
174+
expect(banner).to be_visible
175+
end
176+
end
177+
178+
it "should show on discovery routes only" do
179+
sign_in(current_user)
180+
SiteSetting.welcome_banner_page_visibility = "discovery"
181+
182+
visit "/filter?q=tag%3Ain-progress"
183+
expect(banner).to be_visible
184+
185+
visit "/upcoming-events?view=month"
186+
expect(banner).to be_hidden
187+
end
188+
189+
it "should show on top menu pages only" do
190+
sign_in(current_user)
191+
SiteSetting.welcome_banner_page_visibility = "top_menu_pages"
192+
SiteSetting
193+
.top_menu
194+
.split("|")
195+
.each do |route|
196+
visit "/#{route}"
197+
expect(banner).to be_visible
198+
end
199+
200+
visit "/my/posts"
201+
expect(banner).to be_hidden
202+
end
203+
204+
it "should show on homepage only" do
205+
SiteSetting.welcome_banner_page_visibility = "homepage"
206+
207+
visit "/"
208+
expect(banner).to be_visible
209+
210+
sign_in(current_user)
211+
visit "/new"
212+
expect(banner).to be_hidden
213+
end
214+
end
162215
end
163216

164217
context "when disabled" do

themes/horizon/scss/welcome-banner.scss

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
@use "lib/viewport";
22

33
.welcome-banner {
4-
&.--below-site-header {
4+
&.--location-below-site-header {
55
background-color: var(--background-color);
66
border-radius: 0;
77

@@ -37,7 +37,7 @@
3737
margin-top: 0;
3838
}
3939

40-
.--below-site-header & {
40+
.--location-below-site-header & {
4141
border-bottom: 0;
4242
padding: var(--space-4) var(--space-4) var(--space-8);
4343

@@ -50,7 +50,7 @@
5050
}
5151
}
5252

53-
.--above-topic-content & {
53+
.--location-above-topic-content & {
5454
@container (width <= 800px) {
5555
flex-direction: column;
5656
gap: var(--space-4);
@@ -65,7 +65,7 @@
6565
width: 100%;
6666
align-self: center;
6767

68-
.--above-topic-content & {
68+
.--location-above-topic-content & {
6969
@container (width >= 800px) {
7070
width: 50cqw;
7171
}
@@ -113,7 +113,7 @@
113113
margin: 0;
114114
color: var(--search-color);
115115

116-
.--above-topic-content & {
116+
.--location-above-topic-content & {
117117
@container (width >= 800px) {
118118
flex-grow: 1;
119119
}

0 commit comments

Comments
 (0)